// initialize the library with the numbers of the interface pins LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // (RS, E, D4, D5, D6, D7) // Added for RGB color fader LED int redPin = 9; // Red LED, connected to digital pin 9 int grnPin = 10; // Green LED, connected to digital pin 10 int bluPin = 6; // Blue LED, connected to digital pin 11
// Color arrays int black[3] = { 0, 0, 0 }; int white[3] = { 100, 100, 100 }; int red[3] = { 100, 0, 0 }; int green[3] = { 0, 100, 0 }; int blue[3] = { 0, 0, 100 }; int yellow[3] = { 40, 95, 0 }; int dimWhite[3] = { 30, 30, 30 }; // etc.
// Set initial color int redVal = black[0]; int grnVal = black[1]; int bluVal = black[2];
int wait = 10; // 10ms internal crossFade delay; increase for slower fades int hold = 0; // Optional hold when a color is complete, before the next crossFade int DEBUG = 1; // DEBUG counter; if set to 1, will write values back via serial int loopCount = 60; // How often should DEBUG report? int repeat = 3000; // How many times should we loop before stopping? (0 for no stop) int j = 0; // Loop counter for repeat
// Initialize color variables int prevR = redVal; int prevG = grnVal; int prevB = bluVal;
void setup() { // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Print a message to the LCD. lcd.print("Inspire & Invent"); pinMode(redPin, OUTPUT); // sets the pins as output pinMode(grnPin, OUTPUT); pinMode(bluPin, OUTPUT);
if (DEBUG) { // If we want to see values for debugging... Serial.begin(9600); // ...set up the serial ouput
}
}
void loop() { // set the cursor to column 0, line 1 // (note: line 1 is the second row, since counting begins with 0): // lcd.setCursor(0, 1); // print the number of seconds since reset: // lcd.print("DuinoKit.com ");
if (repeat) { // Do we loop a finite number of times? j += 1; if (j >= repeat) { // Are we there yet? exit(j); // If so, stop. } } }
int calculateStep(int prevValue, int endValue) { int step = endValue - prevValue; // What's the overall gap? if (step) { // If its non-zero, step = 1020 / step; // divide by 1020 } return step; }
int calculateVal(int step, int val, int i) {
if ((step) && i % step == 0) { // If step is non-zero and its time to change a value, if (step > 0) { // increment the value if step is positive... val += 1; } else if (step < 0) { // ...or decrement it if step is negative val -= 1; } }
// Defensive driving: make sure val stays in the range 0-255 if (val > 255) { val = 255; } else if (val < 0) { val = 0; } return val; }
void crossFade(int color[3]) { // Convert to 0-255 int R = (color[0] * 255) / 100; int G = (color[1] * 255) / 100; int B = (color[2] * 255) / 100;
int stepR = calculateStep(prevR, R); int stepG = calculateStep(prevG, G); int stepB = calculateStep(prevB, B);
for (int i = 0; i <= 1020; i++) { redVal = calculateVal(stepR, redVal, i); grnVal = calculateVal(stepG, grnVal, i); bluVal = calculateVal(stepB, bluVal, i);
analogWrite(redPin, redVal); // Write current values to LED pins analogWrite(grnPin, grnVal); analogWrite(bluPin, bluVal);
delay(wait); // Pause for 'wait' milliseconds before resuming the loop
if (DEBUG) { // If we want serial output, print it at the if (i == 0 or i % loopCount == 0) { // beginning, and every loopCount times Serial.print("Loop/RGB: #"); Serial.print(i); Serial.print(" | "); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(redVal); lcd.setCursor(3, 1); lcd.print(" / "); lcd.setCursor(6, 1); lcd.print(" "); lcd.setCursor(6, 1); lcd.print(grnVal); lcd.setCursor(9, 1); lcd.print(" / "); lcd.setCursor(12, 1); lcd.print(" "); lcd.setCursor(12, 1); lcd.print(bluVal); } DEBUG += 1; } } // Update current values for next loop prevR = redVal; prevG = grnVal; prevB = bluVal; delay(hold); // Pause for optional 'wait' milliseconds before resuming the loop }