Arduino Examples for Command Packets w/CRC and direct commands to CFA835 over serial?

xmishka

New member
Hi everyone. I am fairly new to this and need some help getting my CFA835 up and running. I have it hooked up to the serial interface on my arduino and can get the cftest app to work but I am having some issues with sending commands from the arduino itself. I am not sure what the correct way to do this is. Should I build a packet and send it? How to I do this? Can I send simple commands via Serial.write((byte)0) - I tried this but I can't get it to work? I was wondering if someone has some simple arduino sketches with examples of writing text, drawing, creating bar graphs, playing video?
Looking for additional LCD resources? Check out our LCD blog for the latest developments in LCD technology.
 

CF Mark

Administrator
Greetings,

This is a very quick example of how to write text to a CFA835 LCD using an Arduino UNO.
Im not too familiar with the Arduino's, so you may need to modify the source code a bit (ie, TX/RX pin numbers) for it to work with your board.

Code:
/*
 Crystalfontz CFA835 Serial Interfacing Example.
 
 Hardware connection:
 * Connect the serial RX pin on the Arduino to the serial
     TX pin on the CFA835 (pin 2 on the H1 connector).
 * Connect the serial TX pin on the Arduino to the serial
     RX pin on the CFA835 (pin 1 on the H1 connector).   
 * Connect GND on the Ardunio to GND on the CFA835 (pin 15
     on the H1 connector, or any of the other GND points).

 See the Arduino manual for the appropriate RX & TX pins
 for your specific board.
 The example below was tested on an Arduino UNO.
 
 CFA835 Setup:
 The CFA835 serial port needs to be setup for 9600 baud.
 * Plug the CFA835 into your PC's USB port.
 * Run cfTest, and connect to the CFA835
 * Select "Interface Options" in the "Packet Type" list.
 * Enter "\000\047\002" in the Data entry box (no quotes)
     and click the "Send Packet" button. You should see
     a "33 (ack)" "NO DATA" in the Packet Flow list which
     means the CFA835 has now set the new serial port
     options.

*/

#include <SoftwareSerial.h>
#include <util/crc16.h>

//arduino serial pins
#define RX_PIN 8
#define TX_PIN 9

//////////////////////////////

typedef struct
{
  uint8_t   command;
  uint8_t   length;
  uint8_t   data[24];
  uint16_t  crc;
} CFPacket_t;

class CrystalfontzPacketLCD
{
public:
  //vars
  //functions
  CrystalfontzPacketLCD(SoftwareSerial *serialPort);
  void sendPacket(CFPacket_t *packet);
  void writeText(uint8_t x, uint8_t y, char *text, uint8_t length);
  void clearScreen(void);

private:
  //vars
  SoftwareSerial  *port;
  //functions
  uint16_t CRC(uint8_t *ptr, uint16_t len);
};


//////////////////////////////

CrystalfontzPacketLCD::CrystalfontzPacketLCD(SoftwareSerial *serialPort)
{
  //save the serial port
  port = serialPort;
}

void CrystalfontzPacketLCD::sendPacket(CFPacket_t *packet)
{
  //calculate the crc
  packet->crc = CRC((uint8_t*)packet, packet->length+2);
  
  //send the packet in sections
  port->write(packet->command);  
  port->write(packet->length);
  port->write(packet->data, packet->length);
  port->write((uint8_t*)&packet->crc, 2);
}


void CrystalfontzPacketLCD::writeText(uint8_t x, uint8_t y, char *text, uint8_t length)
{
  CFPacket_t  packet;
  
  //setup the packet
  packet.command = 31;
  packet.length = length + 2;
  packet.data[0] = x;
  packet.data[1] = y;
  memcpy(packet.data + 2, text, length);
  
  //send the packet
  sendPacket(&packet);
}

void CrystalfontzPacketLCD::clearScreen(void)
{
  CFPacket_t  packet;
  
  //setup the packet
  packet.command = 6;
  packet.length = 0;

  //send the packet
  sendPacket(&packet);
}

uint16_t CrystalfontzPacketLCD::CRC(uint8_t *data, uint16_t length)
{
  //calculate the CRC for the packet data
  uint16_t crc = 0xFFFF;
  while(length--)
    crc = _crc_ccitt_update(crc, *data++);
  return ~crc;
}

////////////////////////////////////////////

//local variables
SoftwareSerial          *softSerial;
CrystalfontzPacketLCD   *cfPacket;

void setup()
{ 
  //firmware setup
  
  //set LED pin as output
  pinMode(13, OUTPUT);
  
  //setup the serial port pins and SoftwareSerial library
  pinMode(RX_PIN, INPUT);
  pinMode(TX_PIN, OUTPUT);
  softSerial = new SoftwareSerial(RX_PIN, TX_PIN);
  softSerial->begin(9600); //9600 baud
  
  //setup the Crystalfontz serial packet interface
  cfPacket = new CrystalfontzPacketLCD(softSerial);
  
  //init random
  randomSeed(167);
}

void loop()
{
  //the main loop
  
  //clear the LCD display
  cfPacket->clearScreen();
  //write text to a random location on the LCD display
  cfPacket->writeText(random(20-6), random(4), "CF-LCD", 6);
  
  //blink the LED
  digitalWrite(13, HIGH);  
  delay(500);
  digitalWrite(13, LOW);
  delay(500);
}
The C/INO file:
View attachment CFA835_Example1.zip
 
USB LCD Displays - Graphic and Character LCDs with a Keypad
Top