Driving a HL1606 RGB LED strip with the new mbed m0 LPC11U24: first version, without the use of the SI wire, software-PWM only.
main.cpp@0:5ebdba8c620f, 2011-12-23 (annotated)
- Committer:
- uski
- Date:
- Fri Dec 23 19:48:46 2011 +0000
- Revision:
- 0:5ebdba8c620f
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
uski | 0:5ebdba8c620f | 1 | #include "mbed.h" |
uski | 0:5ebdba8c620f | 2 | |
uski | 0:5ebdba8c620f | 3 | DigitalOut mbedLED1(LED1); |
uski | 0:5ebdba8c620f | 4 | DigitalOut mbedLED2(LED2); |
uski | 0:5ebdba8c620f | 5 | DigitalOut mbedLED3(LED3); |
uski | 0:5ebdba8c620f | 6 | DigitalOut mbedLED4(LED4); |
uski | 0:5ebdba8c620f | 7 | |
uski | 0:5ebdba8c620f | 8 | Ticker tkrHL1606_update; |
uski | 0:5ebdba8c620f | 9 | |
uski | 0:5ebdba8c620f | 10 | #define HL1606_LEDcnt 160 //Depends of your particular strip, here 5meters=80 HL1606=160 LEDs |
uski | 0:5ebdba8c620f | 11 | int HL1606_pwmCounter; //Used in HL1606_update, PWM counter |
uski | 0:5ebdba8c620f | 12 | |
uski | 0:5ebdba8c620f | 13 | unsigned char HL1606_redPWM[2][HL1606_LEDcnt]; |
uski | 0:5ebdba8c620f | 14 | unsigned char HL1606_greenPWM[2][HL1606_LEDcnt]; |
uski | 0:5ebdba8c620f | 15 | unsigned char HL1606_bluePWM[2][HL1606_LEDcnt]; |
uski | 0:5ebdba8c620f | 16 | unsigned char HL1606_curFrame; |
uski | 0:5ebdba8c620f | 17 | unsigned char HL1606_lastFrameDisplayed; |
uski | 0:5ebdba8c620f | 18 | |
uski | 0:5ebdba8c620f | 19 | DigitalOut HL1606_latchPin(p8); |
uski | 0:5ebdba8c620f | 20 | SPI HL1606_SPI(p5, p6, p7); // mosi, miso, sclk |
uski | 0:5ebdba8c620f | 21 | |
uski | 0:5ebdba8c620f | 22 | // Send updated RGB values to the strip |
uski | 0:5ebdba8c620f | 23 | void HL1606_update() |
uski | 0:5ebdba8c620f | 24 | { |
uski | 0:5ebdba8c620f | 25 | unsigned char i, d, curFrameLatched; |
uski | 0:5ebdba8c620f | 26 | |
uski | 0:5ebdba8c620f | 27 | // Remember which frame we're showing, in case the background code changes it while we run |
uski | 0:5ebdba8c620f | 28 | curFrameLatched=HL1606_curFrame; |
uski | 0:5ebdba8c620f | 29 | |
uski | 0:5ebdba8c620f | 30 | //Duty cycle of the led = cpu usage of this func |
uski | 0:5ebdba8c620f | 31 | mbedLED4 = 1; |
uski | 0:5ebdba8c620f | 32 | |
uski | 0:5ebdba8c620f | 33 | // write out data to strip |
uski | 0:5ebdba8c620f | 34 | for (i=0; i < HL1606_LEDcnt; i++) { |
uski | 0:5ebdba8c620f | 35 | d = 0x80; // set the latch bit |
uski | 0:5ebdba8c620f | 36 | // calculate the next LED's byte |
uski | 0:5ebdba8c620f | 37 | if (HL1606_pwmCounter < HL1606_redPWM[curFrameLatched][i]) { |
uski | 0:5ebdba8c620f | 38 | d |= 0x04; |
uski | 0:5ebdba8c620f | 39 | } |
uski | 0:5ebdba8c620f | 40 | if (HL1606_pwmCounter < HL1606_bluePWM[curFrameLatched][i]) { |
uski | 0:5ebdba8c620f | 41 | d |= 0x10; |
uski | 0:5ebdba8c620f | 42 | } |
uski | 0:5ebdba8c620f | 43 | if (HL1606_pwmCounter < HL1606_greenPWM[curFrameLatched][i]) { |
uski | 0:5ebdba8c620f | 44 | d |= 0x01; |
uski | 0:5ebdba8c620f | 45 | } |
uski | 0:5ebdba8c620f | 46 | |
uski | 0:5ebdba8c620f | 47 | // send new data |
uski | 0:5ebdba8c620f | 48 | HL1606_SPI.write(d); |
uski | 0:5ebdba8c620f | 49 | } |
uski | 0:5ebdba8c620f | 50 | |
uski | 0:5ebdba8c620f | 51 | // increment our PWM counter |
uski | 0:5ebdba8c620f | 52 | HL1606_pwmCounter += 1; |
uski | 0:5ebdba8c620f | 53 | // 2 bits per pixel, max value 3 (0 1 2 3) |
uski | 0:5ebdba8c620f | 54 | if (HL1606_pwmCounter > 3) HL1606_pwmCounter = 0; |
uski | 0:5ebdba8c620f | 55 | |
uski | 0:5ebdba8c620f | 56 | // latch |
uski | 0:5ebdba8c620f | 57 | HL1606_latchPin = 1; |
uski | 0:5ebdba8c620f | 58 | wait_us(2); |
uski | 0:5ebdba8c620f | 59 | HL1606_latchPin = 0; |
uski | 0:5ebdba8c620f | 60 | |
uski | 0:5ebdba8c620f | 61 | mbedLED4 = 0; |
uski | 0:5ebdba8c620f | 62 | } |
uski | 0:5ebdba8c620f | 63 | |
uski | 0:5ebdba8c620f | 64 | // LOW LEVEL |
uski | 0:5ebdba8c620f | 65 | unsigned int lfsr_stat; |
uski | 0:5ebdba8c620f | 66 | unsigned int lfsr() |
uski | 0:5ebdba8c620f | 67 | { |
uski | 0:5ebdba8c620f | 68 | unsigned int bit; |
uski | 0:5ebdba8c620f | 69 | /* taps: 16 14 13 11; characteristic polynomial: x^16 + x^14 + x^13 + x^11 + 1 */ |
uski | 0:5ebdba8c620f | 70 | bit = ((lfsr_stat >> 0) ^ (lfsr_stat >> 2) ^ (lfsr_stat >> 3) ^ (lfsr_stat >> 5) ) & 1; |
uski | 0:5ebdba8c620f | 71 | lfsr_stat = (lfsr_stat >> 1) | (bit << 15); |
uski | 0:5ebdba8c620f | 72 | return lfsr_stat; |
uski | 0:5ebdba8c620f | 73 | } |
uski | 0:5ebdba8c620f | 74 | |
uski | 0:5ebdba8c620f | 75 | void HL1606_fillRGB(unsigned char red,unsigned char green,unsigned char blue) |
uski | 0:5ebdba8c620f | 76 | { |
uski | 0:5ebdba8c620f | 77 | unsigned char workBuf = HL1606_curFrame ^ 1; //work with the frame buffer not displayed |
uski | 0:5ebdba8c620f | 78 | |
uski | 0:5ebdba8c620f | 79 | for (int i = 0; i < HL1606_LEDcnt; i++) |
uski | 0:5ebdba8c620f | 80 | { |
uski | 0:5ebdba8c620f | 81 | HL1606_redPWM[workBuf][i] = red; |
uski | 0:5ebdba8c620f | 82 | HL1606_greenPWM[workBuf][i] = green; |
uski | 0:5ebdba8c620f | 83 | HL1606_bluePWM[workBuf][i] = blue; |
uski | 0:5ebdba8c620f | 84 | } |
uski | 0:5ebdba8c620f | 85 | HL1606_curFrame = workBuf; |
uski | 0:5ebdba8c620f | 86 | } |
uski | 0:5ebdba8c620f | 87 | |
uski | 0:5ebdba8c620f | 88 | //HIGH LEVEL |
uski | 0:5ebdba8c620f | 89 | |
uski | 0:5ebdba8c620f | 90 | void HL1606_doBlueWhiteFading(float delayDuringFading, float delayBetweenFadings) |
uski | 0:5ebdba8c620f | 91 | { |
uski | 0:5ebdba8c620f | 92 | //Start white |
uski | 0:5ebdba8c620f | 93 | HL1606_fillRGB(3,3,2); |
uski | 0:5ebdba8c620f | 94 | wait(delayBetweenFadings); |
uski | 0:5ebdba8c620f | 95 | //Fade to blue |
uski | 0:5ebdba8c620f | 96 | for (int i = 0; i <= 3; i++) |
uski | 0:5ebdba8c620f | 97 | { |
uski | 0:5ebdba8c620f | 98 | HL1606_fillRGB(3-i,3-i,2); |
uski | 0:5ebdba8c620f | 99 | wait(delayDuringFading); |
uski | 0:5ebdba8c620f | 100 | } |
uski | 0:5ebdba8c620f | 101 | //Stay blue for a while |
uski | 0:5ebdba8c620f | 102 | HL1606_fillRGB(0,0,2); |
uski | 0:5ebdba8c620f | 103 | wait(delayBetweenFadings); |
uski | 0:5ebdba8c620f | 104 | //Go back to white |
uski | 0:5ebdba8c620f | 105 | for (int i = 0; i <= 3; i++) |
uski | 0:5ebdba8c620f | 106 | { |
uski | 0:5ebdba8c620f | 107 | HL1606_fillRGB(i,i,2); |
uski | 0:5ebdba8c620f | 108 | wait(delayDuringFading); |
uski | 0:5ebdba8c620f | 109 | } |
uski | 0:5ebdba8c620f | 110 | } |
uski | 0:5ebdba8c620f | 111 | |
uski | 0:5ebdba8c620f | 112 | //Simulate a old-school christmas light |
uski | 0:5ebdba8c620f | 113 | void HL1606_simulateOldSchoolRGBY(float delay) |
uski | 0:5ebdba8c620f | 114 | { |
uski | 0:5ebdba8c620f | 115 | unsigned char workBuf; |
uski | 0:5ebdba8c620f | 116 | unsigned char curBrightness = 3; |
uski | 0:5ebdba8c620f | 117 | unsigned char curColor = 0; |
uski | 0:5ebdba8c620f | 118 | |
uski | 0:5ebdba8c620f | 119 | //Each color after the other |
uski | 0:5ebdba8c620f | 120 | for (curColor = 0; curColor < 4; curColor++) |
uski | 0:5ebdba8c620f | 121 | { |
uski | 0:5ebdba8c620f | 122 | workBuf = HL1606_curFrame ^ 1; //work with the frame buffer not displayed |
uski | 0:5ebdba8c620f | 123 | //Draw the LEDs |
uski | 0:5ebdba8c620f | 124 | for (int i = 0; i < HL1606_LEDcnt; i++) |
uski | 0:5ebdba8c620f | 125 | { |
uski | 0:5ebdba8c620f | 126 | unsigned int color = i & 3; //get LSB 2 bits : tells the current color |
uski | 0:5ebdba8c620f | 127 | if (color == curColor) |
uski | 0:5ebdba8c620f | 128 | { |
uski | 0:5ebdba8c620f | 129 | if (color == 0) |
uski | 0:5ebdba8c620f | 130 | { |
uski | 0:5ebdba8c620f | 131 | HL1606_redPWM[workBuf][i] = curBrightness; |
uski | 0:5ebdba8c620f | 132 | HL1606_greenPWM[workBuf][i] = 0; |
uski | 0:5ebdba8c620f | 133 | HL1606_bluePWM[workBuf][i] = 0; |
uski | 0:5ebdba8c620f | 134 | } |
uski | 0:5ebdba8c620f | 135 | else if (color == 1) |
uski | 0:5ebdba8c620f | 136 | { |
uski | 0:5ebdba8c620f | 137 | HL1606_redPWM[workBuf][i] = 0; |
uski | 0:5ebdba8c620f | 138 | HL1606_greenPWM[workBuf][i] = curBrightness; |
uski | 0:5ebdba8c620f | 139 | HL1606_bluePWM[workBuf][i] = 0; |
uski | 0:5ebdba8c620f | 140 | } |
uski | 0:5ebdba8c620f | 141 | else if (color == 2) |
uski | 0:5ebdba8c620f | 142 | { |
uski | 0:5ebdba8c620f | 143 | HL1606_redPWM[workBuf][i] = 0; |
uski | 0:5ebdba8c620f | 144 | HL1606_greenPWM[workBuf][i] = 0; |
uski | 0:5ebdba8c620f | 145 | HL1606_bluePWM[workBuf][i] = curBrightness; |
uski | 0:5ebdba8c620f | 146 | } |
uski | 0:5ebdba8c620f | 147 | else |
uski | 0:5ebdba8c620f | 148 | { |
uski | 0:5ebdba8c620f | 149 | HL1606_redPWM[workBuf][i] = curBrightness; |
uski | 0:5ebdba8c620f | 150 | HL1606_greenPWM[workBuf][i] = curBrightness; |
uski | 0:5ebdba8c620f | 151 | HL1606_bluePWM[workBuf][i] = 0; |
uski | 0:5ebdba8c620f | 152 | } |
uski | 0:5ebdba8c620f | 153 | } |
uski | 0:5ebdba8c620f | 154 | else |
uski | 0:5ebdba8c620f | 155 | { |
uski | 0:5ebdba8c620f | 156 | HL1606_redPWM[workBuf][i] = 0; |
uski | 0:5ebdba8c620f | 157 | HL1606_greenPWM[workBuf][i] = 0; |
uski | 0:5ebdba8c620f | 158 | HL1606_bluePWM[workBuf][i] = 0; |
uski | 0:5ebdba8c620f | 159 | } |
uski | 0:5ebdba8c620f | 160 | } |
uski | 0:5ebdba8c620f | 161 | HL1606_curFrame = workBuf; |
uski | 0:5ebdba8c620f | 162 | wait(delay); |
uski | 0:5ebdba8c620f | 163 | } |
uski | 0:5ebdba8c620f | 164 | } |
uski | 0:5ebdba8c620f | 165 | |
uski | 0:5ebdba8c620f | 166 | void HL1606_doSparkle() |
uski | 0:5ebdba8c620f | 167 | { |
uski | 0:5ebdba8c620f | 168 | unsigned char workBuf = HL1606_curFrame ^ 1; //work with the frame buffer not displayed |
uski | 0:5ebdba8c620f | 169 | |
uski | 0:5ebdba8c620f | 170 | for (int i = 0; i < HL1606_LEDcnt; i++) |
uski | 0:5ebdba8c620f | 171 | { |
uski | 0:5ebdba8c620f | 172 | HL1606_redPWM[workBuf][i] = HL1606_greenPWM[workBuf][i] = HL1606_bluePWM[workBuf][i] = ((lfsr() & 63) == 0)?3:0; |
uski | 0:5ebdba8c620f | 173 | } |
uski | 0:5ebdba8c620f | 174 | HL1606_curFrame = workBuf; |
uski | 0:5ebdba8c620f | 175 | } |
uski | 0:5ebdba8c620f | 176 | |
uski | 0:5ebdba8c620f | 177 | void HL1606_doRainbow(float delay) |
uski | 0:5ebdba8c620f | 178 | { |
uski | 0:5ebdba8c620f | 179 | //now: 3,0,0 (red) |
uski | 0:5ebdba8c620f | 180 | for (int i = 0; i<4; i++) |
uski | 0:5ebdba8c620f | 181 | { |
uski | 0:5ebdba8c620f | 182 | HL1606_fillRGB(0x3,i,0x0); |
uski | 0:5ebdba8c620f | 183 | wait(delay); |
uski | 0:5ebdba8c620f | 184 | } |
uski | 0:5ebdba8c620f | 185 | //now: 3,3,0 (yellow) |
uski | 0:5ebdba8c620f | 186 | for (int i = 0; i<4; i++) |
uski | 0:5ebdba8c620f | 187 | { |
uski | 0:5ebdba8c620f | 188 | HL1606_fillRGB(0x3-i,0x3,0x0); |
uski | 0:5ebdba8c620f | 189 | wait(delay); |
uski | 0:5ebdba8c620f | 190 | } |
uski | 0:5ebdba8c620f | 191 | //now: 0,3,0 (green) |
uski | 0:5ebdba8c620f | 192 | for (int i = 0; i<4; i++) |
uski | 0:5ebdba8c620f | 193 | { |
uski | 0:5ebdba8c620f | 194 | HL1606_fillRGB(0x0,0x3,i); |
uski | 0:5ebdba8c620f | 195 | wait(delay); |
uski | 0:5ebdba8c620f | 196 | } |
uski | 0:5ebdba8c620f | 197 | //now: 0,3,3 (cyan) |
uski | 0:5ebdba8c620f | 198 | for (int i = 0; i<4; i++) |
uski | 0:5ebdba8c620f | 199 | { |
uski | 0:5ebdba8c620f | 200 | HL1606_fillRGB(0x0,0x3-i,0x3); |
uski | 0:5ebdba8c620f | 201 | wait(delay); |
uski | 0:5ebdba8c620f | 202 | } |
uski | 0:5ebdba8c620f | 203 | //now: 0,0,3 (blue) |
uski | 0:5ebdba8c620f | 204 | for (int i = 0; i<4; i++) |
uski | 0:5ebdba8c620f | 205 | { |
uski | 0:5ebdba8c620f | 206 | HL1606_fillRGB(i,0x0,0x3); |
uski | 0:5ebdba8c620f | 207 | wait(delay); |
uski | 0:5ebdba8c620f | 208 | } |
uski | 0:5ebdba8c620f | 209 | //now: 3,0,3 (purple) |
uski | 0:5ebdba8c620f | 210 | for (int i = 0; i<4; i++) |
uski | 0:5ebdba8c620f | 211 | { |
uski | 0:5ebdba8c620f | 212 | HL1606_fillRGB(0x3,0x0,0x3-i); |
uski | 0:5ebdba8c620f | 213 | wait(delay); |
uski | 0:5ebdba8c620f | 214 | } |
uski | 0:5ebdba8c620f | 215 | //now: 3,0,0 (red) |
uski | 0:5ebdba8c620f | 216 | } |
uski | 0:5ebdba8c620f | 217 | |
uski | 0:5ebdba8c620f | 218 | void HL1606_doK2000(float delay, unsigned char speed, unsigned char length) |
uski | 0:5ebdba8c620f | 219 | { |
uski | 0:5ebdba8c620f | 220 | unsigned char workBuf = HL1606_curFrame ^ 1; //work with the frame buffer not displayed |
uski | 0:5ebdba8c620f | 221 | |
uski | 0:5ebdba8c620f | 222 | //end stores the position of the end of the light line (it can be higher than HL1606_LEDcnt because |
uski | 0:5ebdba8c620f | 223 | //the led line can go completely off the display |
uski | 0:5ebdba8c620f | 224 | for (int end = 0; end < HL1606_LEDcnt + length; end += speed) |
uski | 0:5ebdba8c620f | 225 | { |
uski | 0:5ebdba8c620f | 226 | for (int i = 0; i < HL1606_LEDcnt; i++) |
uski | 0:5ebdba8c620f | 227 | { |
uski | 0:5ebdba8c620f | 228 | HL1606_redPWM[workBuf][i] = ((i<end)&&(i>(end-length)))?3:0; |
uski | 0:5ebdba8c620f | 229 | HL1606_greenPWM[workBuf][i] = ((i<end)&&(i>(end-length)))?1:0; |
uski | 0:5ebdba8c620f | 230 | HL1606_bluePWM[workBuf][i] = 0; |
uski | 0:5ebdba8c620f | 231 | } |
uski | 0:5ebdba8c620f | 232 | HL1606_curFrame = workBuf; |
uski | 0:5ebdba8c620f | 233 | wait(delay); |
uski | 0:5ebdba8c620f | 234 | } |
uski | 0:5ebdba8c620f | 235 | |
uski | 0:5ebdba8c620f | 236 | //reverse |
uski | 0:5ebdba8c620f | 237 | for (int end = HL1606_LEDcnt + length - 1; end >= 0; end -= speed) |
uski | 0:5ebdba8c620f | 238 | { |
uski | 0:5ebdba8c620f | 239 | for (int i = 0; i < HL1606_LEDcnt; i++) |
uski | 0:5ebdba8c620f | 240 | { |
uski | 0:5ebdba8c620f | 241 | HL1606_redPWM[workBuf][i] = ((i<end)&&(i>(end-length)))?3:0; |
uski | 0:5ebdba8c620f | 242 | HL1606_greenPWM[workBuf][i] = ((i<end)&&(i>(end-length)))?1:0;; |
uski | 0:5ebdba8c620f | 243 | HL1606_bluePWM[workBuf][i] = 0; |
uski | 0:5ebdba8c620f | 244 | } |
uski | 0:5ebdba8c620f | 245 | HL1606_curFrame = workBuf; |
uski | 0:5ebdba8c620f | 246 | wait(delay); |
uski | 0:5ebdba8c620f | 247 | } |
uski | 0:5ebdba8c620f | 248 | |
uski | 0:5ebdba8c620f | 249 | } |
uski | 0:5ebdba8c620f | 250 | |
uski | 0:5ebdba8c620f | 251 | void HL1606_doXmas(float delay, unsigned char speed, unsigned char length) |
uski | 0:5ebdba8c620f | 252 | { |
uski | 0:5ebdba8c620f | 253 | unsigned char workBuf = HL1606_curFrame ^ 1; //work with the frame buffer not displayed |
uski | 0:5ebdba8c620f | 254 | |
uski | 0:5ebdba8c620f | 255 | //display red/green alternating bars, moving together |
uski | 0:5ebdba8c620f | 256 | for (int shift = 0; shift < length*2; shift += speed) |
uski | 0:5ebdba8c620f | 257 | { |
uski | 0:5ebdba8c620f | 258 | unsigned char countSameColor = shift%length; |
uski | 0:5ebdba8c620f | 259 | unsigned char state; |
uski | 0:5ebdba8c620f | 260 | if (shift>=length) state = 0; |
uski | 0:5ebdba8c620f | 261 | else state = 1; |
uski | 0:5ebdba8c620f | 262 | for (int i = 0; i < HL1606_LEDcnt; i++) |
uski | 0:5ebdba8c620f | 263 | { |
uski | 0:5ebdba8c620f | 264 | |
uski | 0:5ebdba8c620f | 265 | countSameColor++; |
uski | 0:5ebdba8c620f | 266 | if (countSameColor == length) |
uski | 0:5ebdba8c620f | 267 | { |
uski | 0:5ebdba8c620f | 268 | state = state ^ 1; |
uski | 0:5ebdba8c620f | 269 | countSameColor = 0; |
uski | 0:5ebdba8c620f | 270 | } |
uski | 0:5ebdba8c620f | 271 | |
uski | 0:5ebdba8c620f | 272 | HL1606_redPWM[workBuf][i] = state?3:0; |
uski | 0:5ebdba8c620f | 273 | HL1606_greenPWM[workBuf][i] = state?0:1; |
uski | 0:5ebdba8c620f | 274 | HL1606_bluePWM[workBuf][i] = 0; |
uski | 0:5ebdba8c620f | 275 | } |
uski | 0:5ebdba8c620f | 276 | HL1606_curFrame = workBuf; |
uski | 0:5ebdba8c620f | 277 | wait(delay); |
uski | 0:5ebdba8c620f | 278 | } |
uski | 0:5ebdba8c620f | 279 | |
uski | 0:5ebdba8c620f | 280 | } |
uski | 0:5ebdba8c620f | 281 | |
uski | 0:5ebdba8c620f | 282 | void HL1606_doFrenchFlag() |
uski | 0:5ebdba8c620f | 283 | { |
uski | 0:5ebdba8c620f | 284 | unsigned char workBuf = HL1606_curFrame ^ 1; //work with the frame buffer not displayed |
uski | 0:5ebdba8c620f | 285 | //This wasn't meant to be very patriotic, just wanted to do a quick test |
uski | 0:5ebdba8c620f | 286 | //Blue, white, red (reverse because of the order of the LEDs) |
uski | 0:5ebdba8c620f | 287 | for (int i = 0; i < HL1606_LEDcnt/3; i++) |
uski | 0:5ebdba8c620f | 288 | { |
uski | 0:5ebdba8c620f | 289 | HL1606_redPWM[workBuf][i] = 0; |
uski | 0:5ebdba8c620f | 290 | HL1606_greenPWM[workBuf][i] = 0; |
uski | 0:5ebdba8c620f | 291 | HL1606_bluePWM[workBuf][i] = 3; |
uski | 0:5ebdba8c620f | 292 | } |
uski | 0:5ebdba8c620f | 293 | for (int i = HL1606_LEDcnt/3; i < (HL1606_LEDcnt/3)*2; i++) |
uski | 0:5ebdba8c620f | 294 | { |
uski | 0:5ebdba8c620f | 295 | HL1606_redPWM[workBuf][i] = 2; |
uski | 0:5ebdba8c620f | 296 | HL1606_greenPWM[workBuf][i] = 2; |
uski | 0:5ebdba8c620f | 297 | HL1606_bluePWM[workBuf][i] = 3; |
uski | 0:5ebdba8c620f | 298 | } |
uski | 0:5ebdba8c620f | 299 | for (int i = (HL1606_LEDcnt/3)*2; i < HL1606_LEDcnt; i++) |
uski | 0:5ebdba8c620f | 300 | { |
uski | 0:5ebdba8c620f | 301 | HL1606_redPWM[workBuf][i] = 3; |
uski | 0:5ebdba8c620f | 302 | HL1606_greenPWM[workBuf][i] = 0; |
uski | 0:5ebdba8c620f | 303 | HL1606_bluePWM[workBuf][i] = 0; |
uski | 0:5ebdba8c620f | 304 | } |
uski | 0:5ebdba8c620f | 305 | |
uski | 0:5ebdba8c620f | 306 | HL1606_curFrame = workBuf; |
uski | 0:5ebdba8c620f | 307 | } |
uski | 0:5ebdba8c620f | 308 | |
uski | 0:5ebdba8c620f | 309 | int main() { |
uski | 0:5ebdba8c620f | 310 | |
uski | 0:5ebdba8c620f | 311 | HL1606_SPI.format(8,3); // 8 bits per frame, SPI mode 3 |
uski | 0:5ebdba8c620f | 312 | HL1606_SPI.frequency(450000); // 450kHz freq; higher speed = draw errors |
uski | 0:5ebdba8c620f | 313 | |
uski | 0:5ebdba8c620f | 314 | lfsr_stat = 0xACE1; //LFSR init |
uski | 0:5ebdba8c620f | 315 | |
uski | 0:5ebdba8c620f | 316 | mbedLED1 = 0; |
uski | 0:5ebdba8c620f | 317 | mbedLED2 = 0; |
uski | 0:5ebdba8c620f | 318 | mbedLED3 = 0; |
uski | 0:5ebdba8c620f | 319 | mbedLED4 = 0; |
uski | 0:5ebdba8c620f | 320 | |
uski | 0:5ebdba8c620f | 321 | HL1606_curFrame = 0; //init double-buffer cur frame pointer |
uski | 0:5ebdba8c620f | 322 | |
uski | 0:5ebdba8c620f | 323 | for (int i = 0; i < 160; i++) |
uski | 0:5ebdba8c620f | 324 | { |
uski | 0:5ebdba8c620f | 325 | HL1606_redPWM[0][i] = i & 0x03; |
uski | 0:5ebdba8c620f | 326 | HL1606_greenPWM[0][i] = (i & 0x0C) >> 2; |
uski | 0:5ebdba8c620f | 327 | HL1606_bluePWM[0][i] = (i & 0x30) >> 4; |
uski | 0:5ebdba8c620f | 328 | } |
uski | 0:5ebdba8c620f | 329 | |
uski | 0:5ebdba8c620f | 330 | // Update LEDs every 4.5ms |
uski | 0:5ebdba8c620f | 331 | tkrHL1606_update.attach(&HL1606_update, 0.0045); |
uski | 0:5ebdba8c620f | 332 | |
uski | 0:5ebdba8c620f | 333 | // Main effect loop |
uski | 0:5ebdba8c620f | 334 | while(1) { |
uski | 0:5ebdba8c620f | 335 | //Sparkle |
uski | 0:5ebdba8c620f | 336 | for (int i = 0; i < 900; i++) |
uski | 0:5ebdba8c620f | 337 | { |
uski | 0:5ebdba8c620f | 338 | HL1606_doSparkle(); |
uski | 0:5ebdba8c620f | 339 | wait(0.025); |
uski | 0:5ebdba8c620f | 340 | } |
uski | 0:5ebdba8c620f | 341 | //Xmas banner |
uski | 0:5ebdba8c620f | 342 | for (int i = 0; i < 20; i++) HL1606_doXmas(0.04,1,25); |
uski | 0:5ebdba8c620f | 343 | //French flag :) |
uski | 0:5ebdba8c620f | 344 | HL1606_doFrenchFlag(); |
uski | 0:5ebdba8c620f | 345 | wait(8); |
uski | 0:5ebdba8c620f | 346 | //Blue and white fading |
uski | 0:5ebdba8c620f | 347 | for (int i = 0; i < 5; i++) HL1606_doBlueWhiteFading(0.3,1.5); |
uski | 0:5ebdba8c620f | 348 | //Chase like K2000 |
uski | 0:5ebdba8c620f | 349 | for (int i = 0; i < 5; i++) HL1606_doK2000(0.01,1,25); |
uski | 0:5ebdba8c620f | 350 | //Rainbow: red->yellow->green->cyan->blue->purple... |
uski | 0:5ebdba8c620f | 351 | HL1606_doRainbow(0.3); |
uski | 0:5ebdba8c620f | 352 | HL1606_doRainbow(0.3); |
uski | 0:5ebdba8c620f | 353 | HL1606_doRainbow(0.3); |
uski | 0:5ebdba8c620f | 354 | HL1606_doRainbow(0.3); |
uski | 0:5ebdba8c620f | 355 | //Old school RGBY light |
uski | 0:5ebdba8c620f | 356 | for (int i = 0; i < 15; i++) HL1606_simulateOldSchoolRGBY(0.4); |
uski | 0:5ebdba8c620f | 357 | } |
uski | 0:5ebdba8c620f | 358 | } |