Moves a glow up and down a strip of WS2812 LEDs
main.cpp@0:35d68d1652e1, 2014-11-05 (annotated)
- 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?
User | Revision | Line number | New 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 | } |