LED_Handler

drivers
drivers/LED_Handler.h
driver stable stable

Driver: LED_Handler Pilote d'un bandeau de LEDs adressables (NeoPixel / WS2812). Fonctionnalités : être appelée à chaque tour de loop() pour faire progresser les effets animés (rainbow / fade). Sans appel régulier à update(),

Méthodes publiques

Méthode Description Paramètres Retour
LED_Handler()
LED_Handler(uint8_t pin = CREPP_LED_PIN, uint16_t count = CREPP_LED_COUNT);
Construit le bandeau de LEDs. / pin: Broche de données du bandeau (défaut: macro LED_PIN)
count: Nombre de LEDs du bandeau (défaut: macro LED_COUNT) /
LED_Handler()
LED_Handler();
begin()
begin();
Initialise le bandeau et l'éteint (toutes LEDs à noir). /
update()
update();
Fait progresser les animations en cours (rainbow / fade). A appeler à chaque tour de loop(). /
setPixel()
setPixel(uint16_t index, uint8_t r, uint8_t g, uint8_t b);
Définit la couleur d'un pixel à partir de ses composantes RGB. / index: Indice du pixel (0 à count-1)
r: Composante rouge (0-255)
g: Composante verte (0-255)
b: Composante bleue (0-255) /
setPixel()
setPixel(uint16_t index, uint32_t color);
Définit la couleur d'un pixel à partir d'une valeur 32 bits (0xRRGGBB). / index: Indice du pixel (0 à count-1)
color: Couleur au format 0xRRGGBB /
clear()
clear();
Éteint tous les pixels du bandeau (noir). /
setBrightness()
setBrightness(uint8_t brightness);
Règle la luminosité globale du bandeau. / brightness: Luminosité (0 = éteint, 255 = maximum) /
startRainbow()
startRainbow(uint16_t speed = 10);
Démarre un effet arc-en-ciel animé et non bloquant. / speed: Délai entre 2 pas de l'animation, en ms (défaut: 10)
stopRainbow()
stopRainbow();
Arrête l'effet arc-en-ciel en cours. /
smoothToColor()
smoothToColor(uint8_t r, uint8_t g, uint8_t b, uint16_t duration);
Lance un fondu progressif et non bloquant vers une couleur cible. / r: Composante rouge cible (0-255)
g: Composante verte cible (0-255)
b: Composante bleue cible (0-255)
duration: Durée totale du fondu, en ms

Méthodes privées


            wheel(uint8_t pos);;
lerp(uint8_t a, uint8_t b, float t);;

                    

Variables membres


            Adafruit_NeoPixel _strip;
uint32_t _fadeStartColor;
uint32_t _fadeTargetColor;
long _fadeStartTime;
uint16_t _fadeDuration;

                    

Code source


        #pragma once

#include <Arduino.h>
#include <Adafruit_NeoPixel.h>
#include "../StatusDevice.h"

#ifndef CREPP_LED_PIN
#define CREPP_LED_PIN 17
#endif

#ifndef CREPP_LED_COUNT
#define CREPP_LED_COUNT 8   //Nombre de LEDs dans la bande
#endif

namespace crepp::drivers {

/*
 * =========================
 * Driver: LED_Handler
 * -------------------------
 * Pilote d'un bandeau de LEDs adressables (NeoPixel / WS2812).
 *
 * @badge driver
 * @badge stable
 *
 * Fonctionnalités :
 * - Contrôle individuel des pixels (couleur RGB ou valeur 32 bits)
 * - Réglage de la luminosité globale
 * - Effet arc-en-ciel animé (non bloquant, piloté via update())
 * - Fondu de couleur progressif (non bloquant, piloté via update())
 *
 * @note begin() doit être appelé une fois dans setup(), et update() doit
 *       être appelée à chaque tour de loop() pour faire progresser les
 *       effets animés (rainbow / fade). Sans appel régulier à update(),
 *       les animations démarrées restent figées.
 * =========================
 */
class LED_Handler {
public:
    /**
     * @brief Construit le bandeau de LEDs.
     * @param pin Broche de données du bandeau (défaut: macro LED_PIN)
     * @param count Nombre de LEDs du bandeau (défaut: macro LED_COUNT)
     */
    LED_Handler(uint8_t pin = CREPP_LED_PIN, uint16_t count = CREPP_LED_COUNT);
    ~LED_Handler();

    /**
     * @brief Initialise le bandeau et l'éteint (toutes LEDs à noir).
     */
    void begin();

    /**
     * @brief Fait progresser les animations en cours (rainbow / fade).
     *        A appeler à chaque tour de loop().
     */
    void update();   // à appeler dans loop()

    // Contrôle individuel
    /**
     * @brief Définit la couleur d'un pixel à partir de ses composantes RGB.
     * @param index Indice du pixel (0 à count-1)
     * @param r Composante rouge (0-255)
     * @param g Composante verte (0-255)
     * @param b Composante bleue (0-255)
     */
    void setPixel(uint16_t index, uint8_t r, uint8_t g, uint8_t b);

    /**
     * @brief Définit la couleur d'un pixel à partir d'une valeur 32 bits (0xRRGGBB).
     * @param index Indice du pixel (0 à count-1)
     * @param color Couleur au format 0xRRGGBB
     */
    void setPixel(uint16_t index, uint32_t color);

    /**
     * @brief Éteint tous les pixels du bandeau (noir).
     */
    void clear();

    // Luminosité globale
    /**
     * @brief Règle la luminosité globale du bandeau.
     * @param brightness Luminosité (0 = éteint, 255 = maximum)
     */
    void setBrightness(uint8_t brightness);

    // Effets
    /**
     * @brief Démarre un effet arc-en-ciel animé et non bloquant.
     * @param speed Délai entre 2 pas de l'animation, en ms (défaut: 10)
     * @note Nécessite des appels réguliers à update() pour progresser.
     */
    void startRainbow(uint16_t speed = 10);

    /**
     * @brief Arrête l'effet arc-en-ciel en cours.
     */
    void stopRainbow();

    /**
     * @brief Lance un fondu progressif et non bloquant vers une couleur cible.
     * @param r Composante rouge cible (0-255)
     * @param g Composante verte cible (0-255)
     * @param b Composante bleue cible (0-255)
     * @param duration Durée totale du fondu, en ms
     * @note Nécessite des appels réguliers à update() pour progresser.
     */
    void smoothToColor(uint8_t r, uint8_t g, uint8_t b, uint16_t duration);



private:
    Adafruit_NeoPixel _strip;

    // === Rainbow ===
    bool _rainbowActive = false;
    uint16_t _rainbowOffset = 0;
    uint16_t _rainbowSpeed = 10;
    unsigned long _lastRainbowUpdate = 0;

    // === Smooth Fade ===
    bool _fadeActive = false;
    uint32_t _fadeStartColor;
    uint32_t _fadeTargetColor;
    unsigned long _fadeStartTime;
    uint16_t _fadeDuration;

    /// Convertit une position (0-255) en une couleur de la roue chromatique (utilisé par l'effet rainbow)
    uint32_t wheel(uint8_t pos);
    /// Interpolation linéaire entre deux valeurs d'octet, pour une fraction t (0.0 à 1.0)
    uint8_t lerp(uint8_t a, uint8_t b, float t);
};

} // namespace crepp::drivers