#include <FastLED.h>
#define NUM_LEDS 60
#define redPin 9
#define greenPin 10
#define bluePin 11
#define redButton A0
#define greenButton A1
#define blueButton A2
#define whiteButton A3
#define centerOff A5
#define PIN 13
int redState = 0; //Status of button press for R,G,B,and W
int greenState = 0;
int blueState = 0;
int whiteState = 0;
int centerState = 0;
int redStateOld = 0; // Previous status of button press for R,G,B, and W
int greenStateOld = 0;
int blueStateOld = 0;
int whiteStateOld = 0;
int whichMode = 1; //Which RGB strip mode are we seeing
int whichModeOld = 1; //What was the previous RGB strip mode
int centerLED; //Used as a marker for the RGB scripts to modify the center LED as well
int breaker = 0;
char inCommand = 0;
CRGB leds[NUM_LEDS]; //FastLed call for how many LED's on the strip
void setup() {
Serial.begin(9600);
Serial.write("starting...");
Serial.println();
FastLED.addLeds<WS2812B, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); //Setup for the FastLED functions
pinMode(redPin, OUTPUT); //Pin modes for buttons and LEDs
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(redButton, INPUT);
pinMode(greenButton, INPUT);
pinMode(blueButton, INPUT);
pinMode(whiteButton, INPUT);
pinMode(centerOff, INPUT);
pinMode(13, OUTPUT);
}
void loop() {
breaker = 0;
if(whichMode == 1){
rainbowCycle(20); //(delay)
}
else if(whichMode == 2){
RunningLights(0xff,0,0xff,100); //(redAmount,greenAmount,blueAmount,speed)
}
else if(whichMode == 3){
Fire(25,60,25); //(cooling/speed at which the flames subside, Sparking/ split off trails, SpeedDelay/ slow down fire with higher value)
}
else if(whichMode == 4){
Sparkle(random(255), random(255), random(255), 100); //(Random, or Hex color x3, delay)
}
else if(whichMode == 5){
theaterChaseRainbow(150); //(speed delay)
}
else {
setAll(0,0,0); //if no mode set for the RGB strip, turn them all off (Currently unused, off is the switch on the cord.)
}
}
//FastLED Modes
//(1)RainbowCycle start
void rainbowCycle(int SpeedDelay) {
byte *c;
uint16_t i, j;
for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
if (breaker == 1){break; loop();}
if(whiteStateOld == 1){ //If the white mode for the center LED is on, change it's color too
setColor(*c/2, *(c+2/2), *(c+4/2));
}
for(i=0; i< NUM_LEDS; i++) {
c=Wheel(((i * 256 / NUM_LEDS) + j) & 255);
setPixel(i, *c, *(c+1), *(c+2));
lightControl(); //check inputs
}
showStrip();
delay(SpeedDelay);
}
}
//RainbowCycle end
//(2)RunningLights start
void RunningLights(byte red, byte green, byte blue, int WaveDelay) {
int Position=0;
for(int j=0; j<NUM_LEDS*2; j++){
if (breaker == 1){break; loop();}
lightControl(); //check inputs
Position++; // = 0; //Position + Rate;
for(int i=0; i<NUM_LEDS; i++) {
// sine wave, 3 offset waves make a rainbow!
//float level = sin(i+Position) * 127 + 128;
//setPixel(i,level,0,0);
//float level = sin(i+Position) * 127 + 128;
setPixel(i,((sin(i+Position) * 127 + 128)/255)*red,
((sin(i+Position) * 127 + 128)/255)*green,
((sin(i+Position) * 127 + 128)/255)*blue);
}
showStrip();
delay(WaveDelay);
}
}
//RunningLights end
//(3)Fire start
void Fire(int Cooling, int Sparking, int SpeedDelay) {
static byte heat[NUM_LEDS];
int cooldown;
int centerHeat;
// Step 1. Cool down every cell a little
for( int i = 0; i < NUM_LEDS; i++) {
if (breaker == 1){break; loop();}
lightControl(); //check inputs
cooldown = random(0, ((Cooling * 10) / NUM_LEDS) + 2);
if(cooldown>heat[i]) {
heat[i]=0;
} else {
heat[i]=heat[i]-cooldown;
}
}
// Step 2. Heat from each cell drifts 'up' and diffuses a little
for( int k= NUM_LEDS - 1; k >= 2; k--) {
if (breaker == 1){break; loop();}
lightControl(); //check inputs
heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2]) / 3;
}
// Step 3. Randomly ignite new 'sparks' near the bottom
if( random(255) < Sparking ) {
int y = random(7);
heat[y] = heat[y] + random(160,255);
//heat[y] = random(160,255);
}
// Step 4. Convert heat to LED colors
for( int j = 0; j < NUM_LEDS; j++) {
if (breaker == 1){break; loop();}
lightControl(); //check inputs
setPixelHeatColor(j, heat[j] );
if(redStateOld == 1 && (j ==3)){ //if center LED red mode is active, allow changing of it's color
setPixelHeatColor(centerLED, heat[j]);
}
}
showStrip();
delay(SpeedDelay);
}
void setPixelHeatColor (int Pixel, byte temperature) {
// Scale 'heat' down from 0-255 to 0-191
byte t192 = round((temperature/255.0)*191);
// calculate ramp up from
byte heatramp = t192 & 0x3F; // 0..63
heatramp <<= 2; // scale up to 0..252
// figure out which third of the spectrum we're in:
if(t192 > 0x80) { // hottest
if(Pixel == centerLED && (redStateOld == 1)){setColor(255,100,heatramp/8);} //control for the center LED color
else{setPixel(Pixel, 255, 255, heatramp);}
} else if(t192 > 0x40) { // middle
if(Pixel == centerLED && (redStateOld == 1)){setColor(heatramp+20,heatramp/4,0);} //control for the center LED color
else{setPixel(Pixel, 255, heatramp, 0);}
} else { // coolest
if(Pixel == centerLED && (redStateOld == 1)){setColor(heatramp+35,2,0);} //control for the center LED color
else{setPixel(Pixel, heatramp, 0, 0);}
}
}
//Fire end
//(4)Sparkle start
void Sparkle(byte red, byte green, byte blue, int SpeedDelay) {
lightControl(); //check inputs
int Pixel = random(NUM_LEDS);
setPixel(Pixel,red,green,blue);
showStrip();
delay(SpeedDelay);
setPixel(Pixel,0,0,0);
}
//Sparkle end
//(5)TheaterChaseRainbow start
void theaterChaseRainbow(int SpeedDelay) {
byte *c;
for (int j=0; j < 256; j++) { // cycle all 256 colors in the wheel
lightControl(); //check inputs
if (breaker == 1){break; loop();}
if (whiteStateOld == 1){
setColor(*c, *(c+1), *(c+2));
}
for (int q=0; q < 3; q++) {
if (breaker == 1){break; loop();}
for (int i=0; i < NUM_LEDS; i=i+3) {
if (breaker == 1){break; loop();}
lightControl(); //check inputs
c = Wheel( (i+j) % 255);
setPixel(i+q, *c, *(c+1), *(c+2)); //turn every third pixel on
}
showStrip();
delay(SpeedDelay);
for (int i=0; i < NUM_LEDS; i=i+3) {
if (breaker == 1){break; loop();}
setPixel(i+q, 0,0,0); //turn every third pixel off
}
}
}
}
//TheaterChaseRainbow end
//FastLED pre-setup
void showStrip() {
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
strip.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
FastLED.show();
#endif
}
void setPixel(int Pixel, byte red, byte green, byte blue) {
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
strip.setPixelColor(Pixel, strip.Color(red, green, blue));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
leds[Pixel].r = red;
leds[Pixel].g = green;
leds[Pixel].b = blue;
#endif
}
void setAll(byte red, byte green, byte blue) {
for(int i = 0; i < NUM_LEDS; i++ ) {
setPixel(i, red, green, blue);
}
showStrip();
}
byte * Wheel(byte WheelPos) {
static byte c[3];
if(WheelPos < 85) {
c[0]=WheelPos * 3;
c[1]=255 - WheelPos * 3;
c[2]=0;
} else if(WheelPos < 170) {
WheelPos -= 85;
c[0]=255 - WheelPos * 3;
c[1]=0;
c[2]=WheelPos * 3;
} else {
WheelPos -= 170;
c[0]=0;
c[1]=WheelPos * 3;
c[2]=255 - WheelPos * 3;
}
return c;
}
//end FastLED pre-setup
//Center RGB LED Control
void lightControl(){
redState = digitalRead(redButton);
greenState = digitalRead(greenButton);
blueState = digitalRead(blueButton);
whiteState = digitalRead(whiteButton);
centerState = digitalRead(centerOff);
if(Serial.available()>0){ //Monitor Serial Input for a command
inCommand = Serial.read();
serialInput(inCommand); //Goto function to execute Serial Command
}
//Comparing button presses, and setting correct modes
if(redState == 1 && (centerState != 1 )){ Serial.write("redState1 "); Serial.println(); setColor(255,0,0); delay(250); redStateOld = redState; greenStateOld = 0; blueStateOld = 0; whiteStateOld = 0;}
else if(greenState == 1 && (centerState != 1 )){ Serial.write("greenState 1"); Serial.println(); setColor(0,255,0); delay(250); redStateOld = 0; greenStateOld = greenState; blueStateOld = 0; whiteStateOld = 0;}
else if(blueState == 1 && (centerState != 1 )){ Serial.write("blueState 1"); Serial.println(); setColor(0,0,255); delay(250); redStateOld = 0; greenStateOld = 0; blueStateOld = blueState; whiteStateOld = 0;}
else if(whiteState == 1 && (centerState != 1 )){ Serial.write("whiteState 1"); Serial.println(); setColor(255,255,255); delay(250); redStateOld = 0; greenStateOld = 0; blueStateOld = 0; whiteStateOld = whiteState; }
else if(whichMode < 5 && (centerState == 1 && (greenState == 1 ))){
breaker = 1;
Serial.write("RGB Strip mode +");
Serial.println();
whichModeOld = whichMode;
whichMode++;
setRGBStrip(whichMode);
delay(300);
}
else if(whichMode > 1 && (centerState == 1 && (redState == 1))){
breaker = 1;
Serial.write("RGB Strip mode -");
Serial.println();
whichModeOld = whichMode;
whichMode--;
setRGBStrip(whichMode);
delay(300);
}
else if(centerState == 1){
setColor(0,0,0);
redStateOld = 0;
greenStateOld = 0;
blueStateOld = 0;
whiteStateOld = 0;
}
}
void setRGBStrip(int mode){
Serial.print(whichMode);
Serial.println();
clearSelect();
if(mode == 0){ setAll(0,0,0); }
else if(mode == 1){ Serial.write("starting rainbow"); Serial.println(); }
else if(mode == 2){ Serial.write("starting running lights"); Serial.println(); }
else if(mode == 3){ Serial.write("starting fire"); Serial.println(); }
else if(mode == 4){ Serial.write("starting sparkle"); Serial.println(); }
else if(mode == 5){ Serial.write("starting theater rainbow run"); Serial.println(); }
}
void serialInput(char command){ //Check for character input on Serial bus, Perform the corrosponding command.
if(command == '1'){
breaker = 1;
whichMode = 1;
setRGBStrip(whichMode);
}
else if(command == '2'){
breaker = 1;
whichMode = 2;
setRGBStrip(whichMode);
}
else if(command == '3'){
breaker = 1;
whichMode = 3;
setRGBStrip(whichMode);
}
else if(command == '4'){
breaker = 1;
whichMode = 4;
setRGBStrip(whichMode);
}
else if(command == '5'){
breaker = 1;
whichMode = 5;
setRGBStrip(whichMode);
}
else if(command == 'w'){
if(whiteStateOld == 0){
clearSelect();
whiteStateOld = 1;
setColor(255,255,255);
}
else if(whiteStateOld == 1){
whiteStateOld = 0;
setColor(0,0,0);
}
Serial.write("Toggle White LED ");
Serial.print(whiteStateOld);
Serial.println();
}
else if(command == 'r'){
if(redStateOld == 0 ){
clearSelect();
setColor(255,0,0);
redStateOld = 1;
}
else if(redStateOld == 1 ){
setColor(0,0,0);
redStateOld = 0;
}
Serial.write("Toggle Red LED ");
Serial.print(redStateOld);
Serial.println();
}
else if(command == 'g'){
if(greenStateOld == 0 ){
clearSelect();
setColor(0,255,0);
greenStateOld = 1;
}
else if(greenStateOld == 1 ){
setColor(0,0,0);
greenStateOld = 0;
}
Serial.write("Toggle Green LED ");
Serial.print(greenStateOld);
Serial.println();
}
else if(command == 'b'){
if(blueStateOld == 0 ){
clearSelect();
setColor(0,0,255);
blueStateOld = 1;
}
else if(blueStateOld == 1 ){
setColor(0,0,0);
blueStateOld = 0;
}
Serial.write("Toggle Blue LED ");
Serial.print(blueStateOld);
Serial.println();
}
}
void clearSelect(){
setAll(0,0,0);
redStateOld = 0;
greenStateOld = 0;
blueStateOld = 0;
whiteStateOld = 0;
setColor(0,0,0);
}
void setColor(int redValue, int greenValue, int blueValue) {
analogWrite(redPin, redValue);
analogWrite(greenPin, greenValue);
analogWrite(bluePin, blueValue);
}