Mbed controller code for lpd8806 rgb led strips on top of a graduation cap.

Dependencies:   LPD8806 mbed

main.cpp

Committer:
kcon
Date:
2012-05-14
Revision:
0:1f4ea5a43e97

File content as of revision 0:1f4ea5a43e97:

// Mbed program to test LPD8806-based RGB LED Strips
// (c) 2011 Jelmer Tiete
// This library is ported from the Arduino implementation of Adafruit Industries
// found at: http://github.com/adafruit/LPD8806
// and their strips: http://www.adafruit.com/products/306
// Released under the MIT License: http://mbed.org/license/mit
//
// standard connected to 1st hardware SPI
// LPD8806  <> MBED
// DATA     -> P5
// CLOCK    -> p7
/*****************************************************************************/

#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);
    }
}