#include <FastSPI_LED.h>
#define NUM_LEDS 110
#define PIN 11
int switchPin = 8;
struct CRGB { unsigned char b; unsigned char g; unsigned char r;};
struct CRGB *leds;
struct colors { int redVal; int greenVal; int blueVal;};
struct colors red = {255,0,0};
struct colors orange = {255,50,0};
struct colors yellow = {255,225,0};
struct colors green = {0,255,0};
struct colors aqua = {0,245,255};
struct colors blue = {0,0,255};
struct colors purple = {205,0,255};
struct colors white = {255,255,255};
boolean lastButton = LOW;
boolean currentButton = LOW;
boolean buttonClicked = false;
boolean firstPass = true;
int ledMode = 0;
void setup()
{
FastSPI_LED.setLeds(NUM_LEDS);
FastSPI_LED.setChipset(CFastSPI_LED::SPI_WS2801);
FastSPI_LED.setPin(PIN);
pinMode(switchPin, INPUT);
FastSPI_LED.setDataRate(2);
FastSPI_LED.init();
FastSPI_LED.start();
leds = (struct CRGB*)FastSPI_LED.getRGBData();
}
void checkButton(){
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)
{
if(firstPass == false)
{
ledMode = ledMode + 1;
buttonClicked = true;
}
}
else
{
buttonClicked = false;
}
firstPass = false;
lastButton = currentButton;
if (ledMode > 9) ledMode = 0;
}
boolean debounce(boolean last)
{
boolean current = digitalRead(switchPin);
if (last != current)
{
delay(5);
current = digitalRead(switchPin);
}
return current;
}
void loop(){
int r = 0; int g = 0; int b = 0;
switch(ledMode)
{
case 0:
{
struct colors aquaColors[] = {aqua};
rainbow(aquaColors, sizeof(aquaColors)/sizeof(colors));
}
break;
case 1:
{
struct colors redColors[] = {red};
rainbow(redColors, sizeof(redColors)/sizeof(colors));
}
break;
case 2:
{
struct colors orangeColors[] = {orange};
rainbow(orangeColors, sizeof(orangeColors)/sizeof(colors));
}
break;
case 3:
{
struct colors yellowColors[] = {yellow};
rainbow(yellowColors, sizeof(yellowColors)/sizeof(colors));
}
break;
case 4:
{
struct colors greenColors[] = {green};
rainbow(greenColors, sizeof(greenColors)/sizeof(colors));
}
break;
case 5:
{
struct colors blueColors[] = {blue};
rainbow(blueColors, sizeof(blueColors)/sizeof(colors));
}
break;
case 6:
{
struct colors purpleColors[] = {purple};
rainbow(purpleColors, sizeof(purpleColors)/sizeof(colors));
}
break;
case 7:
{
struct colors whiteColors[] = {white};
rainbow(whiteColors, sizeof(whiteColors)/sizeof(colors));
}
break;
case 8:
{
struct colors rainbowColors[] = {red, orange, yellow, green, blue, purple};
rainbow(rainbowColors, sizeof(rainbowColors)/sizeof(colors));
}
break;
case 9:
{
struct colors matchingColors[] = {red, aqua, orange, blue, yellow, green, purple};
rainbow(matchingColors, sizeof(matchingColors)/sizeof(colors));
}
break;
}
}
void rainbow(struct colors colorsf[], int length){
int red = 0;
int green = 0;
int blue = 0;
for(int x = 0; x < length; x++)
{
red = colorsf[x].redVal;
green = colorsf[x].greenVal;
blue = colorsf[x].blueVal;
for(int i = 0; i < NUM_LEDS+1; i++ )
{
int interval = analogRead(A0);
interval = map(interval, 0, 1023, 75, 5);
if(red!=0)
{
leds[i].r = red;
leds[i-1].r = red-20;
leds[i+1].r = red-20;
leds[i-2].r = red-40;
leds[i+2].r = red-40;
}
if(green!=0)
{
leds[i].g = green;
leds[i-1].g = green-20;
leds[i+1].g = green-20;
leds[i-2].g = green-40;
leds[i+2].g = green-40;
}
if(blue!=0)
{
leds[i].b = blue;
leds[i-1].b = blue-20;
leds[i+1].b = blue-20;
leds[i-2].b = blue-40;
leds[i+2].b = blue-40;
}
FastSPI_LED.show();
for(int j = 0; j < i; j++ )
{
if(red>150)
leds[j].r = red-150;
if(red==0)
leds[j].r = 0;
if(green>150)
leds[j].g = green-150;
if(green==0)
leds[j].g = 0;
if(blue>150)
leds[j].b = blue-150;
if(blue==0)
leds[j].b = 0;
}
checkButton();
if(buttonClicked == true)
{
memset(leds, 0, NUM_LEDS * 3);
break;
}
FastSPI_LED.show();
delay(interval);
}
if(buttonClicked == true)
{
memset(leds, 0, NUM_LEDS * 3);
break;
}
}
}