neopixel_arcenciel.py

Adafruit Feather nRF52840 Express · Fichier : neopixel_arcenciel.py · Langage : Python · Usage : Arc-en-ciel tournant sur NeoPixel

Le voyant d’ambiance universel : une roue des couleurs calculée par phase (aucune table) balaie rouge-vert-bleu sur le NeoPixel embarqué. Base visuelle de tout projet — l’heure, la température ou l’état réseau deviennent une couleur.

Matériel requis

Une Adafruit Feather nRF52840 Express (SoC nRF52840 Cortex-M4F, BLE 5 / 802.15.4) avec NeoPixel embarqué, LED rouge, 2 Mo de flash QSPI pour le système de fichiers CircuitPython et connecteur batterie LiPo. La Feather seule. Pour un ruban : passer le nombre de pixels à N et câbler DATA sur une broche alimentée en 5 V avec masse commune.

Câblage

Aucun pour le pixel embarqué. Ruban externe : DATA→D5 via résistance 330 Ω, VCC sur VOUT (USB), GND commun, condensateur 1000 µF sur l’alimentation du ruban.

Fonctionnement

La fonction couleur découpe la phase 0-1 en trois segments et interpole les canaux RVB ; la boucle avance la phase de 0,01 toutes les 30 ms, soit un cycle complet de ~3 secondes.

Exécution

CircuitPython (build feather_nrf52840_express) installé via le bootloader UF2 (double reset) ; éditer code.py sur le lecteur CIRCUITPY, console dans Mu/Thonny.

Variantes

Mapper une grandeur (température → bleu-rouge), animer N pixels en décalé pour un chaland, ou synchroniser la couleur avec une notification 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)

← Retour à la fiche