#include <FastLED.h>
#define NUM_LEDS 144 // Number of LEDs in your strip
#define DATA_PIN 6 // Data pin that LED data will be written out over
#define heatzone 30
#define shins 102
#define beat 618
CRGB leds[NUM_LEDS];
void setup() {
pinMode(13, OUTPUT);
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(5);
FastLED.clear();
FastLED.show();
//status flash to confirm readiness
statusLED(250,250);
statusLED(250,250);
statusLED(250,250);
delay(500);
progressiveColorFill(0, NUM_LEDS, CRGB::Red,10);//100
interpolateGradient(0,NUM_LEDS, CRGB::Red, CRGB::Red, CRGB::Blue, CRGB::Red,0,5);
waitForDisconnect(10);
delay(50);
waitForDisconnect(10);
regressiveGradientFill(0,0, NUM_LEDS, CRGB::Red, CRGB::White, 1, 3);
delay(500);
}
void loop() {
progressiveColorFill(0, heatzone, CRGB::Red, 1.5);
progressiveGradientFill(heatzone, 0, 144, CRGB::Red, CRGB::Pink, 0, 2);
CRGB interpolatedColor = interpolateColors(CRGB::Pink, CRGB::Red, 0);
for (int i = 0; i<255; i+=5){
interpolatedColor = interpolateColors(CRGB::Pink, CRGB::Red, i);
fill_gradient(heatzone, 144, CRGB::Red, interpolatedColor);
FastLED.show();
delay(1);
}
for (int i = 0; i<255; i+=5){
interpolatedColor = interpolateColors(CRGB::Red, CRGB::Black, i);
fill_gradient(heatzone, 144, CRGB::Red, interpolatedColor);
FastLED.show();
delay(1);
}
regressiveGradientFill(0,heatzone, NUM_LEDS, CRGB::Red, CRGB::Black, 0, 2);
}
void statusLED(int timeOn, int timeOff) {
digitalWrite(13, HIGH);
delay(timeOn);
digitalWrite(13, LOW);
delay(timeOff);
}
void interpolateGradient(int start, int end, CRGB startColor1, CRGB startColor2, CRGB endColor1, CRGB endColor2, int d, int steps){
bool interpolate1 = false;
bool interpolate2 = false;
if(startColor1 != endColor1){
interpolate1 = true;
}
if(startColor2 != endColor2){
interpolate2 = true;
}
if(interpolate1 && interpolate2){
for (int i = 0; i<255; i+=steps){
fill_gradient(start, end, interpolateColors(startColor1, endColor1, i), interpolateColors(startColor2, endColor2, i));
FastLED.show();
delay(d);
}
} else if(interpolate1){
for (int i = 0; i<255; i+=steps){
fill_gradient(start, end, interpolateColors(startColor1, endColor1, i), endColor2);
FastLED.show();
delay(d);
}
}
else if(interpolate2){
for (int i = 0; i<255; i+=steps){
fill_gradient(start, end, endColor1, interpolateColors(startColor2, endColor2, i));
FastLED.show();
delay(d);
}
}
}
void waitForDisconnect(int pin) {
pinMode(pin, INPUT_PULLUP); // Enable internal pull-up resistor
while(digitalRead(pin) == LOW) { // Wait for the pin to go HIGH
delay(100); // Delay to prevent flooding the CPU
}
}
void fadeSegmentToColor(int start, int end, CRGB targetColor, int d, int steps) {
for (int step = 0; step <= steps; step++) {
for (int i = start; i <= end; i++) {
CRGB currentColor = leds[i];
CRGB newColor = currentColor.lerp8(targetColor, 255 * step / steps);
leds[i] = newColor;
}
FastLED.show();
delay(d); // Wait for 10 milliseconds before updating again
}
}
CRGB interpolateColors(CRGB color1, CRGB color2, uint8_t amount) {
CRGB outputColor;
outputColor.r = lerp8by8(color1.r, color2.r, amount);
outputColor.g = lerp8by8(color1.g, color2.g, amount);
outputColor.b = lerp8by8(color1.b, color2.b, amount);
return outputColor;
}
void progressiveColorFill(int start, int end, CRGB color, int delayTime) {
for (int i = start; i <= end; i++) {
delay(delayTime);
leds[i] = color;
FastLED.show();
}
}
void regressiveFill(int start, int end, CRGB color, int delayTime) {
for (int i = start; i >= end; i--) {
delay(delayTime);
leds[i] = CRGB::Black;
FastLED.show();
}
}
static void progressiveGradientFill(uint8_t begin,uint8_t end1, uint8_t end2, CRGB beginColor, CRGB endColor, uint8_t d, uint8_t iterate) {
for (uint16_t i = end1; i <= end2; i = i + iterate) {
fill_gradient(begin, i, beginColor, endColor);
FastLED.show();
}
}
static void regressiveGradientFill(uint8_t begin,uint8_t end1, uint8_t end2, CRGB beginColor, CRGB endColor, uint8_t d, uint8_t iterate) {
for (uint16_t i = end2; i > end1; i = i - iterate) {
fill_gradient(begin, i, beginColor, endColor);
for(int j = 0; j < iterate; j++ )
{
leds[i+j].setRGB(0,0,0); // Set Color HERE!!!
}
FastLED.show();
}
}
void fill_gradient(int startIndex, int endIndex, CRGB startColor, CRGB endColor) {
int rangeLength = endIndex - startIndex + 1;
for (int i = 0; i < rangeLength; i++) {
float progress = float(i) / float(rangeLength - 1);
int index = startIndex + i;
leds[index].r = lerp8by8(startColor.r, endColor.r, progress * 255);
leds[index].g = lerp8by8(startColor.g, endColor.g, progress * 255);
leds[index].b = lerp8by8(startColor.b, endColor.b, progress * 255);
}
}