neopixel_arcenciel.py
La lámpara ambiental universal: una rueda de colores calculada por fase (sin tabla) barre rojo-verde-azul en el NeoPixel embarcado. Base visual de todo proyecto: hora, temperatura o estado de red se vuelven color.
Hardware
Una Adafruit Feather nRF52840 Express (nRF52840, BLE 5) con NeoPixel, LED rojo, 2 MB de flash QSPI para CircuitPython y conector LiPo. Solo la Feather. Para una tira: poner el número de píxeles en N y cablear DATA a un pin con 5 V y masa común.
Cableado
Ninguno para el pixel embarcado. Tira externa: DATA→D5 por resistencia de 330 Ω, VCC a VOUT (USB), GND común, condensador de 1000 µF en la alimentación de la tira.
Funcionamiento
La función couleur parte la fase 0-1 en tres segmentos e interpola los canales RGB; el bucle avanza la fase 0,01 cada 30 ms: un ciclo completo en ~3 segundos.
Ejecución
CircuitPython (build feather_nrf52840_express) vía bootloader UF2 (doble reset); editar code.py en la unidad CIRCUITPY.
Variantes
Mapear una magnitud (temperatura → azul-rojo), animar N píxeles desfasados para una persiana, o sincronizar el color con una notificación BLE.
neopixel_arcenciel.py
# Arc-en-ciel tournant sur le NeoPixel embarqué.
# Roue des couleurs : (r, v, b) calculée par phase, sans table.
import time
import board
import neopixel
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=0.3)
def couleur(phase):
# phase 0.0 -> 1.0 : rouge -> vert -> bleu -> rouge
p = phase % 1.0
if p < 1/3:
return (int(765 * p * 3), int(765 * (1 - p * 3)), 0)
if p < 2/3:
q = (p - 1/3) * 3
return (0, int(765 * (1 - q)), int(765 * q))
r = (p - 2/3) * 3
return (int(765 * r), 0, int(765 * (1 - r)))
phase = 0.0
while True:
phase += 0.01
# neopixel attend 0-255 par canal : on divise 0-765 par 3
r, v, b = couleur(phase)
pixel[0] = (r // 3, v // 3, b // 3)
time.sleep(0.03)