"""Rainbow NeoPixel sweep — self-contained (stdlib + simulated hardware only).""" import time from machine import Pin import neopixel # --- helpers (same logic as bundled led_patterns.py, inlined here) def _clamp(channel: int) -> int: return max(0, min(255, int(channel))) def wheel(pos: int): """Return rainbow RGB at position 0–255.""" pos = 255 - (pos & 255) if pos < 85: return (_clamp(255 - pos * 3), 0, _clamp(pos * 3)) if pos < 170: pos -= 85 return (0, _clamp(pos * 3), _clamp(255 - pos * 3)) pos -= 170 return (_clamp(pos * 3), _clamp(255 - pos * 3), 0) def rainbow_frame(led_count: int, frame: int, step: int = 4): if led_count <= 0: return [] return [wheel((i * 256 // led_count + frame * step) & 255) for i in range(led_count)] # --- demo NUM_LEDS = 16 np = neopixel.NeoPixel(Pin(4), NUM_LEDS) for frame in range(120): frame_colors = rainbow_frame(len(np), frame, step=5) for i, color in enumerate(frame_colors): np[i] = color np.write() time.sleep(0.05) np.fill((0, 0, 0)) np.write()