Se rendre au contenu

Le variateur AC ne s'éteint pas : lueur résiduelle à 0%

Pourquoi une lampe continue de briller faiblement quand le variateur est à 0% et comment l'éliminer avec des commandes logicielles, un circuit RC snubber ou un relais.

En résumé : Régler le variateur à 0% ne garantit pas l'extinction de la lampe. Le courant de maintien du TRIAC maintient la conduction pour les faibles charges. Solution : appelez dimmer.setState(OFF) ou setMode(OFF_MODE) au lieu de setPower(0) — ou ajoutez un relais pour une déconnexion galvanique complète. DimmerLink arrête toutes les impulsions de gâchette au niveau 0, éliminant le problème par logiciel.




À quoi ressemble le problème

Vous appelez setPower(0) ou définissez brightness: 0 dans votre automatisation. La charge devrait être éteinte. À la place :

  • une lampe à incandescence ou halogène continue de briller faiblement ;
  • la lampe peut scintiller lentement (1–4 Hz) au niveau « zéro » ;
  • le phénomène est plus marqué avec les lampes de faible puissance (25–40 W) et disparaît à partir de 100 W+.

Ce n'est pas une erreur de code. C'est une propriété fondamentale des circuits TRIAC en interaction avec de petites charges résistives.




Causes profondes


Cause 1 — Courant de maintien du TRIAC

Un TRIAC (Triode for Alternating Current) conduit dans les deux demi-périodes AC après déclenchement. Pour arrêter de conduire, il doit naturellement atteindre le passage par zéro — et le courant dans la charge au moment du passage doit descendre en dessous du courant de maintien (I_H) du composant.

Courant de maintien typique pour un BTA16 ou BT138 TRIAC : 25–80 mA.

Avec une lampe de 25 W à 230 V :

text
I_load = 25 W / 230 V ≈ 109 mA  (crête pendant la conduction)

