#include <FastLED.h>
#define LED_PIN 6
#define NUM_LEDS 10
#define BUTTON1_PIN 2
#define BUTTON2_PIN 3
#define BUTTON3_PIN 4
CRGB leds[NUM_LEDS];
int button1State = 0;
int button2State = 0;
int button3State = 0;
int brightnessLevel = 255; // Default brightness level (100%)
int button1PressCount = 1; // Tracks Button 1 presses for brightness levels
bool discoActive = false; // Flag to indicate disco effect is active
bool button2Active = false; // Flag to indicate Button 2 fade effect is active
unsigned long phaseStartTime = 0; // To track phase timing
int fadePhase = 0; // Tracks the current phase of the fade cycle
const unsigned long phaseDuration = 120000; // 2 minutes (120,000 ms) for each phase
void setup() {
FastLED.addLeds<NEOPIXEL, LED_PIN>(leds, NUM_LEDS);
pinMode(BUTTON1_PIN, INPUT_PULLUP);
pinMode(BUTTON2_PIN, INPUT_PULLUP);
pinMode(BUTTON3_PIN, INPUT_PULLUP);
fillLEDs(CRGB::White); // Start with white LEDs
FastLED.show();
}
void loop() {
// Read button states
button1State = digitalRead(BUTTON1_PIN);
button2State = digitalRead(BUTTON2_PIN);
button3State = digitalRead(BUTTON3_PIN);
// Button 1 functionality: Adjust brightness levels
if (button1State == LOW) {
delay(50); // Debounce delay
if (digitalRead(BUTTON1_PIN) == LOW) {
button1PressCount++;
if (button1PressCount > 5) {
button1PressCount = 1; // Loop back to 1
}
setBrightness(button1PressCount);
discoActive = false; // Stop disco effect
button2Active = false; // Stop fade effect
while (digitalRead(BUTTON1_PIN) == LOW); // Wait for button release
}
}
// Button 2 functionality: Start fade cycle
if (button2State == LOW && !button2Active && !discoActive) {
button2Active = true;
fadePhase = 0; // Start with fade to red phase
phaseStartTime = millis(); // Start timing for the fade cycle
while (digitalRead(BUTTON2_PIN) == LOW); // Wait for button release
}
if (button2Active) {
fadeCycle(); // Run the fade cycle
}
// Button 3 functionality: Flashing disco effect
if (button3State == LOW && !discoActive && !button2Active) {
discoActive = true; // Set disco effect active
while (digitalRead(BUTTON3_PIN) == LOW); // Wait for button release
}
// Run disco effect if active
if (discoActive) {
discoLights();
}
FastLED.show();
}
// Function to adjust brightness levels for Button 1
void setBrightness(int level) {
switch (level) {
case 1: brightnessLevel = 64; break; // 25%
case 2: brightnessLevel = 128; break; // 50%
case 3: brightnessLevel = 191; break; // 75%
case 4: brightnessLevel = 255; break; // 100%
case 5: brightnessLevel = 0; break; // Off
}
fillLEDs(CRGB::White); // Set LEDs to white at the new brightness level
for (int i = 0; i < NUM_LEDS; i++) {
leds[i].fadeToBlackBy(255 - brightnessLevel);
}
FastLED.show();
}
// Function to handle the fade cycle for Button 2
void fadeCycle() {
unsigned long elapsedTime = millis() - phaseStartTime;
switch (fadePhase) {
case 0: // Fade from white to blood red
if (elapsedTime < phaseDuration) {
float progress = (float)elapsedTime / phaseDuration;
int redValue = 255;
int greenValue = 255 - (255 * progress);
int blueValue = 255 - (255 * progress);
fillLEDs(CRGB(redValue, greenValue, blueValue));
} else {
fadePhase = 1; // Move to hold red phase
phaseStartTime = millis(); // Reset timer
}
break;
case 1: // Hold on blood red
if (elapsedTime < phaseDuration) {
fillLEDs(CRGB::Red);
} else {
fadePhase = 2; // Move to fade to white phase
phaseStartTime = millis(); // Reset timer
}
break;
case 2: // Fade from blood red to white
if (elapsedTime < phaseDuration) {
float progress = (float)elapsedTime / phaseDuration;
int redValue = 255;
int greenValue = 255 * progress;
int blueValue = 255 * progress;
fillLEDs(CRGB(redValue, greenValue, blueValue));
} else {
fadePhase = 3; // Move to hold white phase
phaseStartTime = millis(); // Reset timer
}
break;
case 3: // Hold on white
if (elapsedTime < phaseDuration) {
fillLEDs(CRGB::White);
} else {
fadePhase = 0; // Restart the cycle
phaseStartTime = millis(); // Reset timer
}
break;
}
}
// Function to fill LEDs with a specific color
void fillLEDs(CRGB color) {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = color;
}
}
// Function to handle the disco effect for Button 3
void discoLights() {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB(random(255), random(255), random(255));
}
FastLED.show();
delay(100); // Adjust speed of disco effect
}