#include <FastLED.h>
#define LED_PIN 5
#define NUM_LEDS 60
#define BRIGHTNESS 64
#define LED_TYPE WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
#define FRAMES_PER_SECOND 120
#define COOLING 18
#define SPARKING 120
bool gReverseDirection = false;
CRGBPalette16 currentPalette;
TBlendType currentBlending;
static uint8_t fadeAmount = 0;
typedef void (*SimplePatternList[])();
uint8_t gCurrentPatternNumber; // Index number of which pattern is current
uint8_t gHue = 0; // rotating "base color" used by many of the patterns
int nextButton = 2;
int fireworksButton = 4;
int lastnextButtonState = 0;
int lastfireworksButtonState = 0;
void setup() {
Serial.begin(115200);
Serial.println("Resetting");
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.setBrightness( BRIGHTNESS );
gCurrentPatternNumber=0;
pinMode(nextButton, INPUT_PULLUP);
pinMode(fireworksButton, INPUT_PULLUP);
}
/*
sinelon: speed is 13
*/
void greenLoop () {
int greenBright[15];
int greenPos=0;
int greenStart=40;
int greenLow=40;
int greenHigh=40;
for (int i = 0; i < 15;i++)
{
int ran = random8(0,2);
if(i==0) {
greenBright[i] = greenStart;
} else {
if(ran==0) {
greenBright[i] = ++greenLow;
} else {
greenBright[i] = --greenHigh;
}
}
}
for (int i = 0; i < 15; i ++)
{
Serial.print("_" + String(greenBright[i]));
}
while(true)
{
for (int i = 0; i < NUM_LEDS; i++)
{
if (random8(0,10) > 5)
{
leds[i].fadeToBlackBy(25);
}
}
for(int i = 0; i < greenPos; i++)
{
uint8_t beat = beatsin8( 255-, 30,255, i*100+40,);
leds[greenBright[i]] = CHSV(96, 255, beat);
}
if(greenPos < 15)
{
greenPos++;
}
Serial.print(".");
FastLED.delay(50);
}
}
void twinkle()
{
fill_solid( leds, NUM_LEDS, CRGB::Black);
addGlitter(80);
}
void rainbow()
{
// FastLED's built-in rainbow generator
fill_rainbow( leds, NUM_LEDS, gHue, 7);
addGlitter(80);
}
void addGlitter( fract8 chanceOfGlitter)
{
if( random8() < chanceOfGlitter) {
leds[ random16(NUM_LEDS) ] += CRGB::White;
}
}
void fadeToBlack(){
for(int i = 0;i < 30; i++)
{
fadeToBlackBy(leds, NUM_LEDS, 5);
FastLED.delay(1000 / FRAMES_PER_SECOND);
}
}
#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0]))
CRGBPalette16 gPal;
SimplePatternList gPatterns = {greenLoop, rainbow, twinkle };
void nextPattern()
{
Serial.println("nextPatternCalled");
// add one to the current pattern number, and wrap around at the end
gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns);
}
void loop()
{
int nextButtonState = digitalRead(nextButton);
if(nextButtonState != lastnextButtonState){
if (digitalRead(nextButton) == LOW){
nextPattern();
Serial.print("Next");
}
}
int fireworksButtonState = digitalRead(fireworksButton);
if(fireworksButtonState != lastfireworksButtonState){
if (digitalRead(fireworksButton) == LOW){
Serial.print("fire");
}
Serial.print("fireEnd");
}
gPatterns[gCurrentPatternNumber]();
if ( fadeAmount >0)
{
fadeAmount--;
}
fadeToBlackBy(leds, NUM_LEDS, fadeAmount);
FastLED.show();
// explode
// wait before sending up another
//delay(random16(500, 1000));
FastLED.delay(1000 / FRAMES_PER_SECOND);
EVERY_N_MILLISECONDS( 5 ) { gHue++; }
EVERY_N_MILLISECONDS( 500 ) { Serial.println("gCurrentPatternNumber: " + String(gCurrentPatternNumber)); }
lastnextButtonState = nextButtonState;
lastfireworksButtonState = fireworksButtonState;
}
// There are several different palettes of colors demonstrated here.
//
// FastLED provides several 'preset' palettes: RainbowColors_p, RainbowStripeColors_p,
// OceanColors_p, CloudColors_p, LavaColors_p, ForestColors_p, and PartyColors_p.
//
// Additionally, you can manually define your own color palettes, or you can write
// code that creates color palettes on the fly. All are shown here.