55 lines
1.1 KiB
Python
55 lines
1.1 KiB
Python
"""Twinkle NeoPixel demo — self-contained (stdlib + simulated hardware only)."""
|
|
|
|
import random
|
|
import time
|
|
|
|
from machine import Pin
|
|
import neopixel
|
|
|
|
# --- helpers
|
|
|
|
|
|
def _clamp(channel: int) -> int:
|
|
return max(0, min(255, int(channel)))
|
|
|
|
|
|
def twinkle_frame(
|
|
led_count: int,
|
|
frame: int,
|
|
base=(0, 0, 8),
|
|
sparkle=(255, 255, 180),
|
|
sparkles: int = 3,
|
|
seed: int = 1337,
|
|
):
|
|
if led_count <= 0:
|
|
return []
|
|
out = [tuple(_clamp(v) for v in base) for _ in range(led_count)]
|
|
rng = random.Random(seed + frame)
|
|
for _ in range(min(max(0, sparkles), led_count)):
|
|
idx = rng.randrange(led_count)
|
|
out[idx] = tuple(_clamp(v) for v in sparkle)
|
|
return out
|
|
|
|
|
|
# --- demo
|
|
|
|
NUM_LEDS = 16
|
|
|
|
np = neopixel.NeoPixel(Pin(4), NUM_LEDS)
|
|
|
|
for frame in range(120):
|
|
frame_colors = twinkle_frame(
|
|
len(np),
|
|
frame,
|
|
base=(0, 0, 6),
|
|
sparkle=(255, 210, 130),
|
|
sparkles=3,
|
|
)
|
|
for i, color in enumerate(frame_colors):
|
|
np[i] = color
|
|
np.write()
|
|
time.sleep(0.08)
|
|
|
|
np.fill((0, 0, 0))
|
|
np.write()
|