Moves a glow up and down a strip of WS2812 LEDs

Dependencies:   mbed wsDrive

Committer:
AndyA
Date:
Wed Nov 05 16:50:38 2014 +0000
Revision:
0:35d68d1652e1
Child:
1:054df9ecd479
First commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AndyA 0:35d68d1652e1 1 #include "mbed.h"
AndyA 0:35d68d1652e1 2 #include "wsDrive.h"
AndyA 0:35d68d1652e1 3
AndyA 0:35d68d1652e1 4 // time period between each movement
AndyA 0:35d68d1652e1 5 #define updatePeriodMS 25
AndyA 0:35d68d1652e1 6
AndyA 0:35d68d1652e1 7 // number of LEDs in chain
AndyA 0:35d68d1652e1 8 #define chainLen 144
AndyA 0:35d68d1652e1 9
AndyA 0:35d68d1652e1 10 // length of the fade off behind the bright spot.
AndyA 0:35d68d1652e1 11 // 1/8th of the chain length seems to look good (18 LEDs for a 144 chain)
AndyA 0:35d68d1652e1 12 #define glowTail (chainLen/8)
AndyA 0:35d68d1652e1 13
AndyA 0:35d68d1652e1 14 // background brightness left after the tail has passed.
AndyA 0:35d68d1652e1 15 // final brightness = peak/backgroundRatio
AndyA 0:35d68d1652e1 16 // set to be the same as the glow tail length for a smooth transition
AndyA 0:35d68d1652e1 17 #define backgroundRatio glowTail
AndyA 0:35d68d1652e1 18
AndyA 0:35d68d1652e1 19 // set the pulldown and then create the driver
AndyA 0:35d68d1652e1 20 DigitalIn dummy(P0_21,PullDown);
AndyA 0:35d68d1652e1 21 wsDrive ledDriver(P0_21,P0_22,P1_15);
AndyA 0:35d68d1652e1 22
AndyA 0:35d68d1652e1 23 // mbuino stnadard definitions
AndyA 0:35d68d1652e1 24 DigitalIn progMode(P0_3,PullDown); // fix the power wasted if we ever sleep.
AndyA 0:35d68d1652e1 25 BusOut LEDs(LED1, LED2, LED3, LED4, LED5, LED6, LED7); // control the LEDs
AndyA 0:35d68d1652e1 26
AndyA 0:35d68d1652e1 27 Timer updateRateTimer;
AndyA 0:35d68d1652e1 28
AndyA 0:35d68d1652e1 29 // pixel storage buffer
AndyA 0:35d68d1652e1 30 pixelInfo pixelData[chainLen];
AndyA 0:35d68d1652e1 31
AndyA 0:35d68d1652e1 32 void blankBuffer(pixelInfo *Ptr)
AndyA 0:35d68d1652e1 33 {
AndyA 0:35d68d1652e1 34 memset( (void *)Ptr, 0, chainLen*sizeof(pixelInfo) );
AndyA 0:35d68d1652e1 35 }
AndyA 0:35d68d1652e1 36
AndyA 0:35d68d1652e1 37 void setPixel (pixelInfo *pixel, pixelInfo *colour, float level)
AndyA 0:35d68d1652e1 38 {
AndyA 0:35d68d1652e1 39
AndyA 0:35d68d1652e1 40 pixel->R = (unsigned char) (colour->R * level);
AndyA 0:35d68d1652e1 41 pixel->G = (unsigned char) (colour->G * level);
AndyA 0:35d68d1652e1 42 pixel->B = (unsigned char) (colour->B * level);
AndyA 0:35d68d1652e1 43 }
AndyA 0:35d68d1652e1 44
AndyA 0:35d68d1652e1 45
AndyA 0:35d68d1652e1 46 void setTrail (pixelInfo *colour, int peakPoint, bool increasing, int len)
AndyA 0:35d68d1652e1 47 {
AndyA 0:35d68d1652e1 48 int pixelToUpdate = peakPoint;
AndyA 0:35d68d1652e1 49 for (int pixel = 0; pixel <= len; pixel++) {
AndyA 0:35d68d1652e1 50 if (pixel == len) {
AndyA 0:35d68d1652e1 51 setPixel((pixelData+pixelToUpdate), colour, 1.0/backgroundRatio);
AndyA 0:35d68d1652e1 52 break;
AndyA 0:35d68d1652e1 53 }
AndyA 0:35d68d1652e1 54 setPixel((pixelData+pixelToUpdate), colour, 1.0 - (float)pixel/(float)len);
AndyA 0:35d68d1652e1 55 increasing ? pixelToUpdate-- : pixelToUpdate++;
AndyA 0:35d68d1652e1 56 if (pixelToUpdate == chainLen) {
AndyA 0:35d68d1652e1 57 increasing = false;
AndyA 0:35d68d1652e1 58 pixelToUpdate = peakPoint - 1;
AndyA 0:35d68d1652e1 59 pixel = pixel*2;
AndyA 0:35d68d1652e1 60 }
AndyA 0:35d68d1652e1 61 if (pixelToUpdate == -1) {
AndyA 0:35d68d1652e1 62 increasing = true;
AndyA 0:35d68d1652e1 63 pixelToUpdate = peakPoint + 1;
AndyA 0:35d68d1652e1 64 pixel = pixel*2;
AndyA 0:35d68d1652e1 65 }
AndyA 0:35d68d1652e1 66 }
AndyA 0:35d68d1652e1 67 }
AndyA 0:35d68d1652e1 68
AndyA 0:35d68d1652e1 69
AndyA 0:35d68d1652e1 70 void setColour(pixelInfo *colour)
AndyA 0:35d68d1652e1 71 {
AndyA 0:35d68d1652e1 72 static int cycleNumber = 0;
AndyA 0:35d68d1652e1 73
AndyA 0:35d68d1652e1 74 const int maxCycle = 40;
AndyA 0:35d68d1652e1 75 if (cycleNumber > maxCycle)
AndyA 0:35d68d1652e1 76 cycleNumber = 0;
AndyA 0:35d68d1652e1 77
AndyA 0:35d68d1652e1 78 switch (cycleNumber) {
AndyA 0:35d68d1652e1 79 case maxCycle:
AndyA 0:35d68d1652e1 80 cycleNumber = 0;
AndyA 0:35d68d1652e1 81 case 0:
AndyA 0:35d68d1652e1 82 colour->R = 0x80;
AndyA 0:35d68d1652e1 83 colour->G = 0x00;
AndyA 0:35d68d1652e1 84 colour->B = 0x00;
AndyA 0:35d68d1652e1 85 break;
AndyA 0:35d68d1652e1 86 case 10:
AndyA 0:35d68d1652e1 87 colour->R = 0x00;
AndyA 0:35d68d1652e1 88 colour->G = 0x70;
AndyA 0:35d68d1652e1 89 colour->B = 0x00;
AndyA 0:35d68d1652e1 90 break;
AndyA 0:35d68d1652e1 91 case 20:
AndyA 0:35d68d1652e1 92 colour->R = 0x00;
AndyA 0:35d68d1652e1 93 colour->G = 0x00;
AndyA 0:35d68d1652e1 94 colour->B = 0x80;
AndyA 0:35d68d1652e1 95 break;
AndyA 0:35d68d1652e1 96 case 30:
AndyA 0:35d68d1652e1 97 colour->R = 0x50;
AndyA 0:35d68d1652e1 98 colour->G = 0x40;
AndyA 0:35d68d1652e1 99 colour->B = 0x50;
AndyA 0:35d68d1652e1 100 break;
AndyA 0:35d68d1652e1 101 default:
AndyA 0:35d68d1652e1 102 break;
AndyA 0:35d68d1652e1 103 }
AndyA 0:35d68d1652e1 104 cycleNumber++;
AndyA 0:35d68d1652e1 105 }
AndyA 0:35d68d1652e1 106
AndyA 0:35d68d1652e1 107
AndyA 0:35d68d1652e1 108 int main ()
AndyA 0:35d68d1652e1 109 {
AndyA 0:35d68d1652e1 110 LEDs = 0;
AndyA 0:35d68d1652e1 111 // intialise variables
AndyA 0:35d68d1652e1 112 int peakPoint = 0;
AndyA 0:35d68d1652e1 113 bool increasing = true;
AndyA 0:35d68d1652e1 114
AndyA 0:35d68d1652e1 115 pixelInfo colour;
AndyA 0:35d68d1652e1 116 setColour(&colour);
AndyA 0:35d68d1652e1 117
AndyA 0:35d68d1652e1 118 blankBuffer(pixelData);
AndyA 0:35d68d1652e1 119
AndyA 0:35d68d1652e1 120 // give the LED driver the buffer to use.
AndyA 0:35d68d1652e1 121 ledDriver.setData(pixelData, chainLen);
AndyA 0:35d68d1652e1 122
AndyA 0:35d68d1652e1 123 LEDs = 1;
AndyA 0:35d68d1652e1 124
AndyA 0:35d68d1652e1 125 setTrail (&colour, peakPoint, increasing, glowTail); // set the LED data
AndyA 0:35d68d1652e1 126
AndyA 0:35d68d1652e1 127 updateRateTimer.start();
AndyA 0:35d68d1652e1 128 while (true) {
AndyA 0:35d68d1652e1 129 ledDriver.sendData(); // send the LED data
AndyA 0:35d68d1652e1 130 LEDs = LEDs+1;
AndyA 0:35d68d1652e1 131
AndyA 0:35d68d1652e1 132 increasing ? peakPoint++ : peakPoint--;
AndyA 0:35d68d1652e1 133 if (peakPoint == chainLen) {
AndyA 0:35d68d1652e1 134 increasing = false;
AndyA 0:35d68d1652e1 135 peakPoint = chainLen-2;
AndyA 0:35d68d1652e1 136 }
AndyA 0:35d68d1652e1 137 if (peakPoint == -1) {
AndyA 0:35d68d1652e1 138 setColour(&colour);
AndyA 0:35d68d1652e1 139 increasing = true;
AndyA 0:35d68d1652e1 140 peakPoint = 1;
AndyA 0:35d68d1652e1 141 }
AndyA 0:35d68d1652e1 142
AndyA 0:35d68d1652e1 143 // update to the next trail ready for the next update.
AndyA 0:35d68d1652e1 144 setTrail (&colour, peakPoint, increasing, glowTail); // set the LED data
AndyA 0:35d68d1652e1 145
AndyA 0:35d68d1652e1 146 // wait for the next update time.
AndyA 0:35d68d1652e1 147 while (updateRateTimer.read_ms() < updatePeriodMS) {
AndyA 0:35d68d1652e1 148 }
AndyA 0:35d68d1652e1 149 updateRateTimer.reset();
AndyA 0:35d68d1652e1 150 }
AndyA 0:35d68d1652e1 151
AndyA 0:35d68d1652e1 152 }