#include <FastLED.h>
#include <ClickEncoder.h>
#include <TimerOne.h>
#define DATA_PIN 6
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
#define NUM_LEDS 12
CRGB leds[NUM_LEDS];
#define BRIGHTNESS 120
#define FRAMES_PER_SECOND 120
bool brightnessMode = false;
ClickEncoder *encoder;
int16_t last, value;
void timerIsr() {
encoder->service();
}
//Light Box Colors Travel CCW starting bottom middle.
//Define Gradient Palette up here, create gpattern below loop, add gpattern to simplepatternlist
DEFINE_GRADIENT_PALETTE( PurpleOrange_gp ) {
0, 147, 0, 150, //(purple)
110, 255, 69, 0, //(orange)
255, 147, 0, 150 //(purple)
}; //end PurpleOrange_gp
DEFINE_GRADIENT_PALETTE( GreenMint_gp ) {
0, 50, 205, 50, //lime green
110, 245, 255, 250, //mint cream
255, 50, 205, 50 //lime green
}; //end GreenMint_gp
DEFINE_GRADIENT_PALETTE( BlueWhiteYellow_gp ) {
0, 11, 2, 105, //Beast Blue
30, 11, 2, 105,
90, 200, 200, 180,
110, 200, 200, 180, //White
130, 200, 200, 180,
205, 255, 231, 0,
255, 255, 231, 0 //Belle Yellow
}; //end BlueWhiteYellow_gp
DEFINE_GRADIENT_PALETTE( RedYellowRed_gp ) {
0, 139, 0, 0, // Dark Red
60, 139, 0, 0,
//100, 255, 231, 0,
120, 255, 231, 0,
130, 255, 231, 0, //Belle Yellow
//120, 255, 231, 0,
195, 139, 0, 0,
255, 139, 0, 0 // Dark Red
}; //end RedYellowRed_gp
void setup() {
delay(1000); //sanity delay
Serial.begin(115200);
// tell FastLED about the LED strip configuration
FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
// set master brightness control
FastLED.setBrightness(BRIGHTNESS);
FastLED.setTemperature(0xFF7029);
encoder = new ClickEncoder(2, 3, 4);
Timer1.initialize(1000);
Timer1.attachInterrupt(timerIsr);
last = 5;
}//end of Setup
// List of patterns to cycle through. Each is defined as a separate function below.
typedef void (*SimplePatternList[])();
SimplePatternList gPatterns = {
Yellow,
Red,
PurpleOrange,
GreenMint,
BlueWhiteYellow,
RedYellowRed,
White,
};
// rainbow,
// rainbowWithGlitter,
// confetti,
// sinelon,
// juggle,
// bpm };
uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current
uint8_t gHue = 0; // rotating "base color" used by many of the patterns
void loop() {
value += encoder->getValue();
if (value != last) {
last = value;
if(value > 255)
value = 255; //prevent encoder from exceeding 255
if(value < 0)
value = 0; //prevent encoder from going negative
Serial.print("Brightness Level: ");
Serial.println(value);
static uint8_t BRIGHT = value;
if (brightnessMode == true) {
FastLED.setBrightness(value);
}//end brightness mode
else{
if (last < value) {
Serial.print("Current Pattern # ");
Serial.print(value);
gCurrentPatternNumber = (value);
nextPattern();
}
else {
Serial.print("Current Pattern # ");
Serial.print(value);
prevPattern();
}
}//end pattern mode
}
ClickEncoder::Button b = encoder->getButton();
if (b != ClickEncoder::Open) {
switch (b) {
case ClickEncoder::Clicked:
Serial.println("Button was clicked");
brightnessMode = !brightnessMode;
if (brightnessMode) {
Serial.println("Knob now controls brightness");
} else {
Serial.println("Knob now controls color");
}
break;
}
}
// Call the current pattern function once, updating the 'leds' array
gPatterns[gCurrentPatternNumber]();
// send the 'leds' array out to the actual LED strip
FastLED.show();
// insert a delay to keep the framerate modest
FastLED.delay(1000/FRAMES_PER_SECOND);
}//end of loop
#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0]))
void nextPattern()
{
// add one to the current pattern number, and wrap around at the end
//gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns);
gCurrentPatternNumber = (gCurrentPatternNumber + 1);
if (gCurrentPatternNumber > ARRAY_SIZE(gPatterns)) {
gCurrentPatternNumber = ARRAY_SIZE(gPatterns)+1;
}
}
void prevPattern()
{
gCurrentPatternNumber = (gCurrentPatternNumber - 1);
if (gCurrentPatternNumber > ARRAY_SIZE(gPatterns)) {
gCurrentPatternNumber = ARRAY_SIZE(gPatterns)-1;
}
}
//begin patterns
void Red() {
for(int i=0; i< NUM_LEDS; i++) {
leds[i] = CRGB::Red;
}
for (uint16_t i = 0; i < NUM_LEDS; i++)
{
leds[i].r = dim8_video(leds[i].r);
leds[i].g = dim8_video(leds[i].g);
leds[i].b = dim8_video(leds[i].b);
}
} // end Red
void Yellow() {
for(int i=0; i< NUM_LEDS; i++) {
leds[i] = CRGB::Yellow;
}
for (uint16_t i = 0; i < NUM_LEDS; i++)
{
leds[i].r = dim8_video(leds[i].r);
leds[i].g = dim8_video(leds[i].g);
leds[i].b = dim8_video(leds[i].b);
}
} // end Yellow
void White() {
for(int i=0; i< NUM_LEDS; i++) {
leds[i] = CRGB::White;
}
for (uint16_t i = 0; i < NUM_LEDS; i++)
{
leds[i].r = dim8_video(leds[i].r);
leds[i].g = dim8_video(leds[i].g);
leds[i].b = dim8_video(leds[i].b);
}
} // end White
void RedYellowRed(){
CRGBPalette16 palette = RedYellowRed_gp;
for (int i=0; i< NUM_LEDS; i++) {
leds[i] = ColorFromPalette(palette, i*256/NUM_LEDS);
}
for (uint16_t i = 0; i < NUM_LEDS; i++)
{
leds[i].r = dim8_video(leds[i].r);
leds[i].g = dim8_video(leds[i].g);
leds[i].b = dim8_video(leds[i].b);
}
}//end RedYellowRed
void BlueWhiteYellow(){
CRGBPalette16 palette = BlueWhiteYellow_gp;
for (int i=0; i< NUM_LEDS; i++) {
leds[i] = ColorFromPalette(palette, i*256/NUM_LEDS);
}
for (uint16_t i = 0; i < NUM_LEDS; i++)
{
leds[i].r = dim8_video(leds[i].r);
leds[i].g = dim8_video(leds[i].g);
leds[i].b = dim8_video(leds[i].b);
}
}//end BlueWhiteYellow
void PurpleOrange(){
CRGBPalette16 palette = PurpleOrange_gp;
for (int i=0; i< NUM_LEDS; i++) {
leds[i] = ColorFromPalette(palette, i*256/NUM_LEDS);
}
for (uint16_t i = 0; i < NUM_LEDS; i++)
{
leds[i].r = dim8_video(leds[i].r);
leds[i].g = dim8_video(leds[i].g);
leds[i].b = dim8_video(leds[i].b);
}
}//end Purple Orange
void GreenMint(){
CRGBPalette16 palette = GreenMint_gp;
for (int i=0; i< NUM_LEDS; i++) {
leds[i] = ColorFromPalette(palette, i*256/NUM_LEDS);
}
for (uint16_t i = 0; i < NUM_LEDS; i++)
{
leds[i].r = dim8_video(leds[i].r);
leds[i].g = dim8_video(leds[i].g);
leds[i].b = dim8_video(leds[i].b);
}
}//end GreenMint
void rainbow()
{
// FastLED's built-in rainbow generator
fill_rainbow( leds, NUM_LEDS, 0, 255/NUM_LEDS );
//fill_rainbow( leds, NUM_LEDS, gHue, 7);
}
void rainbowWithGlitter()
{
// built-in FastLED rainbow, plus some random sparkly glitter
rainbow();
addGlitter(80);
}
void addGlitter( fract8 chanceOfGlitter)
{
if( random8() < chanceOfGlitter) {
leds[ random16(NUM_LEDS) ] += CRGB::White;
}
}
void confetti()
{
// random colored speckles that blink in and fade smoothly
fadeToBlackBy( leds, NUM_LEDS, 10);
int pos = random16(NUM_LEDS);
leds[pos] += CHSV( gHue + random8(64), 200, 255);
}
void sinelon()
{
// a colored dot sweeping back and forth, with fading trails
fadeToBlackBy( leds, NUM_LEDS, 20);
int pos = beatsin16( 13, 0, NUM_LEDS-1 );
leds[pos] += CHSV( gHue, 255, 192);
}
void bpm()
{
// colored stripes pulsing at a defined Beats-Per-Minute (BPM)
uint8_t BeatsPerMinute = 62;
CRGBPalette16 palette = PartyColors_p;
uint8_t beat = beatsin8( BeatsPerMinute, 64, 255);
for( int i = 0; i < NUM_LEDS; i++) { //9948
leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10));
}
}
void juggle() {
// eight colored dots, weaving in and out of sync with each other
fadeToBlackBy( leds, NUM_LEDS, 20);
byte dothue = 0;
for( int i = 0; i < 8; i++) {
leds[beatsin16( i+7, 0, NUM_LEDS-1 )] |= CHSV(dothue, 200, 255);
dothue += 32;
}
}