À un angle de découpe de phase très petit (proche de 0%, c'est-à-dire proche du passage par zéro), l'impulsion de courant est si brève qu'elle chute sous I_H avant que le TRIAC n'ait le temps de se verrouiller. Résultat : certaines demi-périodes le TRIAC s'ouvre, d'autres non — produisant un scintillement lent et irrégulier ou une lueur constante faible.


Cause 2 — Courant de fuite de l'optocoupleur

L'optocoupleur de commande du TRIAC (MOC3041, MOC3021 ou équivalent) laisse passer un faible courant de fuite (typiquement 1–5 mA) même quand la LED interne est éteinte. Pour une lampe de 100 W c'est invisible. Pour une lampe LED de 10 W ou une lampe à incandescence de 25 W, la fuite seule peut suffire à entretenir une lueur.


Cause 3 — Impulsion minimale de la bibliothèque à 0%

Les bibliothèques RBDdimmer et rbdimmerESP32 imposent un angle de déclenchement minimum non nul pour éviter l'instabilité matérielle près des passages par zéro. L'appel à setPower(0) peut quand même générer une très courte impulsion de gâchette à chaque demi-période. La charge reçoit donc une infime bouffée de puissance — insuffisante pour allumer une ampoule de 100 W, mais visible sur une lampe de 25 W.

La solution est de basculer le mode de la bibliothèque sur OFF, pas simplement de régler la puissance à 0.




Diagnostic du problème

  1. Vérifier la puissance — remplacez la lampe de 25–40 W par une lampe à incandescence de 100 W. Si la lueur disparaît, le courant de maintien en est la cause.
  2. Déconnecter le MCU — débranchez tous les signaux de commande (DIM, ZC, VCC, GND côté MCU). Si la lampe brille encore, le courant de fuite en est la cause ; si elle s'éteint, la bibliothèque envoie des impulsions résiduelles.
  3. Vérifier l'appel API — cherchez setPower(0) dans votre code. Confirmez que vous n'avez pas oublié un appel à setState(OFF).



Solutions


🟢 Pour les débutants — Utiliser DimmerLink ou un relais

DimmerLink gère le déclenchement de la gâchette dans son propre firmware (Cortex-M0+). Au niveau 0, il ne génère aucune impulsion de gâchette — le TRIAC n'est pas déclenché indépendamment de la fuite. Écrivez 0 dans le registre 0x10 (DIM0_LEVEL) et la lampe s'éteint complètement.

cpp
// Arduino / ESP32 — DimmerLink I2C
Wire.beginTransmission(0x50);
Wire.write(0x10);   // registre DIM0_LEVEL
Wire.write(0);      // 0% — aucune impulsion de gâchette
Wire.endTransmission();

Ajoutez un relais si la charge doit être complètement hors tension (isolation galvanique). Connectez un relais normalement ouvert (ou SSR) en série avec l'AC-IN du variateur. Ouvrez le relais quand la charge doit être éteinte ; fermez-le pour activer la variation :

cpp
// Exemple Arduino
const int RELAY_PIN = 7;
void setLoad(bool on, uint8_t level) {
    if (!on) {
        dimmer.setState(OFF);
        digitalWrite(RELAY_PIN, LOW);   // relais ouvert — complètement éteint
    } else {
        digitalWrite(RELAY_PIN, HIGH);  // relais fermé — chemin AC actif
        delay(5);                       // attendre la stabilisation des contacts
        dimmer.setState(ON);
        dimmer.setPower(level);
    }
}


🔵 Pour les utilisateurs avancés — Solutions logicielles et matérielles


Option A — Utiliser le bon mode OFF (logiciel)

setPower(0) règle l'angle de déclenchement à quasi zéro mais peut encore générer une impulsion. La bonne méthode pour éteindre complètement la charge est de changer le mode de fonctionnement :

rbdimmerESP32 / RBDdimmer :

cpp
#include <rbdimmerESP32.h>  // ou RBDdimmer.h pour AVR/ESP8266
rbdimmer::Dimmer dimmer(DIM_PIN, ZC_PIN);
void setup() {
    dimmer.begin(NORMAL_MODE, ON);
    dimmer.setPower(50);
}
void turnOff() {
    // Correct : basculer le mode sur OFF — aucune impulsion de gâchette
    dimmer.setState(OFF);
    // Incorrect : dimmer.setPower(0) — peut encore déclencher
}
void turnOn(uint8_t level) {
    dimmer.setState(ON);
    dimmer.setPower(level);
}

Si votre version de la bibliothèque utilise setMode() :

cpp
dimmer.setMode(OFF_MODE);    // éteint
dimmer.setMode(NORMAL_MODE); // reprend la variation

Composant ESPHome ac_dimmer :

Le composant ac_dimmer d'ESPHome définit output: false pour inhiber complètement les impulsions de gâchette :

yaml
output:
  - platform: ac_dimmer
    id: triac_output
    gate_pin: GPIO4
    zero_cross_pin: GPIO5
light:
  - platform: monochromatic
    output: triac_output
    name: "Lamp"
    # Quand HA envoie une commande d'extinction, le composant arrête les impulsions de gâchette.

Quand Home Assistant envoie une commande d'extinction, ESPHome arrête complètement les impulsions de gâchette — le TRIAC n'est pas déclenché et la lampe s'éteint.


Option B — Circuit RC snubber (matériel)

Un circuit RC snubber connecté en parallèle avec le TRIAC réduit la vitesse de montée en tension (dV/dt) aux bornes du composant après un passage par zéro. Cela aide le TRIAC à se commuter de manière fiable aux petits angles de conduction.

text
Anode/cathode du TRIAC
┌──────────┐
│  TRIAC   │
└──────────┘
     │     ← en parallèle : 100 Ω (0,5 W) + 100 nF classe X2
     └── R ── C ── ┘

Valeurs standard du snubber : R = 100 Ω (0,5 W) et C = 100 nF, classe X2 (prévu pour la tension secteur).

La plupart des modules rbdimmer intègrent déjà un snubber. Vérifiez le schéma de votre module avant d'en ajouter un externe.

Un circuit RC snubber n'élimine pas complètement le problème — il rend l'extinction du TRIAC plus fiable, mais le courant de fuite de l'optocoupleur persiste.


Option C — Relais en série pour déconnexion complète

Si la charge doit être complètement hors tension (exigence de sécurité ou charge inductive), ajoutez un relais en série :

Scénario Type de relais Remarque
Charges normales Relais SPST NO Ouvert = pas de chemin AC
Inductives (moteurs) Relais SPST NO Suppression d'arc recommandée
Isolation secteur requise SSR (relais statique) Pas de pièces mobiles

Utilisez le variateur pour le contrôle de puissance et le relais pour le marche/arrêt :

cpp
void loop() {
    if (targetLevel == 0) {
        dimmer.setState(OFF);
        digitalWrite(RELAY_PIN, LOW);
    } else {
        digitalWrite(RELAY_PIN, HIGH);
        delay(5);
        dimmer.setState(ON);
        dimmer.setPower(targetLevel);
    }
}



Matrice de compatibilité des charges

Charge Symptôme à 0% Cause Solution
Incandescente 100 W+ Pas de lueur Charge suffisante setState(OFF) suffit
Incandescente 25–40 W Lueur faible Courant de maintien setState(OFF) ou relais
Halogène 50 W Lueur ou scintillement lent Courant de maintien RC snubber + setState(OFF)
Halogène 12 V (transformateur) Lueur Courant réactif Relais pour déconnexion complète
Élément chauffant Pas de lueur Charge résistive setState(OFF) suffit



Erreurs fréquentes

Erreur Effet Solution
Appeler setPower(0) au lieu de setState(OFF) Impulsion résiduelle à chaque demi-période Utiliser setState(OFF)
Supposer que 0% = éteint pour les lampes de faible puissance Lueur ou scintillement Utiliser le mode OFF
Ajouter un snubber sous-dimensionné (résistance < 0,5 W) Surchauffe du snubber Utiliser une résistance de 0,5 W ou 1 W
Utiliser un relais sans protection d'arc sur charges inductives Soudure des contacts Ajouter un snubber sur les contacts du relais



Checklist rapide

Avant de remplacer du matériel, vérifiez dans l'ordre :

  • ☐ Le code utilise `setState(OFF)` / `setMode(OFF_MODE)`, pas seulement `setPower(0)`
  • ☐ La puissance de la lampe est > 60 W (en dessous, le courant de maintien est souvent la cause)
  • ☐ La version de la bibliothèque supporte un mode OFF séparé
  • ☐ Le snubber intégré au module est présent (vérifier la PCB)
  • ☐ Si DimmerLink : le registre de niveau 0x10 est défini à 0 via I2C



  • Articles connexes



    Encore des questions ?

    Ask on forum.rbdimmer.com or open a GitHub Issue.

    Partager cet article
    Se connecter pour laisser un commentaire.