Skip to content

Instantly share code, notes, and snippets.

@ColinHarrington
Created June 2, 2013 03:59
Show Gist options
  • Save ColinHarrington/5692579 to your computer and use it in GitHub Desktop.
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
#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