Simple 8x8 LED Matrix controller which interfaces with a Processing GUI over serial to display sketches
Dependencies: Multi_WS2811 mbed
Fork of Multi_WS2811_test by
Diff: main.cpp
- Revision:
- 33:7973b70d4fab
- Parent:
- 32:7b60b9add4b5
- Child:
- 34:0f1968ca238a
--- a/main.cpp Fri Nov 14 08:18:35 2014 +0000 +++ b/main.cpp Sat Nov 15 01:23:58 2014 +0000 @@ -1,64 +1,21 @@ #include "mbed.h" #include "WS2811.h" -#include "Colors.h" -#include "TSISensor.h" -#include "MMA8451Q.h" - -#define MMA8451_I2C_ADDRESS (0x1d<<1) // per LED: 3 * 20 mA = 60mA max // 60 LEDs: 60 * 60mA = 3600 mA max // 120 LEDs: 7200 mA max unsigned const nLEDs = MAX_LEDS_PER_STRIP; -// I/O pin usage -// PTD0 TPM0 CH0 monitor -// PTD1 TPM0 CH1 monitor -// PTD2 data output -// PTD3 debug output - -unsigned const DATA_OUT_PIN1 = 2; // PTD2 -unsigned const DATA_OUT_PIN2 = 3; // PTD3 +unsigned const DATA_OUT_PIN1 = 7; +unsigned const DATA_OUT_PIN2 = 0; +unsigned const DATA_OUT_PIN3 = 3; +unsigned const DATA_OUT_PIN4 = 4; +unsigned const DATA_OUT_PIN5 = 5; +unsigned const DATA_OUT_PIN6 = 6; +unsigned const DATA_OUT_PIN7 = 10; +unsigned const DATA_OUT_PIN8 = 11; Serial pc(USBTX, USBRX); -Timer timeRunning; - -TSISensor touchSensor; -MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS); -PwmOut rled(LED_RED); -PwmOut gled(LED_GREEN); -// LED_BLUE is on PTD1 - -float touchPercentage; -unsigned frames; - -float const minBrite = 0.2; -float const maxBrite = 0.5; -float brite; - -void readTouchSensor() -{ - touchPercentage *= 0.9; - touchPercentage += touchSensor.readPercentage() * 0.1; - brite = minBrite + (maxBrite - minBrite) * touchPercentage; -} - -// @brief sets different colors in each of the LEDs of a strip -// @param strip the light strip -// @param sat saturation, 0.0 - 1.0 -// @param brite brightness, 0.0 - 1.0 -// @param hueShift shift, 0.0 - 1.0 is equivalent to 0 - 360 degrees -static void showRainbow(WS2811 &strip, float sat, float brite, float hueShift) -{ - unsigned nLEDs = strip.numPixels(); - for (unsigned i = 0; i < nLEDs; i++) { - uint8_t r, g, b; - float hue = ((float)i / (float)nLEDs) + hueShift; - HSBtoRGB(hue, sat, brite, &r, &g, &b); - strip.setPixelColor(i, r, g, b); - } - strip.show(); -} static void clearScreen(WS2811 &strip) { @@ -72,47 +29,94 @@ int main(void) { pc.baud(9600); + WS2811 *lightStrip; WS2811 lightStrip1(nLEDs, DATA_OUT_PIN1); WS2811 lightStrip2(nLEDs, DATA_OUT_PIN2); - + WS2811 lightStrip3(nLEDs, DATA_OUT_PIN3); + WS2811 lightStrip4(nLEDs, DATA_OUT_PIN4); + WS2811 lightStrip5(nLEDs, DATA_OUT_PIN5); + WS2811 lightStrip6(nLEDs, DATA_OUT_PIN6); + WS2811 lightStrip7(nLEDs, DATA_OUT_PIN7); + WS2811 lightStrip8(nLEDs, DATA_OUT_PIN8); + lightStrip1.begin(); lightStrip2.begin(); - rled = 1.0; - gled = 1.0; - - float sat = 1.0; - - timeRunning.start(); - + lightStrip3.begin(); + lightStrip4.begin(); + lightStrip5.begin(); + lightStrip6.begin(); + lightStrip7.begin(); + lightStrip8.begin(); uint8_t q = 0; - char char_buff[6]; + char char_buff[10]; + char curr_char = 0; + for (;;) { - if(pc.readable()){ - if(pc.getc()==255){ - while(q < 6){ - while(!pc.readable()); - char_buff[q] = pc.getc(); - pc.putc(char_buff[q]); - if(char_buff[q] == 254) - break; - q++; - } + /* I have defined a custom UART packet protocol + * A general packet may look like: + * array[0] x-coordinate [0, 31] + * array[1] y-coordinate [0, 15] + * array[2] R (5-bit) + * array[3] G (5-bit) + * array[4] B (5-bit) + * array[5] 254 (delimiter) + */ + while(curr_char != 255 && q < 7) + { + /* If there is UART traffic */ + if(pc.readable()) + { + curr_char = pc.getc(); + char_buff[q] = curr_char; + q++; + } + } + + if((char_buff[0] == 254) && (q >= 5)){ + switch(int(char_buff[2])){ + case 0: + lightStrip = &lightStrip1; + break; + case 1: + lightStrip = &lightStrip2; + break; + case 2: + lightStrip = &lightStrip3; + break; + case 3: + lightStrip = &lightStrip4; + break; + case 4: + lightStrip = &lightStrip5; + break; + case 5: + lightStrip = &lightStrip6; + break; + case 6: + lightStrip = &lightStrip7; + break; + case 7: + lightStrip = &lightStrip8; + break; + default: + lightStrip = &lightStrip1; + q = 0; + break; + } + + (*lightStrip).setPixelColor(int(char_buff[1]), int(char_buff[3]), int(char_buff[4]), int(char_buff[5])); + + (*lightStrip).show(); + pc.putc(48+int(char_buff[0])); + } + else{ + //clearScreen(*lightStrip); + } + q = 0; + curr_char = 0; + WS2811::startDMA(); - if(q >= 4){ - lightStrip1.setPixelColor(int(char_buff[0])+8*char_buff[1], int(char_buff[2]), int(char_buff[3]), int(char_buff[4])); - lightStrip1.show(); - } - else{ - clearScreen(lightStrip1); - } - q = 0; - WS2811::startDMA(); - } - } - - - frames ++; } }