Pages: [1]   Go Down
Author Topic: LPD8806 code and sanity check  (Read 415 times)
0 Members and 1 Guest are viewing this topic.
Toronto
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hey!
So, I have six lighting fixtures with 3 LPD8806 based LED strips each attached to them.
Because of physical limitations of the fixtures, they are connected in parellel, and I can't chain the strips. Each strip has 20 LEDs on it. They aren't the adafruit LEDs, but a roll I ordered from alibaba.
I'm running everything off of an arduino mega, and don't have any additional circuitry, just basically direct connect from arduino to appropriate LED.

Currently, I'm getting just a string of gibberish LEDs. Really hoping to get a sanity check, as I get demos working previously, and I don't understand what's going wrong now The installation is going up in two days, kinda panicked.  Thanks in advance!

To explain the code a bit:
It sets up all the different strips, and runs a test (currently not working).
The strips should be constrained to a particular colour set based off the the individual power values from the Light struct, so between 0-127 red and 0-60 yellow, creating a range from deep red to orange (it's for a fire light)
But ya, currently nothing is happening.


Here's my code (gist here: https://gist.github.com/4584635)
Code:
#include "LPD8806.h"
#include "SPI.h"

// Constants
const int NUMLIGHTS = 6;    // Number of lights per arm
const int NUMARMS = 3;      // Number of arms per light
const int LEDPERARM = 20;   // Number of lights
const int testPin = 53;

int dataPins[NUMLIGHTS*NUMARMS] = {
    22,24,26,   // Light 0
    28,30,32,   // Light 1
    34,36,38,   // Light 2
    40,42,44,   // Light 3
    46,48,50,   // Light 4
    4,6,8     // Light 5
/*    2,
    4,
    6,
    8,
    10,
    12 */
    
    
    
};

int clockPins[NUMLIGHTS*NUMARMS] = {
    23,25,27,   // Light 0
    29,31,33,   // Light 1
    35,37,39,   // Light 2
    41,43,45,   // Light 3
    47,49,51,   // Light 4
    5,7,9     // Light 5    
/*    3,
    5,
    7,
    9,
    11,
    13 */
    
    
};

// Light struct
typedef struct {
    int id; // The id must match that of the OF program
    int pwr; // 0-127 val, derived from OF float val
    LPD8806 strip[NUMARMS]; // The three strips
} Light;

Light Lights[NUMLIGHTS]; // Declare lights array


// Serial communication
String inString = "";
int inChar;
int curLight = 0;
//int curArm = 0;
int curPwr = 0;

void setup() {
    // Setup all lights and arms
    pinMode(testPin,OUTPUT);
    for(int i=0;i<NUMLIGHTS;i++) {
        // Set up the Lights with the appropriate objects
        Lights[i].id = i;
        for(int a=0;a<NUMARMS;a++) {
            Lights[i].strip[a] = LPD8806(LEDPERARM, dataPins[i+a],   clockPins[i+a]);  
            Lights[i].strip[a].begin();
            Lights[i].strip[a].show();
            testStrip(&Lights[i].strip[a]);
            clearStrip(&Lights[i].strip[a]);
        }
    }
    
    // Start serial communication    
    Serial.begin(9600);
    digitalWrite(testPin, HIGH);
    delay(500);
}

void testStrip(LPD8806 * strip) {
    int i;
    for(i=0; i<strip->numPixels(); i++) {
        strip->setPixelColor(i, 0);
        strip->show();
    }
    
    // Then display one pixel at a time:
    for(i=0; i<strip->numPixels(); i++) {
        strip->setPixelColor(i, getColor(127) ); // Set new pixel 'on'
        strip->show();              // Refresh LED states
        strip->setPixelColor(i, 0); // Erase pixel, but don't refresh!
        delay(25);
    }
    
    strip->show(); // Refresh to turn off last pixel
}

void clearStrip(LPD8806 * strip) {
    int i;
    
    for (i=0; i < strip->numPixels(); i++) {
        strip->setPixelColor(i, getColor(0));
        strip->show();
        delay(10);
    }
}
              
void loop() {
    if(Serial.available() == 0) {
        digitalWrite(testPin, LOW);
        for(int i=0;i<NUMLIGHTS;i++) {
            render(i);
        }
        digitalWrite(testPin, HIGH);
    } else {
        digitalWrite(testPin, HIGH);
        for(int i=0;i<NUMLIGHTS;i++) {
            testStrip(&Lights[i].strip[0]);
        }        
        digitalWrite(testPin, LOW);
    }
}                  
                                        
void render(uint32_t lightId) {
    int maxPower, minPower, ptr, ledStr, pwr;
    for(int a=0;a<NUMARMS;a++) {
        for(int i=0;i<LEDPERARM;i++) {
            maxPower = i / LEDPERARM;
            minPower = 127 - (maxPower * (127-Lights[lightId].pwr));
          //  ptr = i + ( a * LEDPERARM );
            pwr = (byte)Lights[lightId].pwr;
            Lights[lightId].strip[a].setPixelColor(i,getColor(pwr));
        }
        Lights[lightId].strip[a].show();
    }
    
    delay(10); // holders for 10ms
}

// Derived from the LPD8806 lib
uint32_t getColor(byte pwr) {    
    byte r,g,b;
    r = (byte)(1 + (.5 * pwr));
    g = (byte)(.5 * pwr);
    b = (byte)0;
    
    return ((uint32_t)(g | 0x80) << 16) |
    ((uint32_t)(r | 0x80) <<  8) |
    b | 0x80 ;
}
                                        
void parseSerial() {
    // Read serial input:
    if (Serial.available() > 0) {
        inChar = Serial.read();
    }
    
    // Collecting the datas.
    if (isDigit(inChar)) {
        inString += (char)inChar;
    }
    
    // Iterating through the lights
    if (inChar == ',') {
        Lights[curLight].pwr = inString.toInt();
        inString = "";
        curLight++;
    }
    
    // Last light
    if (inChar == '\n') {
        Lights[NUMLIGHTS-1].pwr = inString.toInt();
        inString = "";
        curLight = 0;
    }  
}
Logged

Pages: [1]   Go Up
Jump to: