#include //#include int dataPin = 11; int clockPin = 13; int latchPin = 10; #define latchPort PORTB byte latchBit = (1<<2); #define COLS 32 #define ROWS 8 #define NUM_MATRIXES (COLS/8)*(ROWS/8) #define STEPS 8 const int STEPCOUNT = 255/STEPS; #define __max_row ROWS-1 #define __max_led COLS-1 //byte current_display[ROWS][COLS][3] = {255,255,255}; byte brightness_red[COLS][ROWS]; byte brightness_green[COLS][ROWS]; byte brightness_blue[COLS][ROWS]; int redVal; int greenVal; int blueVal; int had_msg = 0; void setup() { redVal = 0; greenVal = 0; blueVal = 0; pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV2); Serial.begin(57600); //Serial.buffer((ROWS*COLS) + 2); //MsTimer2::set(12, display); // 500ms period //MsTimer2::start(); } void loop() { /*color_morph(&redVal, 1); // transition to red color_morph(&greenVal, 1); // transition to yellow color_morph(&redVal, 0); // transition to green color_morph(&blueVal, 1); // transition to aqua color_morph(&redVal, 1); // transition to white color_morph(&greenVal, 0); // transition to violet color_morph(&redVal, 0); // transition to blue color_morph(&blueVal, 0); // transition to black (all off)*/ /*for (int i = 0; i < 8; i++) if (Serial.available()) { checkMessages(); delayMicroseconds(300); }*/ display(); //display(); } void serialEvent(){ checkMessages(); } void checkMessages(){ /* Data takes form: * * +---------+----+----+----+----+----+----+----+----+----+-----+----+----+---------+---------+---------+ * | 2 (STX) | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | C1 | C2 | 13 (CR) | 10 (LF) | 3 (ETX) | * +---------+----+----+----+----+----+----+----+----+----+-----+----+----+---------+---------+---------+ * */ char c = Serial.read(); // get the first character while (c != 2){c = Serial.read();} // if its not STX, keep going till it is // (though this is bad!) if (c == 2){ // now that we have STX int val = Serial.read(); while (val == -1){val = Serial.read();} int message = val; if (message == 0) { val = Serial.read(); while (val == -1){val = Serial.read();} int row = val; //delayMicroseconds(00); // let the message time to arrive int col = 0; while (true) { // loop through all new date till we get ETX //byte val = Serial.read(); //scratch += c; //int row = 0; //while (true) { val = Serial.read(); while (val == -1){val = Serial.read();} //if ((val!=0)&&(val<=200)) { // brightness_red[col][row] = map(val, 0, 255, 0, 3000); //} else { brightness_red[col][row] = val/STEPCOUNT; //} val = Serial.read(); while (val == -1){val = Serial.read();} //if ((val!=0)&&(val<=200)) { // brightness_green[col][row] = map(val, 1, 255, 16, 4000); //} else { brightness_green[col][row] = val/STEPCOUNT; //} val = Serial.read(); while (val == -1){val = Serial.read();} //if ((val!=0)&&(val<=200)) { // brightness_blue[col][row] = map(val, 0, 255, 0, 3500); //} else { brightness_blue[col][row] = val/STEPCOUNT; //} //lc.setRow(matrix, row, val); // row++; // if (row>=ROWS) { break; } //} col++; if (col>=COLS) { break; } } //Serial.print("Got a message for matrix"); //Serial.println(matrix); //prepare(); //had_msg = 1; } } if (Serial.available() > 0) checkMessages(); } void color_morph(int* value, int get_brighter) { for (int c = 0; c < 255; c++) { if (get_brighter) (*value)++; else (*value)--; fill_color(); for (int count = 0; count < 5; count++) { display(); } } } void set_led_red(byte row, byte led, byte red) { if( (row > __max_row) || (led > __max_led) ) { return; } brightness_red[led][row] = red; } void set_led_green(byte row, byte led, byte green) { if( (row > __max_row) || (led > __max_led) ) { return; } brightness_green[led][row] = green; } void set_led_blue(byte row, byte led, byte blue) { if( (row > __max_row) || (led > __max_led) ) { return; } brightness_blue[led][row] = blue; } void set_led_rgb(byte row, byte led, byte red, byte green, byte blue) { set_led_red(row,led,red); set_led_green(row,led,green); set_led_blue(row,led,blue); } void set_matrix_rgb(byte red, byte green, byte blue) { byte ctr1; byte ctr2; for(ctr2 = 0; ctr2 <= __max_row; ctr2++) { for(ctr1 = 0; ctr1 <= __max_led; ctr1++) { set_led_rgb(ctr2,ctr1,red,green,blue); } } } void fill_color() { set_matrix_rgb(redVal, greenVal, blueVal); } void regShift() { } int i2; int st; int r; #define latchDown() {latchPort &= ~latchBit;} #define latchUp() {latchPort |= latchBit;} byte blue_sequence[ROWS][STEPS] = {255}; byte red_sequence[ROWS][STEPS] = {255}; byte green_sequence[ROWS][STEPS] = {255}; void prepare() { for (int stnum = 0; stnum < STEPS; stnum++) { for (int rownum = 0; rownum < ROWS; rownum++) { byte blueVal = 0; byte redVal = 0; byte greenVal = 0; for (i2 = 0; i2<8; i2++) { if (brightness_blue[i2][rownum] <= stnum) blueVal |= (1<=0; mat--) { SPI.transfer(255); SPI.transfer(redVals[mat]); SPI.transfer(255); SPI.transfer(1<<(7-r)); } latchUp(); delayMicroseconds(20); for (mat=0; mat=0; mat--) { SPI.transfer(blueVals[mat]); SPI.transfer(255); SPI.transfer(greenVals[mat]); SPI.transfer(1<<(7-r)); } latchUp(); delayMicroseconds(40); } } }