jim hamblen
/
Shiftbrite_Sequencer
Shiftbrite sequencer demo program. Controls a chain of 35 shiftbrites
main.cpp
- Committer:
- 4180_1
- Date:
- 2011-04-21
- Revision:
- 0:fc0ddaee005d
File content as of revision 0:fc0ddaee005d:
#include "mbed.h" // Shiftbrite Sequencer Demo Program // //Bits for Shiftbrite latch and enable pins DigitalOut latch(p15); DigitalOut enable(p16); //DigitalOut myled(LED1); // SPI connections for LED chain SPI spi(p11, p12, p13); //Serial PC(USBTX, USBRX); Timer time_counter; // number of LEDS in chain #define num_LEDS 35 // number of color values to sequence through #define Sequence_Length 17 // number of steps in fade effect #define Fade_Steps 64 // Each LED'S RGB color values for each step in sequence is stored in an array int LED_Color [Sequence_Length][num_LEDS][3] = {0}; // delay times in seconds for each RGB color value in sequence // can be different for each sequence step float Sequence_Delay[Sequence_Length]; int Sequence_Effect[Sequence_Length] = {0}; // Write (Shift out) 10-bit RGB values to a single LED void Write_LED(int red, int green, int blue) { unsigned int low_color=0; unsigned int high_color=0; red=red; green=green; blue=blue; high_color=(blue<<4)|((red&0x3C0)>>6); low_color=(((red&0x3F)<<10)|(green)); spi.write(high_color); spi.write(low_color); } // Sends Initial Current limits to all LEDs in array // used to correct for different RGB brightness levels in LEDs void Write_Init_Command(int red_level, int green_level, int blue_level) { unsigned int Init_Command = 0x40000000; int i=0; Init_Command = 0x40000000|(blue_level<<20)|(red_level<<10)|green_level; for (i=0; i<num_LEDS; i++) { spi.write(Init_Command>>16&0xFFFF); spi.write(Init_Command&0xFFFF); } wait(.000015); latch=1; wait(.000015); latch=0; } // Sets all LEDs in a sequence step to a default background color void Set_Background_Color(int Seq_Step, int red, int green, int blue) { int i=0; for (i=0; i<num_LEDS; i++) { LED_Color[Seq_Step][i][0] = red; LED_Color[Seq_Step][i][1] = green; LED_Color[Seq_Step][i][2] = blue; } } // Set a single LED in a Sequence Step to a color // Last LED in chain is LED #0 // // LED address in 5x7 array // 35 in chain serpantine style // 34 33 32 31 30 29 28 // 27 26 25 24 23 22 21 // 20 19 18 17 16 15 14 // 13 12 11 10 09 08 07 // 06 05 04 03 02 01 00 void Set_LED_Color(int Seq_Step, int LED_num, int red, int green, int blue) { LED_Color[Seq_Step][LED_num][0] = red; LED_Color[Seq_Step][LED_num][1] = green; LED_Color[Seq_Step][LED_num][2] = blue; } int main() { int i=0; int j=0; int k=0; int red, green, blue; bool odd=false; spi.format(16,0); spi.frequency(500000); enable=0; latch=0; int flicker = 0; // Set currents using Allegro A6281's command mode Write_Init_Command(120, 100, 100); // Do once during initialization // OK at power on, but a reset could set it to an invalid mode // // See page 7 in A6281 datasheet // This feature can be used to adjust for different LED // brightness levels - values suggested from Macetech doc // Clear out initial sequence values for (i=0; i<Sequence_Length; i++) { for (j=0; j<num_LEDS; j++) { for (k=0; k<4; k++) { LED_Color[i][j][k]=0; } } Sequence_Delay[i]=0; Sequence_Effect[i]=0; } // Color data values for LEDs to sequence through // Sequence step 0 Set_Background_Color(0, 1023, 0, 0); //LEDs RED Sequence_Delay[0] = 1; Sequence_Effect[0] = 0; // Sequence step 1 LED_Color[1][0][0] = 0; Set_Background_Color(1, 0, 1023, 0); //LEDs GREEN Sequence_Delay[1] = 2; Sequence_Effect[1] = 1; //Fade from RED to GREEN Effect // Sequence step 2 Set_Background_Color(2, 0, 0, 1023); //LEDs BLUE Sequence_Delay[2] = 2; Sequence_Effect[2] = 1; //Fade from GREEN to BLUE Effect // Sequence step 3 Set_Background_Color(3, 0, 0, 1023); Sequence_Delay[3] = 1; //Stay at this value for 1 seconds Sequence_Effect[3] = 0; // Sequence step 4 Set_Background_Color(4,1023,200,0); //LEDs all ORANGE Sequence_Delay[4] = 5; Sequence_Effect[4] = 2; //Flicker or Twinkle Effect // Sequence step 5 Set_Background_Color(5,1023,1023,0); //LEDs all YELLOW Sequence_Delay[5] = 5; Sequence_Effect[5] = 3; //Flashing Marquee Sign Effect // Sequence step 6 LED_Color[6][0][0] = 1023; //LED 0 RED LED_Color[6][0][1] = 0; LED_Color[6][0][2] = 0; LED_Color[6][1][0] = 1023; LED_Color[6][1][1] = 1023; LED_Color[6][1][2] = 1023; //LED 1 WHITE LED_Color[6][2][0] = 0; LED_Color[6][2][1] = 0; LED_Color[6][2][2] = 1023; //LED 1 BLUE Sequence_Delay[6] = 5; Sequence_Effect[6] = 4; //Shift Colors // Sequence step 7 Set_Background_Color(7,1023,1023,1023); //LEDs all WHITE Sequence_Delay[7] = 1; Sequence_Effect[7] = 0; //Sequence step 8 Set_Background_Color(8,0,0,0); //LEDs all Black Sequence_Delay[8] = 2; Sequence_Effect[8]= 1; //Fade to Black //Sequence step 9 Set_Background_Color(9,0,0,0); //LEDs all Black Sequence_Delay[9] = 1.5; Sequence_Effect[9]= 0; //Sequence step 10 Sequence_Delay[10] = 6; Sequence_Effect[10]= 5; //Random Bright Colors //Sequence step 11 Set_Background_Color(11,100,100,100); //LEDs all dim WHITE Set_LED_Color(11,34,0,0,1023); //char M Set_LED_Color(11,33,0,0,1023); Set_LED_Color(11,32,0,0,1023); Set_LED_Color(11,31,0,0,1023); Set_LED_Color(11,30,0,0,1023); Set_LED_Color(11,29,0,0,1023); Set_LED_Color(11,28,0,0,1023); Set_LED_Color(11,22,0,0,1023); Set_LED_Color(11,16,0,0,1023); Set_LED_Color(11,17,0,0,1023); Set_LED_Color(11,8,0,0,1023); Set_LED_Color(11,0,0,0,1023); Set_LED_Color(11,1,0,0,1023); Set_LED_Color(11,2,0,0,1023); Set_LED_Color(11,3,0,0,1023); Set_LED_Color(11,4,0,0,1023); Set_LED_Color(11,5,0,0,1023); Set_LED_Color(11,6,0,0,1023); Sequence_Effect[11] = 0; Sequence_Delay[11] = 3; //Sequence step 12 Set_Background_Color(12,100,100,100); //LEDs all dim WHITE Set_LED_Color(12,34,0,0,1023); // char b Set_LED_Color(12,33,0,0,1023); Set_LED_Color(12,32,0,0,1023); Set_LED_Color(12,31,0,0,1023); Set_LED_Color(12,30,0,0,1023); Set_LED_Color(12,29,0,0,1023); Set_LED_Color(12,28,0,0,1023); Set_LED_Color(12,27,0,0,1023); Set_LED_Color(12,24,0,0,1023); Set_LED_Color(12,20,0,0,1023); Set_LED_Color(12,17,0,0,1023); Set_LED_Color(12,12,0,0,1023); Set_LED_Color(12,11,0,0,1023); Sequence_Effect[12] = 0; Sequence_Delay[12] = 3; //Sequence step 13 Set_Background_Color(13,100,100,100); //LEDs all dim WHITE Set_LED_Color(13,34,0,0,1023); //char E Set_LED_Color(13,33,0,0,1023); Set_LED_Color(13,32,0,0,1023); Set_LED_Color(13,31,0,0,1023); Set_LED_Color(13,30,0,0,1023); Set_LED_Color(13,29,0,0,1023); Set_LED_Color(13,28,0,0,1023); Set_LED_Color(13,27,0,0,1023); Set_LED_Color(13,24,0,0,1023); Set_LED_Color(13,21,0,0,1023); Set_LED_Color(13,20,0,0,1023); Set_LED_Color(13,17,0,0,1023); Set_LED_Color(13,14,0,0,1023); Set_LED_Color(13,13,0,0,1023); Set_LED_Color(13,7,0,0,1023); Set_LED_Color(13,6,0,0,1023); Set_LED_Color(13,0,0,0,1023); Sequence_Effect[13] = 0; Sequence_Delay[13] = 3; //Sequence step 14 Set_Background_Color(14,100,100,100); //LEDs all dim WHITE Set_LED_Color(14,5,0,0,1023); //char d Set_LED_Color(14,4,0,0,1023); Set_LED_Color(14,3,0,0,1023); Set_LED_Color(14,6,0,0,1023); Set_LED_Color(14,2,0,0,1023); Set_LED_Color(14,1,0,0,1023); Set_LED_Color(14,0,0,0,1023); Set_LED_Color(14,13,0,0,1023); Set_LED_Color(14,10,0,0,1023); Set_LED_Color(14,20,0,0,1023); Set_LED_Color(14,17,0,0,1023); Set_LED_Color(14,26,0,0,1023); Set_LED_Color(14,25,0,0,1023); Sequence_Effect[14] = 0; Sequence_Delay[14] = 3; //Sequence step 15 Set_Background_Color(15,0,0,0); //LEDs all Black Sequence_Delay[15] = 2; Sequence_Effect[15]= 1; //Fade to Black //Sequence step 16 Set_Background_Color(16,0,0,0); //LEDs all Black Sequence_Delay[16] = 2; Sequence_Effect[16]= 0; //Black // add more steps or LEDs if needed and change #defines wait(1); // Repeat Sequence Forever while (1) { Write_Init_Command(120, 100, 100); //Step through the Sequence Values for (j = 0; j < Sequence_Length; j++) { // myled= !myled; switch (Sequence_Effect[j]) { case 0: { // Step through each LED in chain at each sequence step for (i = 0; i < num_LEDS; i++) { //Writes 32-bits of RGB color data to LED using SPI hardware Write_LED( LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); // Uncomment to get status info on serial port // printf("i= %d, j= %d\n\r",i,j); // printf(" %d %d %d\n\r",LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); } //Load in new values just shifted out to LED chain by setting latch high wait(.000015); latch=1; wait(.000015); latch=0; //Delay for this step in the sequence wait(Sequence_Delay[j]); break; } case 1: { //Lighing Effect: Fade into new color from previous color (note: can't fade first sequence step!) for (k = 0; k<=Fade_Steps; k++) { // Step through each LED in chain at each fade sequence step for (i = 0; i < num_LEDS; i++) { red = LED_Color[j-1][i][0] + k*(LED_Color[j][i][0]-LED_Color[j-1][i][0])/Fade_Steps; green = LED_Color[j-1][i][1] + k*(LED_Color[j][i][1]-LED_Color[j-1][i][1])/Fade_Steps; blue = LED_Color[j-1][i][2] + k*(LED_Color[j][i][2]-LED_Color[j-1][i][2])/Fade_Steps; //Writes 32-bits of RGB color data to LED using SPI hardware Write_LED(red, green, blue); // Uncomment to get status info on serial port // printf("i= %d, j= %d\n\r",i,j); // printf(" %d %d %d\n\r",LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); } //Load in new values just shifted out to LED chain by setting latch high wait(.000015); latch=1; wait(.000015); latch=0; //Delay for this step in the fade sequence wait(Sequence_Delay[j]/Fade_Steps); } break; } case 2: { //Lighting Effect: Flicker or Twinkle somewhat like a flame time_counter.reset(); time_counter.start(); while (time_counter.read()<Sequence_Delay[j]) { for (i = 0; i < num_LEDS; i++) { flicker = rand(); if (flicker>0x40000000) //Writes 32-bits of RGB color data to LED using SPI hardware Write_LED( LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); // Uncomment to get status info on serial port // printf("i= %d, j= %d\n\r",i,j); // printf(" %d %d %d\n\r",LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); else Write_LED( LED_Color[j][i][0]/2, LED_Color[j][i][1]/2, LED_Color[j][i][2]/2); } //Load in new values just shifted out to LED chain by setting latch high wait(.000015); latch=1; wait(.000015); latch=0; wait(.05); } time_counter.stop(); break; } case 3: { //Lighting Effect: Flashing Broadway Marquee Sign Style time_counter.reset(); time_counter.start(); while (time_counter.read()<Sequence_Delay[j]) { for (i = 0; i < num_LEDS; i++) { if (((i+odd)&0x01)==0) //Writes 32-bits of RGB color data to LED using SPI hardware Write_LED( LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); // Uncomment to get status info on serial port // printf("i= %d, j= %d\n\r",i,j); // printf(" %d %d %d\n\r",LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); else Write_LED( LED_Color[j][i][0]/4, LED_Color[j][i][1]/4, LED_Color[j][i][2]/4); } //Load in new values just shifted out to LED chain by setting latch high wait(.000015); latch=1; wait(.000015); latch=0; wait(.15); odd = !odd; } time_counter.stop(); break; } case 4: { //Lighting Effect: Circular Shift of Colors time_counter.reset(); time_counter.start(); k=0; while (time_counter.read()<Sequence_Delay[j]) { k = (k+1)%num_LEDS; for (i = 0; i < num_LEDS; i++) { //Writes 32-bits of RGB color data to LED using SPI hardware Write_LED( LED_Color[j][(i+k)%num_LEDS][0], LED_Color[j][(i+k)%num_LEDS][1], LED_Color[j][(i+k)%num_LEDS][2]); // Uncomment to get status info on serial port // printf("i= %d, j= %d\n\r",i,j); // printf(" %d %d %d\n\r",LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); } //Load in new values just shifted out to LED chain by setting latch high wait(.000015); latch=1; wait(.000015); latch=0; wait(.10); } time_counter.stop(); break; case 5: { //Random Bright Colors time_counter.reset(); time_counter.start(); k=0; while (time_counter.read()<Sequence_Delay[j]) { k = (k+1)%num_LEDS; for (i = 0; i < num_LEDS; i++) { //Writes 32-bits of RGB color data to LED using SPI hardware Write_LED( (rand()&0x00F000)>>6,(rand()&0x00F000)>>6,(rand()&0x00F000)>>6); // Uncomment to get status info on serial port // printf("i= %d, j= %d\n\r",i,j); // printf(" %d %d %d\n\r",LED_Color[j][i][0], LED_Color[j][i][1], LED_Color[j][i][2]); } //Load in new values just shifted out to LED chain by setting latch high wait(.000015); latch=1; wait(.000015); latch=0; wait(.08); } time_counter.stop(); break; } } } } } }