Tuto : Jauge de batterie dynamique sur bandeau LED via WLED et MQTT

Ce tutoriel présente la conception d’une jauge de batterie dynamique utilisant un ruban LED, pilotée par Jeedom via WLED et MQTT. L’objectif est de transformer un simple bandeau en un tableau de bord visuel haute précision.


Le concept visuel

  • Pouls de l’énergie : Le ruban « respire » (pulsation rapide en charge, lente en décharge).
  • Dégradé chromatique : Passage fluide du rouge (vide) au vert (plein).
  • Sentinelle : Une LED témoin indépendante en bout de ruban (Vert=Charge, Rouge=Décharge, Bleu=Repos, Rainbow=100%).
  • Alerte critique : Flash rouge stroboscopique sous 20%.
  • Confort : Luminosité adaptative selon l’éclairage de la pièce (100% ou 5%).

Low:
low2

Charging :
charging2

Connaissances requises :

  • Flash d’un ESP (navigateur web).
  • Bases MQTT.
  • Soudure et câblage électrique.

1. Matériel requis

  • Contrôleur : Wemos D1 Mini Pro (ou tout autre ESP).
  • Ruban LED : Modèle adressable (ex: WS2812B ou WS2815B). Plus la densité de LED/m est élevée, plus le rendu est esthétique.
  • Alimentation :
    • Si ruban 5V : Alim 5V.
    • Si ruban 12V (mon cas) : Alim 12V + Level Shifter (signal DATA) + Convertisseur DC-DC Step-Down (12V vers 5V pour l’ESP).
  • Calcul de puissance : Utilisez wled-calculator.github.io pour dimensionner votre alimentation.

2. Cablage :

image
Le schéma dépend de votre ruban (5V ou 12V). Pour le 12V, le signal DATA doit être élevé à 5V via le Level Shifter pour éviter les scintillements.

3. Configuration WLED

  1. Flashage : Utiliser l’outil web install.wled.me.
  2. Wifi : ajouter le à votre réseau wifi et connectez vous à son IP
  3. Pin : indiquer la pin GPIO qui sera relié au ruban led (D4 = GPIO2 donc 2) à vous de trouver le pinout de votre ESP
  4. Inversion : cocher inverser pour que le bout du ruban soit en bas sachant que l’ESP est posé sur le haut de la batterie, a vous d’adapter cette info.
  5. Segments : Dans l’interface WLED, définir deux segments :
  • Segment 0 (Jauge) : LED 0 à 46 (jusqu’à votre avant dernière LED).
  • Segment 1 (Témoin qui est la dernière LED dans la boite de l’ESP) : LED 46 à 47.
  1. MQTT : Configurer l’accès au broker de Jeedom (IP, login, password). Définir le topic comme wled/Battery.

image

4. Préparation dans Jeedom

Le Virtuel de flux (Puissance)

