Skip to content

Instantly share code, notes, and snippets.

@zyphlar
Created August 10, 2012 17:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zyphlar/3316070 to your computer and use it in GitHub Desktop.
Save zyphlar/3316070 to your computer and use it in GitHub Desktop.
Arduino code for SkyMotion Mark IV 16x72 RS232 LED matrix sign
#include <SoftwareSerial.h>
uint8_t la[8]={0x00,0x7c,0x44,0x44,0x7c,0x44,0x00,0x00};
uint8_t lb[8]={0x00,0x7c,0x44,0x78,0x44,0x7c,0x00,0x00};
uint8_t lc[8]={0x00,0x7c,0x40,0x40,0x40,0x7c,0x00,0x00};
uint8_t ld[8]={0x00,0x78,0x44,0x44,0x44,0x78,0x00,0x00};
uint8_t le[8]={0x00,0x7c,0x40,0x78,0x40,0x7c,0x00,0x00};
uint8_t lf[8]={0x00,0x7c,0x40,0x70,0x40,0x40,0x00,0x00};
uint8_t lg[8]={0x00,0x7c,0x40,0x4c,0x44,0x7c,0x00,0x00};
uint8_t lh[8]={0x00,0x44,0x44,0x7c,0x44,0x44,0x00,0x00};
uint8_t li[8]={0x00,0x7c,0x10,0x10,0x10,0x7c,0x00,0x00};
uint8_t lj[8]={0x00,0x0c,0x04,0x04,0x44,0x7c,0x00,0x00};
uint8_t lk[8]={0x00,0x44,0x48,0x70,0x48,0x44,0x00,0x00};
uint8_t ll[8]={0x00,0x40,0x40,0x40,0x40,0x7c,0x00,0x00};
uint8_t lm[8]={0x00,0x44,0x6c,0x54,0x44,0x44,0x00,0x00};
uint8_t ln[8]={0x00,0x44,0x64,0x54,0x4c,0x44,0x00,0x00};
uint8_t lo[8]={0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x00};
uint8_t lp[8]={0x00,0x78,0x44,0x78,0x40,0x40,0x00,0x00};
uint8_t lq[8]={0x00,0x7c,0x44,0x44,0x7c,0x10,0x00,0x00};
uint8_t lr[8]={0x00,0x78,0x44,0x78,0x44,0x44,0x00,0x00};
uint8_t ls[8]={0x00,0x7c,0x40,0x7c,0x04,0x7c,0x00,0x00};
uint8_t lt[8]={0x00,0x7c,0x10,0x10,0x10,0x10,0x00,0x00};
uint8_t lu[8]={0x00,0x44,0x44,0x44,0x44,0x7c,0x00,0x00};
uint8_t lv[8]={0x00,0x44,0x44,0x28,0x28,0x10,0x00,0x00};
uint8_t lw[8]={0x00,0x44,0x44,0x54,0x54,0x28,0x00,0x00};
uint8_t lx[8]={0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00};
uint8_t ly[8]={0x00,0x44,0x44,0x28,0x10,0x10,0x00,0x00};
uint8_t lz[8]={0x00,0x7c,0x08,0x10,0x20,0x7c,0x00,0x00};
uint8_t nze[8]={0x00,0x7c,0x4c,0x54,0x64,0x7c,0x00,0x00};
uint8_t non[8]={0x00,0x10,0x30,0x10,0x10,0x38,0x00,0x00};
uint8_t ntw[8]={0x00,0x78,0x04,0x38,0x40,0x7c,0x00,0x00};
uint8_t nth[8]={0x00,0x7c,0x04,0x38,0x04,0x7c,0x00,0x00};
uint8_t nfo[8]={0x00,0x40,0x40,0x50,0x7c,0x10,0x00,0x00};
uint8_t nfi[8]={0x00,0x7c,0x40,0x78,0x04,0x78,0x00,0x00};
uint8_t nsi[8]={0x00,0x7c,0x40,0x7c,0x44,0x7c,0x00,0x00};
uint8_t nse[8]={0x00,0x7c,0x04,0x08,0x10,0x10,0x00,0x00};
uint8_t nei[8]={0x00,0x7c,0x44,0x7c,0x44,0x7c,0x00,0x00};
uint8_t nni[8]={0x00,0x7c,0x44,0x7c,0x04,0x7c,0x00,0x00};
uint8_t sp[8]={0,0,0,0,0,0,0,0};
SoftwareSerial mySerial(2, 3, true);
String lineread;
char output[5];
/* uint8_t a[] = {0x2,0x0,0x1,0x0,0x1,0x3};
uint8_t b[] = {0x2,0x0,0x6,0x7,0xD4,0x9,0x5,0x1B,0xE8,0x1,0x23,0x4,0x1B,0xE7,0xFA,0x0,0x16,0x03};
uint8_t c[] = {0x2,0x0,0x0,0x0,0x0,0x3};
uint8_t d[] = {0x2,0x0,0xA,0x0,0xA,0x3};
uint8_t e[] = {0x2,0x0,0x1A,0x0,0x1A,0x3};
uint8_t f[] = {0x2,0x0,0x1,0x0,0x1,0x3};
uint8_t g[] = {0x2,0x0,0x6,0x7,0xD4,0x09,0x05,0x1B,0xE8,0x01,0x23,0x05,0x00,0x1B,0xE7,0x0,0x1D,0x3};
uint8_t h[] = {0x2,0x0,0x18,0x0,0x18,0x3};
uint8_t i[] = {0x2,0x0,0x1B,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xD4,0x9,0x1B,0xE8,0x07,0xD4,0x0A,0x1B,0xE8,0x0,0x0,0x0,0x17,0x3B,0x3B,0x7F,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x10,0x62,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x64,0x0,0x0,0x34,0x36,0x30,0x30,0x33,0x30,0x30,0x30,0x30,0x30,0x5C,0x42,0x30,0x30,0x5C,0x70,0x0,0x70,0x30,0x30,0x33,0x30,0x30,0x33,0x1,0x70,0x30,0x30,0x33,0x30,0x30,0x33,0x0,0x0,0x70,0x36,0x39,0x36,0x39,0x36,0x39,0x61,0x62,0x1,0x4D,0x0,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1B,0xE8,0x8F,0x0E,0x3C,0x38,0xF0,0x6,0x0,0x1,0x80,0x1C,0x1B,0xE8,0x06,0x36,0x0C,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x38};
uint8_t j[] = {0x2,0x0,0x19,0x44,0x49,0x53,0x50,0x0,0x0,0x0,0x48,0x0,0x10,0x1,0x0,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x50,0x0,0x0,0x58,0x0,0x72,0x3};
*/
uint8_t a[1];
uint8_t b[13];
uint8_t c[1];
uint8_t d[1];
uint8_t e[1];
uint8_t f[1];
uint8_t g[12];
uint8_t h[1];
uint8_t i[262];
uint8_t j[24];
void setup()
{
Serial.begin(57600);
Serial.println("Goodnight moon!");
// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
mySerial.println("Hello, world?");
}
void loop() // run over and over
{
load_message(" welcome to ");
send_data();
load_message("heatsync labs ");
send_data();
}
void send_data() {
array_sw(a, sizeof(a));
ser_print();
array_sw(b, sizeof(b));
ser_print();
array_sw(c, sizeof(c));
ser_print();
array_sw(d, sizeof(d));
ser_print();
array_sw(e, sizeof(e));
ser_print();
array_sw(f, sizeof(f));
ser_print();
array_sw(g, sizeof(g));
ser_print();
array_sw(h, sizeof(h));
ser_print();
array_sw(i, sizeof(i));
ser_print();
array_sw(j, sizeof(j));
ser_print();
}
void load_invert_dot() {
// Inverted dot
a = {0x1};
b = {0x6,0x7,0xD4,0x9,0x5,0x1B,0xE8,0x8,0x17,0x37,0x1B,0xE8,0xE4};
c = {0x0};
d = {0xA};
e = {0x1A};
f = {0x1};
g = {0x6,0x7,0xD4,0x9,0x5,0x1B,0xE8,0x8,0x17,0x38,0x0,0x9C};
h = {0x18};
i = {0x1B,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xD4,0x9,0x1B,0xE8,0x7,0xD4,0xA,0x1B,0xE8,0x0,0x0,0x0,0x17,0x3B,0x3B,0x7F,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x10,0x62,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x64,0x0,0x0,0x30,0x30,0x30,0x30,0x33,0x30,0x30,0x33,0x30,0x30,0x5C,0x42,0x30,0x30,0x5C,0x70,0x0,0x70,0x30,0x30,0x33,0x30,0x30,0x33,0x1,0x70,0x30,0x30,0x33,0x30,0x30,0x33,0x0,0x0,0x70,0x2E,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x48,0x0,0x10,0x0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
j = {0x19,0x44,0x49,0x53,0x50,0x0,0x0,0x0,0x48,0x0,0x10,0x1,0x0,0x0,0x0,0x0,0x0,0x28,0x0,0x0,0x50,0x0,0x0,0x58};
}
void load_dot() {
i = {0x1B,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xD4,0x9,0x1B,0xE8,0x7,0xD4,0xA,0x1B,0xE8,0x0,0x0,0x0,0x17,0x3B,0x3B,0x7F,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x10,0x62,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x64,0x0,0x0,0x30,0x30,0x30,0x30,0x33,0x30,0x30,0x33,0x30,0x30,0x5C,0x42,0x30,0x30,0x5C,0x70,0x0,0x70,0x30,0x30,0x33,0x30,0x30,0x33,0x1,0x70,0x30,0x30,0x33,0x30,0x30,0x33,0x0,0x0,0x70,0x2E,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x48,0x0,0x10,0x0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0x00};
}
void load_stripes() {
i = {0x1B,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xD4,0x9,0x1B,0xE8,0x7,0xD4,0xA,0x1B,0xE8,0x0,0x0,0x0,0x17,0x3B,0x3B,0x7F,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x10,0x62,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x64,0x0,0x0,0x30,0x30,0x30,0x30,0x33,0x30,0x30,0x33,0x30,0x30,0x5C,0x42,0x30,0x30,0x5C,0x70,0x0,0x70,0x30,0x30,0x33,0x30,0x30,0x33,0x1,0x70,0x30,0x30,0x33,0x30,0x30,0x33,0x0,0x0,0x70,0x2E,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x48,0x0,0x10,0x0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //1
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //2
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //3
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //4
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //5
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //6
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //7
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //8
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //9
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //10
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //11
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //12
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //13
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //14
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //15
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; //16
}
void load_message(char textmsg[18]) {
// max size is 262 bytes with 118 bytes of header, leaving 144 bytes for 16x72 (1152 pixels)
// this is the 118 byte header
i = {0x1B,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xD4,0x9,0x1B,0xE8,0x7,0xD4,0xA,0x1B,0xE8,0x0,0x0,0x0,0x17,0x3B,0x3B,0x7F,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x10,0x62,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x64,0x0,0x0,0x30,0x30,0x30,0x30,0x33,0x30,0x30,0x33,0x30,0x30,0x5C,0x42,0x30,0x30,0x5C,0x70,0x0,0x70,0x30,0x30,0x33,0x30,0x30,0x33,0x1,0x70,0x30,0x30,0x33,0x30,0x30,0x33,0x0,0x0,0x70,0x2E,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x48,0x0,0x10,0x0};
uint8_t* message[18];
// convert message to led font
for(int chr=0;chr<18;chr++){
switch(textmsg[chr]) {
case 'a':
message[chr] = la;
break;
case 'b':
message[chr] = lb;
break;
case 'c':
message[chr] = lc;
break;
case 'd':
message[chr] = ld;
break;
case 'e':
message[chr] = le;
break;
case 'f':
message[chr] = lf;
break;
case 'g':
message[chr] = lg;
break;
case 'h':
message[chr] = lh;
break;
case 'i':
message[chr] = li;
break;
case 'j':
message[chr] = lj;
break;
case 'k':
message[chr] = lk;
break;
case 'l':
message[chr] = ll;
break;
case 'm':
message[chr] = lm;
break;
case 'n':
message[chr] = ln;
break;
case 'o':
message[chr] = lo;
break;
case 'p':
message[chr] = lp;
break;
case 'q':
message[chr] = lq;
break;
case 'r':
message[chr] = lr;
break;
case 's':
message[chr] = ls;
break;
case 't':
message[chr] = lt;
break;
case 'u':
message[chr] = lu;
break;
case 'v':
message[chr] = lv;
break;
case 'w':
message[chr] = lw;
break;
case 'x':
message[chr] = lx;
break;
case 'y':
message[chr] = ly;
break;
case 'z':
message[chr] = lz;
break;
case '0':
message[chr] = nze;
break;
case '1':
message[chr] = non;
break;
case '2':
message[chr] = ntw;
break;
case '3':
message[chr] = nth;
break;
case '4':
message[chr] = nfo;
break;
case '5':
message[chr] = nfi;
break;
case '6':
message[chr] = nsi;
break;
case '7':
message[chr] = nse;
break;
case '8':
message[chr] = nei;
break;
case '9':
message[chr] = nni;
break;
case ' ':
message[chr] = sp;
break;
}
}
// for each char in message:
for(int chr=0;chr<18;chr++){
// width is 9 bytes
// each letter occupies 1 byte in width and 8 bytes in height (horizontal scanning)
// max height is 16 lines
// max offset is 118+72+9+63 = 262
int col = chr%9; // col must never exceed 9 bytes
int prerow = chr/9; // if we're on a new row of text...
int row = 72*prerow; // ...shift by 72 (8 lines of 9 bytes)
int ofst = 118+row+col; // also we have an 118 byte offset due to the header
i[ofst] = message[chr][0];
i[ofst+9] = message[chr][1];
i[ofst+18] = message[chr][2];
i[ofst+27] = message[chr][3];
i[ofst+36] = message[chr][4];
i[ofst+45] = message[chr][5];
i[ofst+54] = message[chr][6];
i[ofst+63] = message[chr][7];
}
}
void ser_print(){
Serial.print("RX: {");
while (mySerial.available()) {
lineread = String(mySerial.read(),HEX);
lineread.toCharArray(output,5);
Serial.print("0x");
Serial.print(output);
Serial.print(",");
}
Serial.println("};");
}
void array_sw(uint8_t data[], int datasize) {
Serial.print("TX: {");
uint8_t datasum = 0;
sw(0x2);
sw(0x0);
Serial.print("0x2,0x0,");
for(int i=0;i<datasize;i++){
sw(data[i]);
datasum = datasum+data[i];
Serial.print("0x");
Serial.print(data[i], HEX);
Serial.print(",");
}
sw(0x0);
sw(datasum);
sw(0x3);
Serial.print("0x0,0x");
Serial.print(datasum, HEX);
Serial.print(",0x3");
Serial.println("};");
delay(20);
}
void sw(int hex) {
mySerial.write((uint8_t)hex);
}
void sw(uint8_t hex) {
mySerial.write(hex);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment