# Uses built-in neopixel module
from machine import Pin
import neopixel
import time
PIXEL_PIN = 15
NUM_PIXELS = 16
np = neopixel.NeoPixel(Pin(PIXEL_PIN, Pin.OUT), NUM_PIXELS)
# --- helpers -------------------------------------------------------------
def hsv_to_rgb(h, s=255, v=255):
# h: 0..65535, s/v: 0..255
h = h % 65536
region = (h * 6) // 65536
f = (h * 6) - region * 65536
p = (v * (255 - s)) // 255
q = (v * (255 - (s * f // 65535))) // 255
t = (v * (255 - (s * (65535 - f) // 65535))) // 255
if region == 0:
return v, t, p
if region == 1:
return q, v, p
if region == 2:
return p, v, t
if region == 3:
return p, q, v
if region == 4:
return t, p, v
return v, p, q
def gamma8(x):
return int(((x / 255) ** 2.8) * 255 + 0.5)
def gamma_rgb(r, g, b):
return gamma8(r), gamma8(g), gamma8(b)
# --- main loop -----------------------------------------------------------
hue = 0 # 0..65535
while True:
for i in range(NUM_PIXELS):
h = hue + i * (65535 // NUM_PIXELS)
r, g, b = hsv_to_rgb(h)
np[i] = gamma_rgb(r, g, b)
np.write()
hue = (hue + 512) & 0xFFFF # animation speed
time.sleep_ms(20)