Skip to content

Instantly share code, notes, and snippets.

@woodif
Created July 15, 2015 09:26
Show Gist options
  • Save woodif/ea93719941cba85990e2 to your computer and use it in GitHub Desktop.
Save woodif/ea93719941cba85990e2 to your computer and use it in GitHub Desktop.
/*
RGB Fading
*/
#include <EEPROM.h>
const int maxdelay = 99;
const int maxmode = 4;
const int redpin = 16; // LED connected to digital pin 11
const int bluepin = 14; // LED connected to digital pin 10
const int greenpin = 12; // LED connected to digital pin 9
int oldr = 1023;
int oldg = 1023;
int oldb = 1023;
int mode = 1;
int delayval = 1;
char* modes[]={"","Fade smoothly with variable delay","Pulse in and out","Fade in steps--broken","Blink"};
void setup() {
// nothing happens in setup
analogWrite(redpin,oldr);
analogWrite(bluepin,oldb);
analogWrite(greenpin,oldg);
randomSeed(analogRead(0));
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
delayval = constrain(EEPROM.read(0),1,maxdelay);
mode = constrain(EEPROM.read(1),1,maxmode);
Serial.println("Reading settings from EEPROM...");
Serial.print("Mode is ");
Serial.println(mode);
Serial.print("Delay is ");
Serial.println(delayval);
}
void loop() {
if ( Serial.available() > 2) { // there must be 3 or more characters in the buffer
char cmd = Serial.read();
char arg1 = Serial.read();
char arg2 = Serial.read();
int arg = ((arg1-'0')*10)+(arg2-'0'); // convert the args from ascii and stick them together
Serial.flush();
Serial.print("Received cmd:");
Serial.print(cmd);
Serial.println(arg);
switch (cmd) {
case 'm':
mode=constrain(arg,1,maxmode);
Serial.print("Setting mode to ");
Serial.print(mode);
Serial.print(" (");
Serial.print(modes[mode]);
Serial.println(")");
EEPROM.write(1,mode);
break;
case 'd':
delayval=constrain(arg,1,99);
Serial.print("Setting delayval to ");
Serial.println(delayval);
EEPROM.write(0,delayval);
break;
default:
Serial.println("Invalid command, doing nothing.");
Serial.print("Mode is still '");
Serial.print(mode);
Serial.print("', delay is still '");
Serial.print(delayval);
Serial.println("'");
break;
}
}
switch (mode) {
case 1:
random_fade3(delayval);
break;
case 2:
random_fade1();
break;
case 3:
random_fade2();
break;
default:
random_blink();
}
}
void random_fade1() {
int newr = random(1,1023);
int newg = random(1,1023);
int newb = random(1,1023);
int scale = 51;
for (int i = 0; i <= scale; i +=1) {
analogWrite(redpin, 1023-(i*(newr/scale)));
analogWrite(greenpin, 1023-(i*(newg/scale)));
analogWrite(bluepin, 1023-(i*(newb/scale)));
delay(delayval);
}
for (int i = scale; i > 0; i -=1) {
analogWrite(redpin, 1023-(i*(newr/scale)));
analogWrite(greenpin, 1023-(i*(newg/scale)));
analogWrite(bluepin, 1023-(i*(newb/scale)));
delay(delayval);
}
}
void random_fade2() {
int newr = random(1,1023);
int newg = random(1,1023);
int newb = random(1,1023);
int scale = 1023;
float rscale=(oldr-newr)/scale;
float gscale=(oldg-newg)/scale;
float bscale=(oldb-newb)/scale;
for (int i = 0; i <= scale; i +=1) {
analogWrite(redpin, oldr-int(float(i)*rscale));
analogWrite(greenpin, oldg-int(float(i)*gscale));
analogWrite(bluepin, oldb-int(float(i)*bscale));
delay(delayval);
}
oldb = newb;
oldr = newr;
oldg = newg;
}
void random_fade3(int delayval) {
int newr = random(1,1023);
int newg = random(1,1023);
int newb = random(1,1023);
fade_one(delayval, redpin, oldr, newr);
fade_one(delayval, greenpin, oldg, newg);
fade_one(delayval, bluepin, oldb, newb);
oldb = newb;
oldr = newr;
oldg = newg;
}
void fade_one(int delayval, int pin, int oldval, int newval) {
if (oldval > newval) {
for (int x = oldval; x >= newval; x -=1) {
analogWrite(pin, x);
delay (delayval);
}
} else {
for (int x =oldval; x <= newval; x += 1) {
analogWrite(pin,x);
delay (delayval);
}
}
}
void random_blink() {
int newr = random(200,1023);
int newg = random(200,1023);
int newb = random(200,1023);
analogWrite(redpin, newr);
analogWrite(bluepin, newb);
analogWrite(greenpin, newg);
delay(delayval*10);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment