#include <Adafruit_NeoPixel.h>
#define PIN 6
#define NUM_PIXELS 6
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUM_PIXELS, PIN, NEO_GRB + NEO_KHZ800);
int currentPixel = 0;
unsigned long previousMillis = 0;
unsigned long interval = 100;
unsigned long totalTime = 25000;
unsigned long startTime;
bool finished = false;
bool fadeStarted = false;
unsigned long fadeStartTime;
unsigned long finishTime;
int pixelBrightness[NUM_PIXELS];
unsigned long pixelStartTime[NUM_PIXELS];
unsigned long pixelLastFadeTime[NUM_PIXELS];
unsigned long fadeInterval = 50;
int fadeSteps = 20;
int fadeAmount = 255 / fadeSteps;
void setup() {
pixels.begin();
startTime = millis();
randomSeed(analogRead(0)); // Seed randomness
}
void loop() {
unsigned long currentMillis = millis();
// Phase 1: Running light pattern
if (currentMillis - previousMillis >= interval && currentMillis - startTime <= totalTime) {
previousMillis += interval;
pixels.setPixelColor(currentPixel, pixels.Color(0, 0, 255));
pixels.show();
pixels.setPixelColor(currentPixel, pixels.Color(0, 0, 0));
currentPixel++;
if (currentPixel >= NUM_PIXELS) currentPixel = 0;
}
if (currentMillis - startTime <= totalTime) {
interval = map(currentMillis - startTime, 0, totalTime, 100, 10);
}
// Phase 2: Turn all white and prep fade
if (!finished && currentMillis - startTime > totalTime) {
finishTime = currentMillis;
startFadeOutRandom(finishTime);
finished = true;
}
// Phase 3: Run the actual fade-out logic
if (fadeStarted) {
fadeOutRandom();
}
}
// === Function: Set up the fade parameters for each pixel ===
void startFadeOutRandom(unsigned long currentTime) {
for (int i = 0; i < NUM_PIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(255, 255, 255));
pixelBrightness[i] = 255;
pixelStartTime[i] = currentTime + random(500, 2500); // Unique start delay per pixel
pixelLastFadeTime[i] = currentTime;
}
pixels.show();
fadeStartTime = currentTime;
fadeStarted = true;
}
// === Function: Fade out pixels individually with random timing ===
void fadeOutRandom() {
unsigned long currentMillis = millis();
bool anyStillFading = false;
for (int i = 0; i < NUM_PIXELS; i++) {
if (currentMillis >= pixelStartTime[i] && pixelBrightness[i] > 0) {
if (currentMillis - pixelLastFadeTime[i] >= fadeInterval) {
pixelBrightness[i] -= fadeAmount;
if (pixelBrightness[i] < 0) pixelBrightness[i] = 0;
pixels.setPixelColor(i, pixels.Color(pixelBrightness[i], pixelBrightness[i], pixelBrightness[i]));
pixelLastFadeTime[i] = currentMillis;
}
}
if (pixelBrightness[i] > 0) {
anyStillFading = true;
}
}
if (anyStillFading) {
pixels.show();
} else {
fadeStarted = false; // Optional: Stop calling the function once fully faded
}
}