#include <FastLED.h>
#define LED_PIN 5
#define NUM_LEDS 32
#define BRIGHTNESS_PIN A0 // Potentiometer pin for controlling brightness
#define SPEED_PIN A1 // Potentiometer pin for controlling speed
#define BUTTON_PIN 12 // Button pin for cycling animations
#define DIMMER_PIN A2
#define STRIP_PIN 6
#define LED_TYPE WS2812
#define COLOR_ORDER GRB
#define UPDATES_PER_SECOND 100
CRGB leds[NUM_LEDS];
#define MAX_BRIGHTNESS 255
#define MAX_SPEED 128
uint8_t brightness = 128; // Initial brightness value
uint8_t speed = 128; // Initial speed value
#define ANIMATION_DURATION 10000 // Duration of each animation in milliseconds
// Function prototypes
void rainbowAnimation();
void rainbowStripeAnimation();
void purpleAndGreenAnimation();
void blackAndWhiteStripedAnimation();
void randomColorsAnimation();
typedef void (*AnimationFunction)();
AnimationFunction animations[] = {
rainbowAnimation,
rainbowStripeAnimation,
//purpleAndGreenAnimation,
blackAndWhiteStripedAnimation,
randomColorsAnimation
};
int currentAnimation = 0;
unsigned long animationStartTime = 0;
void setup() {
delay(3000); // Power-up safety delay
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(brightness);
pinMode(BRIGHTNESS_PIN, INPUT);
pinMode(SPEED_PIN, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(DIMMER_PIN, INPUT);
pinMode(STRIP_PIN, OUTPUT);
}
void loop() {
brightness = map(analogRead(BRIGHTNESS_PIN), 0, 1023, 0, MAX_BRIGHTNESS);
speed = map(analogRead(SPEED_PIN), 0, 1023, 0, MAX_SPEED);
FastLED.setBrightness(brightness);
animations[currentAnimation]();
if (digitalRead(BUTTON_PIN) == LOW) {
currentAnimation = (currentAnimation + 1) % (sizeof(animations) / sizeof(animations[0]));
delay(500); // Debouncing delay
}
}
void rainbowAnimation() {
uint8_t startIndex = (millis() / speed) % 256;
fill_rainbow(leds, NUM_LEDS, startIndex, 8);
FastLED.show();
delay(1000 / UPDATES_PER_SECOND);
}
void rainbowStripeAnimation() {
uint8_t startIndex = (millis() / speed) % 256;
fill_rainbow(leds, NUM_LEDS, startIndex, 8);
for (int i = 0; i < NUM_LEDS; i += 4) {
leds[i] = CRGB::White;
}
FastLED.show();
delay(1000 / UPDATES_PER_SECOND);
}
/*
void purpleAndGreenAnimation() {
fill_palette(leds, NUM_LEDS, 0, 64, CHSV(HUE_PURPLE, 255, 255), CHSV(HUE_GREEN, 255, 255), LINEARBLEND);
FastLED.show();
delay(1000 / UPDATES_PER_SECOND);
}
*/
void blackAndWhiteStripedAnimation() {
fill_solid(leds, NUM_LEDS, CRGB::Black);
for (int i = 0; i < NUM_LEDS; i += 8) {
fill_solid(leds + i, 4, CRGB::White);
}
FastLED.show();
delay(1000 / UPDATES_PER_SECOND);
}
void randomColorsAnimation() {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CHSV(random8(), 255, 255);
}
FastLED.show();
delay(1000 / UPDATES_PER_SECOND);
}