#include #define LED_PIN 1 #define LED_COUNT 15 Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); // Twinkle parameters const uint8_t FULL = 255; const uint8_t MIN_TWINKLE = 50; // how dim a twinkle can go const int MAX_TWINKLE_TIME = 1000; // max ms per twinkle (was 2000) const int MIN_TWINKLE_TIME = 250; // min ms per twinkle (was 500) // Track which LEDs are twinkling bool twinkling[LED_COUNT]; int twinkleStart[LED_COUNT]; int twinkleDuration[LED_COUNT]; int twinkleDirection[LED_COUNT]; // -1 fade down, 1 fade up void setup() { strip.begin(); strip.setBrightness(255); // Start all LEDs full white for (int i = 0; i < LED_COUNT; i++) { strip.setPixelColor(i, FULL, FULL, FULL); twinkling[i] = false; } strip.show(); } void loop() { unsigned long now = millis(); // Start new twinkles randomly for (int i = 0; i < LED_COUNT; i++) { if (!twinkling[i] && random(1000) < 10) { // ~1% chance per frame twinkling[i] = true; twinkleStart[i] = now; twinkleDuration[i] = random(MIN_TWINKLE_TIME, MAX_TWINKLE_TIME); twinkleDirection[i] = -1; // start fading down } } // Update LEDs for (int i = 0; i < LED_COUNT; i++) { if (twinkling[i]) { float t = (float)(now - twinkleStart[i]) / twinkleDuration[i]; if (t >= 1.0) { // Reverse direction twinkleDirection[i] *= -1; twinkleStart[i] = now; t = 0; } uint8_t brightness; if (twinkleDirection[i] == -1) { brightness = FULL - (uint8_t)((FULL - MIN_TWINKLE) * t); } else { brightness = MIN_TWINKLE + (uint8_t)((FULL - MIN_TWINKLE) * t); } strip.setPixelColor(i, brightness, brightness, brightness); // Stop twinkle if fade back complete if (twinkleDirection[i] == 1 && t >= 0.95) { twinkling[i] = false; strip.setPixelColor(i, FULL, FULL, FULL); } } } strip.show(); delay(15); // faster frame rate (was 20) }