Créer une info virtuelle pour déterminer le sens de l’énergie (ID de l’exemple : #135043#) :

  • Nom : Etat flux
  • Formule : #[votre info puissance]# > 0 ? 1 : (#[votre info puissance]# < 0 ? -1 : 0)
  • Résultat : 1 (charge), -1 (décharge), 0 (repos).

Détails : #[votre info puissance]# est la puissance mesuré de votre batterie (négative quand elle fourni, positive quand elle charge)

5. L’ajout dans jMQTT

Allez dans votre broker et mettez le en écoute sur le topic que vous avez renseigné dans la configuration WLED (SYNC INTERFACE), faite un on-off dans votre interface WLED pour déclencher l’envoi d’un message et le fera apparaitre dans l’écoute puis ajouter cette équipement avec le petit +

Ensuite dans cette équipement, afin d’envoyer l’ordre de couleur, créé une Action « type message » avec votre topic / api (moi c’est wled/Battery/api)
image

6. Le Scénario

7. Détail du bloc Code

Le code suivant calcule l’index de fin du segment 0, définit les couleurs et gère les animations MQTT via l’API JSON de WLED.

Vous devrez changer dans ce code en haut :
Les 3 informations

  • capacité batterie en %
  • l’info état flux du virtuel créé plus haut
  • l’état de la lumière (ou passage en mode nuit, à vous de vous adapter, sinon mettez 1 pour que le ruban soit toujours à 100% de luminosité).

Vous devrez changer dans ce code en bas :

  • le numéro de l’action qui publish l’ordre (chez moi 134983 vu plus haut)

LE CODE :

Résumé
/* * JAUGE BATTERIE WLED
 * Seg 0 : LEDs 0-45 (Jauge) | Seg 1 : LED 46 (Témoin)
 */

// 1. Récupération des données
$valeurBatterie = (float)jeedom::evaluateExpression("#[Capacité batterie (%)]#");
$etatBatterie = (int)jeedom::evaluateExpression("#Info du virtuel etat flux#");
$etatLumiere = (int)jeedom::evaluateExpression("#[Virtuel_Lumiere_Etat]#");

#[Virtuel_Lumiere_Etat]# est l'information de l'état de ma lumière au sous sol. Cette information aura l'effet de mettre à 100% la luminosité du ruban quand j'allume la lumière, sinon celle-ci sera à 5%

// 2. Luminosité par segment (Jauge discrète si lumière OFF)
$briSeg0 = ($etatLumiere == 1) ? 255 : 5;
$briSeg1 = 255; 

// 3. Calcul de la jauge (Mapping 10-100% sur 46 LEDs)
if ($valeurBatterie >= 100) {
    $indexLed = 46;
} else {
    $indexLed = (int)round(1 + (($valeurBatterie - 10) * (44 / 89)));
    $indexLed = max(1, min(45, $indexLed));
}

// 4. Animation Jauge (Segment 0)
$ratio = ($valeurBatterie - 10) / 90;
$red0 = (int)round(255 * (1 - $ratio));
$green0 = (int)round(255 * $ratio);
$fx0 = 0; $sx0 = 0; $col0 = array(array($red0, $green0, 0));

if ($valeurBatterie <= 20) {
    $fx0 = 1; $sx0 = 200; $col0 = array(array(255, 0, 0)); // Alerte rouge
} else {
    $fx0 = ($etatBatterie != 0) ? 2 : 0; // Breathe si flux actif
    $sx0 = ($etatBatterie == 1) ? 200 : 60; // Rapide en charge
}

// 5. Configuration Témoin (Segment 1)
$fx1 = 0; $sx1 = 0; 
if ($valeurBatterie >= 100) {
    $fx1 = 9; $sx1 = 150; // Rainbow si plein
    $col1 = array(array(255, 255, 255));
} else {
    if ($etatBatterie == 1)      { $col1 = array(array(0, 255, 0)); } // Vert
    elseif ($etatBatterie == -1) { $col1 = array(array(255, 0, 0)); } // Rouge
    else                         { $col1 = array(array(0, 0, 255)); } // Bleu
}

// 6. Envoi du JSON (Commande Action/Message MQTT ID : 134983)
$payload = array(
    "on" => true, "bri" => 255,
    "seg" => array(
        array("id" => 0, "bri" => $briSeg0, "stop" => $indexLed, "col" => $col0, "fx" => $fx0, "sx" => $sx0),
        array("id" => 1, "bri" => $briSeg1, "fx" => $fx1, "sx" => $sx1, "col" => $col1)
    )
);

$cmd = cmd::byId(134983);
if (is_object($cmd)) {
    $cmd->execute(array('message' => json_encode($payload)));
}

Astuce pour les tests : Utilisez un curseur virtuel (Slider) pour simuler le pourcentage de batterie et vérifier les paliers sans attendre la charge/décharge réelle de votre équipement.

D’autres photos :

Résumé








6 « J'aime »

Si j’ai oublié quelque chose ou n’a pas été clair, hésitez pas à me le dire et je corrigerai le tuto.