Created
June 2, 2013 03:59
-
-
Save ColinHarrington/5692579 to your computer and use it in GitHub Desktop.
Little LED App for my feet during the Electric run. Wished I made the startup sequence a couple minute event instead of just the color scroll
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define PI 3.14159265 | |
#define TWO_PI 6.28318531 | |
int redPin = 5; | |
int greenPin = 3; | |
int bluePin = 6; | |
float hue = 0.0; | |
float saturation = 1.0; | |
float brightness = 1.0; | |
float brightnessCap = 1.0;//0.25; | |
int red = 0; | |
int green = 0; | |
int blue = 0; | |
long rgbval; | |
//periodicOscillations | |
unsigned long t1start; | |
unsigned long t1current; | |
unsigned long t1period; | |
unsigned long t1nextCycle; | |
unsigned long t1position; | |
float t1percentage; | |
unsigned long t2start; | |
unsigned long t2current; | |
unsigned long t2period; | |
unsigned long t2nextCycle; | |
unsigned long t2position; | |
float t2percentage; | |
void setup() { | |
// declare RGB pins to be an output: | |
pinMode(redPin, OUTPUT); | |
pinMode(greenPin, OUTPUT); | |
pinMode(bluePin, OUTPUT); | |
//Startup sequence | |
//RED | |
analogWrite(redPin, 255); | |
analogWrite(greenPin, 0); | |
analogWrite(bluePin, 0); | |
delay(500); | |
//GREEN | |
analogWrite(redPin, 0); | |
analogWrite(greenPin, 255); | |
analogWrite(bluePin, 0); | |
delay(500); | |
//BLUE | |
analogWrite(redPin, 0); | |
analogWrite(greenPin, 0); | |
analogWrite(bluePin, 255); | |
delay(500); | |
//Accelerating Color wheel | |
float increment = 0.0002; | |
float currentJump = 0; | |
while (currentJump < 3.0) { | |
currentJump += increment; | |
hue += currentJump; | |
if (hue >= 6.0) { | |
hue -= 6.0; | |
increment += 0.0005; | |
} | |
writeRGB(); | |
delay(10); | |
} | |
saturation = 0.0; | |
writeRGB(); | |
delay(1000); | |
long strobeDelay = 10; | |
int strobeJump = 10; | |
while (strobeDelay < 150) { | |
writeRGB(); | |
delay(strobeDelay); | |
LEDsOff(); | |
delay(strobeDelay); | |
strobeDelay += strobeJump; | |
} | |
strobeJump = 50; | |
while (strobeDelay < 500) { | |
writeRGB(); | |
delay(strobeDelay); | |
LEDsOff(); | |
delay(strobeDelay); | |
strobeDelay += strobeJump; | |
} | |
//Off | |
LEDsOff(); | |
delay(500); | |
saturation = 1.0; | |
//Setup manual timers | |
t1start = millis(); | |
t1period = 30 * 1000; | |
t1nextCycle = t1start + t1period; | |
t2start = millis(); | |
t2period = 10 * 1000; | |
t2nextCycle = t2start + t2period; | |
} | |
void incrementT1() { | |
t1current = millis(); | |
while (t1current >= t1nextCycle) { | |
t1start += t1period; | |
t1nextCycle = t1start + t1period; | |
} | |
t1position = t1current - t1start; | |
t1percentage = (float)t1position / (float)t1period; | |
} | |
void incrementT2() { | |
t2current = millis(); | |
while (t2current >= t2nextCycle) { | |
t2start += t2period; | |
t2nextCycle = t2start + t2period; | |
} | |
t2position = t2current - t2start; | |
t2percentage = (float)t2position / (float)t2period; | |
} | |
void loop(){ | |
incrementT1(); | |
incrementT2(); | |
writeRGB(); | |
hue = t1percentage * 6.0; | |
brightness = (sin(t2percentage * TWO_PI) + 1) / 2.5 + 0.2; | |
delay(10); | |
} | |
void writeRGB() { | |
rgbval = HSV_to_RGB(hue, saturation, brightness * brightnessCap); | |
red = (rgbval & 0x00FF0000) >> 16; // there must be better ways | |
green = (rgbval & 0x0000FF00) >> 8; | |
blue = rgbval & 0x000000FF; | |
//Color Leveling for 3 LEDs | |
float sum = red + green + blue; | |
red = int (red * (red / sum)); | |
green = int (green * (green / sum)); | |
blue = int (blue * (blue / sum)); | |
analogWrite(redPin, red); | |
analogWrite(bluePin, green); | |
analogWrite(greenPin, blue); | |
} | |
void LEDsOff() { | |
analogWrite(redPin, 0); | |
analogWrite(greenPin, 0); | |
analogWrite(bluePin, 0); | |
} | |
long HSV_to_RGB( float h, float s, float v ) { | |
/* | |
modified from Alvy Ray Smith's site: | |
http://www.alvyray.com/Papers/hsv2rgb.htm | |
H is given on [0, 6]. S and V are given on [0, 1]. | |
RGB is returned as a 24-bit long #rrggbb | |
*/ | |
int i; | |
float m, n, f; | |
// not very elegant way of dealing with out of range: return black | |
if ((s<0.0) || (s>1.0) || (v<0.0) || (v>1.0)) { | |
return 0L; | |
} | |
if ((h < 0.0) || (h > 6.0)) { | |
return long( v * 255 ) + long( v * 255 ) * 256 + long( v * 255 ) * 65536; | |
} | |
i = floor(h); | |
f = h - i; | |
if ( !(i&1) ) { | |
f = 1 - f; // if i is even | |
} | |
m = v * (1 - s); | |
n = v * (1 - s * f); | |
switch (i) { | |
case 6: | |
case 0: // RETURN_RGB(v, n, m) | |
return long(v * 255 ) * 65536 + long( n * 255 ) * 256 + long( m * 255); | |
case 1: // RETURN_RGB(n, v, m) | |
return long(n * 255 ) * 65536 + long( v * 255 ) * 256 + long( m * 255); | |
case 2: // RETURN_RGB(m, v, n) | |
return long(m * 255 ) * 65536 + long( v * 255 ) * 256 + long( n * 255); | |
case 3: // RETURN_RGB(m, n, v) | |
return long(m * 255 ) * 65536 + long( n * 255 ) * 256 + long( v * 255); | |
case 4: // RETURN_RGB(n, m, v) | |
return long(n * 255 ) * 65536 + long( m * 255 ) * 256 + long( v * 255); | |
case 5: // RETURN_RGB(v, m, n) | |
return long(v * 255 ) * 65536 + long( m * 255 ) * 256 + long( n * 255); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment