Last active
February 1, 2026 03:03
-
-
Save kevincon/935bca44a4a3b9ba0946ccbc75564063 to your computer and use it in GitHub Desktop.
mbed LPC1768 controller code for LPD8806 RGB LED strips on top of a graduation cap.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include "LPD8806.h" | |
| LPD8806 strip = LPD8806(64); | |
| int t[64] = {56, | |
| 57, | |
| 58, | |
| 59, | |
| 60, | |
| 61, | |
| 62, | |
| 63, | |
| 55, | |
| 54, | |
| 53, | |
| 52, | |
| 51, | |
| 50, | |
| 49, | |
| 48, | |
| 40, | |
| 41, | |
| 42, | |
| 43, | |
| 44, | |
| 45, | |
| 46, | |
| 47, | |
| 39, | |
| 38, | |
| 37, | |
| 36, | |
| 35, | |
| 34, | |
| 33, | |
| 32, | |
| 24, | |
| 25, | |
| 26, | |
| 27, | |
| 28, | |
| 29, | |
| 30, | |
| 31, | |
| 23, | |
| 22, | |
| 21, | |
| 20, | |
| 19, | |
| 18, | |
| 17, | |
| 16, | |
| 8, | |
| 9, | |
| 10, | |
| 11, | |
| 12, | |
| 13, | |
| 14, | |
| 15, | |
| 7, | |
| 6, | |
| 5, | |
| 4, | |
| 3, | |
| 2, | |
| 1, | |
| 0}; | |
| int r[64] = {56, // 0 | |
| 55, // 1 | |
| 40, // 2 | |
| 39, // 3 | |
| 24, // 4 | |
| 23, // 5 | |
| 8, // 6 | |
| 7, // 7 | |
| 6, // 8 | |
| 9, // 9 | |
| 22, // 10 | |
| 25, // 11 | |
| 38, // 12 | |
| 41, // 13 | |
| 54, // 14 | |
| 57, // 15 | |
| 58, // 16 | |
| 53, // 17 | |
| 42, // 18 | |
| 37, // 19 | |
| 26, // 20 | |
| 21, // 21 | |
| 10, // 22 | |
| 5, // 23 | |
| 4, // 24 | |
| 11, // 25 | |
| 20, // 26 | |
| 27, // 27 | |
| 36, // 28 | |
| 43, // 29 | |
| 52, // 30 | |
| 59, // 31 | |
| 60, // 32 | |
| 51, // 33 | |
| 44, // 34 | |
| 35, // 35 | |
| 28, // 36 | |
| 19, // 37 | |
| 12, // 38 | |
| 3, // 39 | |
| 2, // 40 | |
| 13, // 41 | |
| 18, // 42 | |
| 29, // 43 | |
| 34, // 44 | |
| 45, // 45 | |
| 50, // 46 | |
| 61, // 47 | |
| 62, // 48 | |
| 49, // 49 | |
| 46, // 50 | |
| 33, // 51 | |
| 30, // 52 | |
| 17, // 53 | |
| 14, // 54 | |
| 1, // 55 | |
| 0, // 56 | |
| 15, // 57 | |
| 16, // 58 | |
| 31, // 59 | |
| 32, // 60 | |
| 47, // 61 | |
| 48, // 62 | |
| 63, // 63 | |
| }; | |
| void update(uint32_t * cap) { | |
| int i; | |
| for (i = 0; i < 64; i++) { | |
| strip.setPixelColor(t[i], cap[i]); | |
| } | |
| } | |
| // Chase a dot down the strip | |
| // good for testing purposes | |
| void colorChase(uint32_t c, uint8_t delay) { | |
| int i; | |
| for (i=0; i < strip.numPixels(); i++) { | |
| strip.setPixelColor(i, 0); // turn all pixels off | |
| } | |
| for (i=0; i < strip.numPixels(); i++) { | |
| strip.setPixelColor(i, c); | |
| if (i == 0) { | |
| strip.setPixelColor(strip.numPixels()-1, 0); | |
| } else { | |
| strip.setPixelColor(i-1, 0); | |
| } | |
| strip.show(); | |
| wait_ms(delay); | |
| } | |
| } | |
| void colorChaseT(uint32_t c, uint8_t delay) { | |
| int i; | |
| for (i=0; i < strip.numPixels(); i++) { | |
| strip.setPixelColor(t[i], 0); // turn all pixels off | |
| } | |
| for (i=0; i < strip.numPixels(); i++) { | |
| strip.setPixelColor(t[i], c); | |
| if (i == 0) { | |
| strip.setPixelColor(t[strip.numPixels()-1], 0); | |
| } else { | |
| strip.setPixelColor(t[i-1], 0); | |
| } | |
| strip.show(); | |
| wait_ms(delay); | |
| } | |
| } | |
| // fill the dots one after the other with said color | |
| // good for testing purposes | |
| void colorWipe(uint32_t c, uint8_t delay) { | |
| int i; | |
| for (i=0; i < strip.numPixels(); i++) { | |
| strip.setPixelColor(i, c); | |
| strip.show(); | |
| wait_ms(delay); | |
| } | |
| } | |
| //Input a value 0 to 384 to get a color value. | |
| //The colours are a transition r - g -b - back to r | |
| uint32_t Wheel(uint16_t WheelPos) { | |
| uint8_t b=0; | |
| uint8_t g=0; | |
| uint8_t r = 0; | |
| switch (WheelPos / 128) { | |
| case 0: | |
| r = 127 - WheelPos % 128; //Red down | |
| g = WheelPos % 128; // Green up | |
| b = 0; //blue off | |
| break; | |
| case 1: | |
| g = 127 - WheelPos % 128; //green down | |
| b = WheelPos % 128; //blue up | |
| r = 0; //red off | |
| break; | |
| case 2: | |
| b = 127 - WheelPos % 128; //blue down | |
| r = WheelPos % 128; //red up | |
| g = 0; //green off | |
| break; | |
| } | |
| return(strip.Color(r,g,b)); | |
| } | |
| void rainbow(uint8_t delay) { | |
| int i, j; | |
| for (j=0; j < 384; j++) { // 3 cycles of all 384 colors in the wheel | |
| for (i=0; i < strip.numPixels(); i++) { | |
| strip.setPixelColor(i, Wheel( (i + j) % 384)); | |
| } | |
| strip.show(); // write all the pixels out | |
| wait_ms(delay); | |
| } | |
| } | |
| // Slightly different, this one makes the rainbow wheel equally distributed | |
| // along the chain | |
| void rainbowCycle(uint8_t delay) { | |
| uint16_t i, j; | |
| for (j=0; j < 384 * 5; j++) { // 5 cycles of all 384 colors in the wheel | |
| for (i=0; i < strip.numPixels(); i++) { | |
| // tricky math! we use each pixel as a fraction of the full 384-color wheel | |
| // (thats the i / strip.numPixels() part) | |
| // Then add in j which makes the colors go around per pixel | |
| // the % 384 is to make the wheel cycle around | |
| strip.setPixelColor(i, Wheel( ((i * 384 / strip.numPixels()) + j) % 384) ); | |
| } | |
| strip.show(); // write all the pixels out | |
| wait_ms(delay); | |
| } | |
| } | |
| // "Larson scanner" = Cylon/KITT bouncing light effect | |
| void scanner(uint8_t r, uint8_t g, uint8_t b, uint8_t delay) { | |
| int i, j, pos, dir; | |
| pos = 0; | |
| dir = 1; | |
| for (i=0; i<((strip.numPixels()-1) * 8); i++) { | |
| // Draw 5 pixels centered on pos. setPixelColor() will clip | |
| // any pixels off the ends of the strip, no worries there. | |
| // we'll make the colors dimmer at the edges for a nice pulse | |
| // look | |
| strip.setPixelColor(pos - 2, strip.Color(r/4, g/4, b/4)); | |
| strip.setPixelColor(pos - 1, strip.Color(r/2, g/2, b/2)); | |
| strip.setPixelColor(pos, strip.Color(r, g, b)); | |
| strip.setPixelColor(pos + 1, strip.Color(r/2, g/2, b/2)); | |
| strip.setPixelColor(pos + 2, strip.Color(r/4, g/4, b/4)); | |
| strip.show(); | |
| wait_ms(delay); | |
| // If we wanted to be sneaky we could erase just the tail end | |
| // pixel, but it's much easier just to erase the whole thing | |
| // and draw a new one next time. | |
| for (j=-2; j<= 2; j++) | |
| strip.setPixelColor(pos+j, strip.Color(0,0,0)); | |
| // Bounce off ends of strip | |
| pos += dir; | |
| if (pos < 0) { | |
| pos = 1; | |
| dir = -dir; | |
| } else if (pos >= strip.numPixels()) { | |
| pos = strip.numPixels() - 2; | |
| dir = -dir; | |
| } | |
| } | |
| } | |
| void shield(int delay) { | |
| uint32_t PR = strip.Color(255, 0, 0); | |
| uint32_t PB = strip.Color(9, 39, 255); | |
| uint32_t NA = strip.Color(0, 0, 0); | |
| uint32_t shield[64] = {PR, PR, PR, PR, PR, PR, PR, PR, | |
| PR, NA, PR, NA, NA, PR, NA, PR, | |
| PR, PR, PR, PR, PR, PR, PR, PR, | |
| PR, NA, NA, PB, PB, NA, NA, PR, | |
| PR, NA, PB, PB, PB, PB, NA, PR, | |
| PR, PB, PB, NA, NA, PB, PB, PR, | |
| NA, PR, NA, NA, NA, NA, PR, NA, | |
| NA, NA, PR, PR, PR, PR, NA, NA}; | |
| update(shield); | |
| strip.show(); | |
| wait_ms(delay); | |
| /* | |
| uint32_t shield2[64] = {NA, NA, PR, PR, PR, PR, PR, PR, | |
| NA, PR, PB, NA, NA, PR, NA, PR, | |
| PR, NA, PB, PB, NA, PR, PR, PR, | |
| PR, NA, NA, PB, PB, PR, NA, PR, | |
| PR, NA, NA, PB, PB, PR, NA, PR, | |
| PR, NA, PB, PB, NA, PR, PR, PR, | |
| NA, PR, PB, NA, NA, PR, NA, PR, | |
| NA, NA, PR, PR, PR, PR, PR, PR}; | |
| for (i = 0; i < 10; i++) { | |
| update2(shield); | |
| strip.show(); | |
| wait_ms(1500); | |
| update2(shield2); | |
| strip.show(); | |
| wait_ms(1500); | |
| } | |
| */ | |
| } | |
| void year(int delay) { | |
| uint32_t pr = strip.Color(255, 0, 0); | |
| uint32_t pb = strip.Color(9, 39, 255); | |
| uint32_t shape[64] = {pb, pb, pb, pb, pr, pb, pb, pb, | |
| pb, pb, pb, pr, pb, pb, pb, pb, | |
| pb, pb, pr, pb, pb, pr, pr, pb, | |
| pb, pr, pb, pb, pb, pb, pb, pr, | |
| pr, pb, pb, pr, pr, pb, pb, pr, | |
| pb, pb, pr, pb, pb, pr, pr, pb, | |
| pb, pb, pb, pr, pb, pb, pb, pb, | |
| pb, pb, pb, pb, pr, pb, pb, pb}; | |
| update(shape); | |
| strip.show(); | |
| wait_ms(delay); | |
| } | |
| int main() { | |
| // Start up the LED strip | |
| strip.begin(); | |
| // Update the strip, to start they are all 'off' | |
| strip.show(); | |
| while (1) { | |
| year(10); | |
| wait_ms(5000); | |
| shield(10); | |
| wait_ms(5000); | |
| //rainbowCycle(100); | |
| colorWipe(strip.Color(127,127,0), 100); // orange | |
| colorWipe(strip.Color(127,0,0), 100); // red | |
| colorWipe(strip.Color(0, 127,0), 100); // green | |
| colorWipe(strip.Color(0,0,127), 100); // blue | |
| colorWipe(strip.Color(0,127,0), 100); // green | |
| colorWipe(strip.Color(0,127,127), 100); // teal | |
| colorWipe(strip.Color(0,0,127), 100); // blue | |
| colorWipe(strip.Color(127,0,127), 100); // violet | |
| colorWipe(strip.Color(0,0,0), 100); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment