Skip to content

Instantly share code, notes, and snippets.

@nbergont
Last active December 24, 2018 09:20
Show Gist options
  • Save nbergont/8f5e706d4516e45ed7c16fd68620cc56 to your computer and use it in GitHub Desktop.
Save nbergont/8f5e706d4516e45ed7c16fd68620cc56 to your computer and use it in GitHub Desktop.
fastled light for stairs
#include <FastLED.h>
#if defined(FASTLED_VERSION) && (FASTLED_VERSION < 3001000)
#warning "Requires FastLED 3.1 or later; check github for latest code."
#endif
#define NUM_LEDS 150
#define DATA_PIN 3
#define BRIGHTNESS 150
#define FRAMES_PER_SECOND 60
#define DETECT_TOP 4
#define DETECT_DOWN 5
#define FADE_DURATION 2500 //2.5s
#define LIGHT_DURATION 6000 //6s
#define FADE_LEDS 30
#define FADE_COEF ((NUM_LEDS*2)/FADE_LEDS)
#define FADE_MAX (NUM_LEDS*FADE_COEF+255)
typedef uint8_t (*fadeFunc)(int, int, uint8_t);
// Define the array of leds
CRGB leds[NUM_LEDS];
enum{
WAIT_INPUT,
FADE_ON,
LIGHT_ON,
FADE_OFF
} state;
typedef enum{
TOP2DOWN,
DOWN2TOP,
NONE
} edir;
unsigned long startTime = 0;
CRGBPalette16 palette;
uint8_t index = 0;
edir current_dir = NONE; //Current direction
void setup() {
delay(500); //Startup delay
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
FastLED.setCorrection(TypicalLEDStrip);
//FastLED.setTemperature(HighNoonSun); // Candle Tungsten40W Tungsten100W Halogen CarbonArc HighNoonSun DirectSunlight OvercastSky ClearBlueSky StandardFluorescent
startTime = millis();
state = WAIT_INPUT;
CRGB wb = 0x1F1F1F;
palette = CRGBPalette16(
wb, CRGB::White, wb, CRGB::White,
wb, CRGB::White, wb, CRGB::White,
wb, CRGB::White, wb, CRGB::White,
wb, CRGB::White, wb, CRGB::White);
}
void loop() {
unsigned long elapsedTime = millis() - startTime;
switch(state)
{
case WAIT_INPUT:
fill_solid(leds, NUM_LEDS, CRGB::Black);
//Dectect PIR
current_dir = detectPIR();
if(current_dir != NONE)
{
startTime = millis();
state = FADE_ON;
}
break;
case FADE_ON:
if(elapsedTime > FADE_DURATION)
{
startTime = millis();
state = LIGHT_ON;
}
else
{
computeLeds();
if(current_dir == TOP2DOWN)
fadeOn(elapsedTime, fadeOnLeft);
else //DOWN2TOP
fadeOn(elapsedTime, fadeOnRight);
}
break;
case LIGHT_ON:
if(elapsedTime > LIGHT_DURATION)
{
startTime = millis();
state = FADE_OFF;
}
else
{
computeLeds();
if(detectPIR() != NONE) //Reset timer while detection
startTime = millis();
}
break;
case FADE_OFF: //Fade Off
if(elapsedTime > FADE_DURATION)
{
startTime = millis();
state = WAIT_INPUT;
}
else
{
computeLeds();
if(current_dir == TOP2DOWN)
fadeOff(elapsedTime, fadeOffLeft);
else //DOWN2TOP
fadeOff(elapsedTime, fadeOffRight);
}
break;
}
//Show leds
FastLED.show();
FastLED.delay(1000/FRAMES_PER_SECOND);
}
char detectPIR(){
if(digitalRead(DETECT_TOP) == HIGH)
return TOP2DOWN;
else if(digitalRead(DETECT_DOWN) == HIGH)
return DOWN2TOP;
return NONE;
}
void computeLeds(){
//fill_solid(leds, NUM_LEDS, CRGB::White);
//OceanColors_p CloudColors_p ForestColors_p RainbowColors_p
for( uint16_t i = 0; i < NUM_LEDS; i++) {
leds[i] = blend( ColorFromPalette(palette, i*2+index), ColorFromPalette(palette, NUM_LEDS - i+index), 128);
}
EVERY_N_MILLISECONDS(60) { index++; }
}
void fadeOn(unsigned long elapsedTime, fadeFunc func){
int frame = (FADE_MAX*elapsedTime)/FADE_DURATION;
int bright = dim8_raw((255*elapsedTime)/FADE_DURATION);
for(int i=0; i<NUM_LEDS; i++)
leds[i].nscale8(func(i, frame, bright));
}
void fadeOff(unsigned long elapsedTime, fadeFunc func){
int frame = (FADE_MAX*elapsedTime)/FADE_DURATION;
int bright = dim8_raw(255 - (255*elapsedTime)/FADE_DURATION);
for(int i=0; i<NUM_LEDS; i++)
leds[i].nscale8(func(i, frame, bright));
}
inline uint8_t fadeOffLeft(int led, int frame, uint8_t bright){
return constrain(led*FADE_COEF - frame + bright, 0, bright);
}
inline uint8_t fadeOnLeft(int led, int frame, uint8_t bright){
return bright - fadeOffLeft(led, frame, bright);
}
inline uint8_t fadeOffRight(int led, int frame, uint8_t bright){
return bright - fadeOffLeft(led, FADE_MAX - frame, bright);
}
inline uint8_t fadeOnRight(int led, int frame, uint8_t bright){
return fadeOffLeft(led, FADE_MAX - frame, bright);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment