#include <Adafruit_NeoPixel.h>
#define PIN 6
#define NUMPIXELS 64
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
struct PixelState {
uint8_t r, g, b; // base color
float brightness; // 0.0 to 1.0
int direction; // 1 = fade in, -1 = fade out
unsigned long lastUpdate; // last fade update
int fadeSpeed; // ms between brightness steps
};
PixelState pixelStates[NUMPIXELS];
void setup() {
pixels.begin();
pixels.show();
for (int i = 0; i < NUMPIXELS; i++) {
uint8_t baseBrightness = random(100, 200); // dimmer whites
pixelStates[i].r = baseBrightness;
pixelStates[i].g = baseBrightness;
pixelStates[i].b = baseBrightness;
pixelStates[i].brightness = 0.0;
pixelStates[i].direction = 1; // start fading in
pixelStates[i].lastUpdate = millis();
pixelStates[i].fadeSpeed = random(40, 200); // slower, more natural twinkle
}
}
void loop() {
unsigned long currentMillis = millis();
float overallFactor = 0.7; // scale max brightness to 70%
for (int i = 0; i < NUMPIXELS; i++) {
if (currentMillis - pixelStates[i].lastUpdate >= pixelStates[i].fadeSpeed) {
pixelStates[i].lastUpdate = currentMillis;
// adjust brightness
pixelStates[i].brightness += 0.02 * pixelStates[i].direction;
if (pixelStates[i].brightness >= 1.0) {
pixelStates[i].brightness = 1.0;
pixelStates[i].direction = -1; // start fading out
} else if (pixelStates[i].brightness <= 0.0) {
pixelStates[i].brightness = 0.0;
pixelStates[i].direction = 1; // start fading in again
// pick a new "star" brightness (mostly white)
uint8_t baseBrightness = random(100, 160); // dimmer whites
pixelStates[i].r = baseBrightness;
pixelStates[i].g = baseBrightness;
pixelStates[i].b = baseBrightness;
pixelStates[i].fadeSpeed = random(40, 200); // slower, more natural twinkle
}
// apply brightness scaling with subtle flicker
float flicker = random(95, 105) / 100.0; // 0.95 to 1.05 for gentle flicker
uint8_t rVal = pixelStates[i].r * pixelStates[i].brightness * overallFactor * flicker;
uint8_t gVal = pixelStates[i].g * pixelStates[i].brightness * overallFactor * flicker;
uint8_t bVal = pixelStates[i].b * pixelStates[i].brightness * overallFactor * flicker;
pixels.setPixelColor(i, pixels.Color(rVal, gVal, bVal));
}
}
pixels.show();
}