Simple App for driving WS2812B RGB LED's. Slow color fading for my garden decoration.

Dependencies:   mbed wsDrive

main.cpp

Committer:
JojoS
Date:
2016-10-09
Revision:
1:a893d385c324
Parent:
0:ccb5eb39a47d

File content as of revision 1:a893d385c324:

#include "mbed.h"
#include "wsDrive.h"

// time period between each movement
#define updatePeriodMS 200

// number of LEDs in chain
#define chainLen 3

// set the pulldown and then create the driver
//DigitalIn dummy(P0_15, PullDown);
//wsDrive ledDriver(P0_15, P0_7, P0_14);     // LPC812
//wsDrive ledDriver(P1_22, P0_22, P1_15);     // LPC1347
wsDrive ledDriver(P0_28, P0_12, P0_16);     // LPC1549
//wsDrive ledDriver(PB_5, PB_4, PB_3);      // STM32F03 - fails, wrong SPI clock

// mbuino stnadard definitions
//DigitalIn progMode(P0_3,PullDown); // fix the power wasted if we ever sleep.
//BusOut LEDs(LED1, LED2, LED3, LED4, LED5, LED6, LED7); // control the LEDs

//Timer updateRateTimer;

// pixel storage buffer
pixelInfo16 pixelData[chainLen];


void blankBuffer(pixelInfo *Ptr)
{
    memset( (void *)Ptr, 0, chainLen*sizeof(pixelInfo) );
}

void setPixel(unsigned int index, pixelInfo *colourToUse)
{
    if (index < chainLen) {
        pixelData[index].R = colourToUse->R;
        pixelData[index].G = colourToUse->G;
        pixelData[index].B = colourToUse->B;
    }
}

void setPixel(unsigned int index, int r, int g, int b)
{
    if (index < chainLen) {
        pixelData[index].R = r;
        pixelData[index].G = g;
        pixelData[index].B = b;
    }
}

void clearPixel(unsigned int index)
{
    if (index < chainLen) {
        pixelData[index].R = 0;
        pixelData[index].G = 0;
        pixelData[index].B = 0;
    }
}

int main ()
{
    int intensityR = 0;
    int intensityG = 85;
    int intensityB = 170;
    int dirR = 1;
    int dirG = 1;
    int dirB = 1;

    // Tell the driver where the data is stored
    ledDriver.setData(pixelData, chainLen);
   
    //updateRateTimer.start();
    while (true) {

        if (((dirR > 0) && (intensityR >= 255)) ||
                ((dirR < 0) && (intensityR <= 0)))
            dirR *= -1;
        else
            intensityR += dirR;

        if (((dirG > 0) && (intensityG >= 255)) ||
                ((dirG < 0) && (intensityG <= 0)))
            dirG *= -1;
        else
            intensityG += dirG;

        if (((dirB > 0) && (intensityB >= 255)) ||
                ((dirB < 0) && (intensityB <= 0)))
            dirB *= -1;
        else
            intensityB += dirB;


        // modify the buffer ready for the next update
        setPixel(0, intensityR, intensityG, 0);
        setPixel(1, intensityR, 0, intensityB);
        setPixel(2, 0, intensityG, intensityB);

        ledDriver.sendData(); // send the LED data

        // wait until the correct time since the last update...
        //while (updateRateTimer.read_ms() < updatePeriodMS) {
        //
        wait_ms(200);
        //updateRateTimer.reset();
    }
}