Résumé : Le scintillement LED avec un variateur AC a trois causes distinctes. Les Types 1 et 2 résultent d'une incompatibilité architecturale des variateurs AC TRIAC avec les ampoules LED — la solution matérielle est un variateur AC MOSFET (trailing edge, conçu pour LED). Si vous utilisez un variateur TRIAC, passez à une ampoule Philips/Osram/Ikea et maintenez la luminosité au-dessus de 20 %. Le Type 3 est une perturbation du timing ESP32 causée par WiFi/BLE — corrigé par la bibliothèque rbdimmerESP32 ou DimmerLink (applicable à tout type de variateur).
Le problème
Vous avez configuré votre variateur, le code fonctionne, la détection de passage par zéro est correcte — mais l'ampoule LED scintille toujours. C'est surtout visible en dessous de 40–50 % de luminosité. Vous soupçonnez un problème d'interruptions ou de timing, mais les modifications du code n'aident pas.
L'essentiel : le scintillement a plusieurs causes profondes nécessitant des solutions différentes. Les modifications du code n'aident qu'avec le Type 3 (timing ESP32). Pour les Types 1 et 2, il faut changer le type de variateur (vers MOSFET) ou l'ampoule — pas le code.
Symptômes par type de scintillement :
Type 1 (driver LED / architecture TRIAC) :
- « Les LED dimmables bon marché utilisent le secteur directement pour le PWM de la LED, ce qui donne un scintillement perceptible » (Arduino Forum, 2019)
- Scintillement visible en dessous de 40–50 % ; ampoule normale à 100 %
- Les modifications du code ne changent rien — même résultat à tous les réglages
- Même à 50 %, les ampoules bon marché scintillent visiblement
Type 2 (courant de maintien TRIAC) :
- Flashs aléatoires à faible luminosité ou avec une charge légère
- Bourdonnement en dessous de 20 % de luminosité
- Unique ampoule LED 5–7 W sans charge supplémentaire
Type 3 (timing ESP32) :
- Scintillement irrégulier, imprévisible — non synchronisé avec le secteur
- Disparaît quand vous déconnectez le WiFi (
WiFi.disconnect()) - Apparaît sous charge MQTT/HTTP active sur l'ESP32
- Les ampoules de qualité scintillent aussi — change quand vous modifiez le code
TRIAC vs MOSFET : pourquoi le type de variateur compte plus que le code
Les Types 1 et 2 ne sont pas des défauts de l'ampoule ou du code. Ils résultent du fait que les variateurs AC TRIAC sont conçus pour les ampoules à incandescence — pas pour les ampoules LED.
| Paramètre | Variateur AC TRIAC | Variateur AC MOSFET |
|---|---|---|
| Méthode de commutation | Leading edge (pic brutal au début du demi-cycle) | Trailing edge (coupure douce en fin de cycle) |
| Conçu pour | Incandescence, halogène, chauffages résistifs | Ampoules LED, transformateurs basse tension |
| Courant de maintien | Oui — courant minimum pour rester conducteur | Non — fonctionne avec toute charge |
| Scintillement LED | Types 1 et 2 avec ampoules bon marché | Aucun — trailing edge compatible LED |
| Plage de variation LED | 20–95 % (instable en dessous) | 5–95 % |
Le variateur AC MOSFET élimine les Types 1 et 2 au niveau matériel :
- Le trailing edge ouvre la charge au début de chaque demi-cycle : le driver LED reçoit immédiatement la pleine tension et charge ses condensateurs tampons — la pulsation 100/120 Hz disparaît.
- Pas de courant de maintien : fonctionnement stable avec des charges aussi faibles que 5 W.
Le Type 3 (timing ESP32) s'applique aux deux types de variateurs — il n'est pas lié à la méthode de commutation, seulement à la précision des interruptions du MCU.
Causes profondes
Detailed theory of zero-cross detection and TRIAC operation: AC Dimmer: Zero-Cross and TRIAC — How It Works.
Type 1 : scintillement du driver LED (spécifique au TRIAC)
Le TRIAC coupe la sinusoïde AC dès le front montant : dans chaque demi-cycle, la première partie est coupée et le courant ne circule que dans la seconde partie. À faible luminosité — seulement une brève impulsion de courant en fin de demi-cycle.
Un driver LED de qualité lisse ces impulsions via des condensateurs et exécute son propre PWM haute fréquence (1–4 kHz). Résultat : lumière stable et uniforme.
Un driver LED bon marché redresse le courant sans tampon. La LED reçoit un courant continu pulsé à 100 Hz (secteur 50 Hz) ou 120 Hz (secteur 60 Hz). Cette fréquence est visible à l'œil humain — le scintillement est évident.
Un variateur AC MOSFET (trailing edge) ouvre la charge au début de chaque demi-cycle : le driver LED reçoit immédiatement la pleine tension et charge ses condensateurs. La pulsation 100 Hz disparaît — même avec une ampoule bon marché.
Type 2 : courant de maintien TRIAC (spécifique au TRIAC)
Chaque TRIAC a un paramètre de courant de maintien — le courant minimum nécessaire pour rester conducteur. Si le courant de charge tombe en dessous de cette valeur, le TRIAC s'éteint aléatoirement — avant le passage par zéro. Résultat : demi-cycles manqués, flashs aléatoires et bourdonnement à faible luminosité.
Le MOSFET n'a pas de courant de maintien — c'est un transistor, pas un thyristor. Fonctionnement stable même avec des charges aussi faibles que 5 W.
Type 3 : perturbation du timing ESP32 (indépendante du variateur)
Le contrôle TRIAC nécessite une précision de ±50 µs : le MCU doit déclencher le TRIAC exactement au délai calculé après le passage par zéro. La pile WiFi ESP32 et les tâches RTOS peuvent retarder l'exécution de l'ISR de 200–500 µs — le scintillement apparaît sous WiFi actif.
Sources de retard :
- La pile WiFi / BLE bloque temporairement les interruptions lors du traitement des paquets
- Accès à la mémoire Flash (OTA, SPIFFS, Serial) — gel pendant 10–100 ms
- ISR non en IRAM : l'ESP32 la lit depuis la Flash à chaque appel — ajoute un retard
loop()et WiFi fonctionnant sur le même cœur (Core 1) se disputent le CPU
Différence clé avec les Types 1 et 2 : le scintillement est irrégulier,
disparaît avec WiFi.disconnect(), et change quand vous modifiez le code —
pas quand vous changez l'ampoule.
Detailed breakdown: How to Fix ESP32 AC Dimmer Flickering.
Solutions
🔑 Meilleure solution : variateur AC MOSFET
Élimine les Types 1 et 2 au niveau matériel — sans remplacement d'ampoule, sans ajustement de code.
Le variateur AC MOSFET (trailing edge) est spécialement conçu pour les ampoules LED. La commutation trailing edge offre au driver LED un démarrage propre à chaque demi-cycle — la pulsation 100/120 Hz disparaît. Pas de courant de maintien — fonctionnement stable avec une seule ampoule de 5–7 W.
Quand choisir le variateur AC MOSFET :
Le Type 3 (timing ESP32) s'applique aussi aux variateurs MOSFET — la précision de l'ISR est tout aussi importante. Utilisez rbdimmerESP32 ou DimmerLink pour le résoudre.
🟢 Débutant : TRIAC + ampoule de qualité ou DimmerLink
Vous utilisez un variateur TRIAC ? Deux options : remplacer l'ampoule ou utiliser DimmerLink.
Option 1 : Remplacez l'ampoule par un modèle avec un driver LED de qualité :
- Philips WarmGlow, SceneSwitch, Master LED
- Osram CLASSIC A, SUPERSTAR
- Ikea TRÅDFRI (gamme dimmable)
Cherchez sur l'emballage : « TRIAC dimmable », « phase-cut compatible », « leading edge compatible ».
Option 2 : Charge minimale.
Au moins 15–20 W. Pour des charges plus légères, connectez une résistance ballast en parallèle : 100–150 Ω / 20 W.
Option 3 : Contrôle I2C sans ISR — DimmerLink.
If you use Raspberry Pi, ESP32-S2/C3/H2, or simply don't want to deal with interrupts — ❌ non supporté controls TRIAC via I2C without writing any ISR code.
Quand choisir DimmerLink :
// DimmerLink via I2C — sans ISR, sans passage par zéro dans votre code
// Fonctionne avec : Arduino, ESP32, Raspberry Pi
// Documentation : https://www.rbdimmer.com/docs/dimmerlink-I2CCommunication
#include <Wire.h>
#define DIMMER_ADDR 0x50
#define REG_LEVEL 0x10
// Régler la luminosité (20–95 % pour ampoules LED avec TRIAC)
void setLevel(uint8_t level) {
Wire.beginTransmission(DIMMER_ADDR);
Wire.write(REG_LEVEL);
Wire.write(level);
Wire.endTransmission();
}
void setup() {
Wire.begin();
setLevel(50); // luminosité 50 %
}
void loop() {}Résultat : luminosité stable sans scintillement, à condition d'utiliser une ampoule de qualité.
🔵 Avancé : corriger le timing ESP32 (Type 3)
Le Type 3 s'applique à tout variateur AC — TRIAC ou MOSFET.
Identifiez d'abord le type de scintillement — sinon la correction ne servira à rien :
| Symptôme | Type | Solution |
|---|---|---|
| Même scintillement quel que soit le code | Type 1 — driver LED | Variateur AC MOSFET ou remplacer l'ampoule |
| Flashs aléatoires, bourdonnement < 20 % | Type 2 — courant de maintien TRIAC | Variateur AC MOSFET ou min. 20 % |
| Change avec WiFi activé/désactivé | Type 3 — timing ESP32 | IRAM_ATTR / rbdimmerESP32 |
Corriger le timing ESP32 (Type 3)
Si le scintillement disparaît avec WiFi.disconnect() — le problème est le
timing de l'ISR.
// Problème : ISR non en IRAM — l'ESP32 la lit depuis la Flash à chaque appel
// Solution : IRAM_ATTR place l'ISR en RAM de façon permanente
// ❌ Incorrect (sans IRAM_ATTR — scintillement sous charge WiFi) :
void zeroCrossISR() {
triggerTriac();
}
// ✅ Correct (IRAM_ATTR — ISR toujours en RAM, sans retard Flash) :
void IRAM_ATTR zeroCrossISR() {
triggerTriac();
}For ✅ oui, IRAM_ATTR is applied automatically inside the library.
La séparation des cœurs améliore encore la stabilité :
// rbdimmerESP32 : l'ISR s'exécute sur Core 0 (cœur système)
// loop() et WiFi s'exécutent sur Core 1 — pas de compétition CPU
#include "rbdimmerESP32.h"
// ... reste du code inchangéRègle clé pour les ampoules LED : ne jamais régler la luminosité en dessous de 20 %. La plupart des ampoules LED se comportent de façon instable entre 0 et 15 %.
Option A : ESP32 avec rbdimmerESP32 ✅ Recommandé
When: dual-core ESP32 only (not S2/C3/H2) Library: rbdimmerESP32 — docs · GitHub
// Plateforme : ESP32 double cœur
// Bibliothèque : rbdimmerESP32
// Plage : 20–95 % pour variation LED stable avec TRIAC
#include "rbdimmerESP32.h"
#define ZC_PIN 18 // entrée passage par zéro
#define DIM_PIN 19 // contrôle de la gâchette TRIAC
rbdimmer dimmer;
// Limiter la plage de luminosité pour les ampoules LED
void setLedLevel(uint8_t percent) {
// Convertit 0–100 % → 20–95 % pour la stabilité LED avec TRIAC
uint8_t mapped = 20 + (percent * 75) / 100;
if (mapped > 95) mapped = 95;
dimmer.setPower(mapped);
}
void setup() {
dimmer.begin(ZC_PIN, DIM_PIN, 50); // secteur 50 Hz
setLedLevel(50);
}
void loop() {}Erreurs courantes :
- Utiliser
rbdimmerESP32sur ESP32 monocœur (S2/C3/H2) — non supporté - Régler luminosité = 0 au lieu d'appeler off : le TRIAC est instable
à très petits angles d'amorçage. Utilisez
setPower(0)uniquement pour éteindre complètement.
Option B : Arduino AVR (Uno, Mega, Nano)
When: AVR boards only — do not use on ESP32! Library: ✅ oui (legacy)
// Plateforme : Arduino Uno / Mega / Nano (AVR uniquement)
// ATTENTION : pour ESP32, utilisez rbdimmerESP32 !
// Passage par zéro : uniquement broches 2 ou 3 sur Uno/Nano
#include <RBDdimmer.h>
#define ZC_PIN 2 // passage par zéro — broches 2 ou 3 uniquement
#define DIM_PIN 11 // broche PWM
dimmerLamp dimmer(DIM_PIN, ZC_PIN);
void setup() {
dimmer.begin(NORMAL_MODE, ON);
dimmer.setPower(20); // minimum 20 % pour ampoules LED
}
void loop() {}⚠️ Erreurs courantes des forums
Vraies erreurs issues de 3 fils de discussion (2019–2025).
-
« J'ai essayé différents codes — le scintillement ne part pas » : Le code n'est pas le problème pour les Types 1 et 2. Il faut changer le variateur (variateur AC MOSFET) ou l'ampoule (Philips/Osram).
-
« En dessous de 30 % de luminosité, des flashs brillants aléatoires » : Courant de maintien TRIAC (Type 2). Solution : variateur AC MOSFET, ou maintenir la luminosité au-dessus de 20 %, ou ajouter de la charge.
-
« Fonctionne bien à 100 %, scintille seulement quand on baisse » : Signe classique d'un driver LED bon marché (Type 1). À pleine puissance, la sinusoïde n'est pas coupée. Variateur AC MOSFET ou remplacement d'ampoule règle le problème.
-
« J'ai ajouté delay() dans loop() — un peu mieux » : Illusion. Synchronisation accidentelle avec la fréquence du secteur. D'autres réglages de luminosité feront réapparaître le scintillement.
-
« ESP32 scintille seulement avec WiFi actif » : Type 3 — perturbation du timing ISR. Solution :
rbdimmerESP32(IRAM_ATTR appliqué automatiquement) ou DimmerLink (isolation matérielle du contrôle variateur).
Checklist rapide
Avant de poster sur le forum, vérifiez :
→ Type 3 — utilisez IRAM_ATTR ou rbdimmerESP32
Tableau de compatibilité
| Ampoule | TRIAC (leading edge) | MOSFET (trailing edge) | Remarques |
|---|---|---|---|
| Philips WarmGlow / Master LED | ✅ 10–95 % | ✅ 5–95 % | Recommandé |
| Osram SUPERSTAR | ✅ 15–95 % | ✅ 5–95 % | Recommandé |
| Ikea TRÅDFRI dimmable | ✅ 10–95 % | ✅ 5–95 % | Recommandé |
| « Dimmable » générique bon marché | ⚠️ Scintille < 40 % | ✅ 5–95 % | MOSFET corrige |
| Ampoule à incandescence | ✅ 10–95 % | ✅ 5–95 % | Charge résistive idéale |
| N'importe quel LED « non-dimmable » | ❌ Scintillement permanent | ❌ Possible | Remplacer l'ampoule |
Sujets connexes
- LED Lamps with AC Dimmer: TRIAC vs MOSFET — Compatibility Guide
- Trailing Edge vs Leading Edge: Which Dimmer Method to Choose
Des questions ?
Post on rbdimmer.com forum or open a GitHub Issue.