Driving a HL1606 RGB LED strip with the new mbed m0 LPC11U24: first version, without the use of the SI wire, software-PWM only.

Committer:
uski
Date:
Fri Dec 23 19:48:46 2011 +0000
Revision:
0:5ebdba8c620f

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }