"""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()