48 lines
1.1 KiB
Python
48 lines
1.1 KiB
Python
"""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()
|