Si vous construisez un variateur AC avec un TRIAC, vous avez probablement remarqué des scintillements, une luminosité instable ou des sauts aléatoires d'intensité lumineuse.
La plupart des développeurs DIY pensent que le problème vient de :
- un matériel de variateur de mauvaise qualité
- un TRIAC ou un optocoupleur défectueux
- des problèmes de conception du PCB
Mais dans la majorité des projets réels, le matériel du variateur n'est pas en cause.
Le vrai problème est la précision du timing dans le firmware, en particulier sur ESP8266 et ESP32.
Ce guide explique :
- pourquoi les variateurs TRIAC scintillent
- pourquoi l'ESP32 aggrave le problème
- comment résoudre le scintillement par logiciel
- pourquoi le contrôle matériel dédié est la solution la plus fiable
Comment fonctionne un variateur AC à TRIAC
Un variateur TRIAC ne réduit pas la tension de manière progressive.
Il contrôle quand le TRIAC s'active pendant chaque demi-cycle AC.
Processus :
- La forme d'onde AC traverse le zéro (événement de passage par zéro)


2. Le MCU attend un délai précis (angle de phase)
3. Le MCU envoie une courte impulsion de gate au TRIAC


4. Le TRIAC conduit jusqu'au prochain passage par zéro
La luminosité dépend entièrement de la précision du timing à la microseconde.
For a deep technical explanation, read: https://www.rbdimmer.com/blog/diy-insights-1/ac-dimmer-based-on-zero-cross-detector-and-triac-operating-principles-and-applications-5
Pourquoi le timing est critique (en chiffres)
La variation AC est un contrôle en temps réel. Voici les chiffres concrets :
- Fréquence AC : 50 Hz (60 Hz) → passage par zéro toutes les 10 ms
- Précision d'amorçage du TRIAC requise : ±50 µs pour une luminosité stable
- Blocage des interruptions Wi-Fi sur ESP32 : 200–500 µs
- Résultat : scintillement visible même sous charge CPU modérée
💡 Cela signifie que le Wi-Fi peut perturber le timing du TRIAC de 10 fois la marge d'erreur acceptable.
Pourquoi le scintillement survient dans les projets ESP8266 / ESP32
Les puces ESP sont puissantes mais ne fonctionnent pas en temps réel par défaut.
Elles exécutent :
- Les piles Wi-Fi / BLE
- Les accès mémoire Flash (souvent bloquants)
- L'ordonnancement RTOS (ESP32)
- Les tâches système en arrière-plan
Si le code de timing du variateur entre en concurrence avec ces tâches :
- les interruptions de passage par zéro sont retardées
- les impulsions de gate du TRIAC se décalent
- la luminosité devient instable
La situation empire lorsque :
- MQTT / OTA / interface web est actif
- la journalisation est activée
- plusieurs canaux de variation sont utilisés
Erreurs courantes des débutants
Les exemples populaires pour Arduino / ESPHome / Tasmota utilisent souvent :
- delay() après le passage par zéro
- une logique de timing dans des callbacks non déterministes
- des appels de fonctions bloquantes à l'intérieur des ISR
- des accès à la mémoire Flash dans du code critique en termes de timing
Ils fonctionnent en démonstration, mais échouent dans les produits réels.
Solution 1 — Software-Based: rbdimmerESP32.h
Pour les puces ESP32 double cœur, le scintillement peut être résolu par logiciel si c'est fait correctement.
What rbdimmerESP32.h Does
rbdimmerESP32.h est conçue pour un contrôle déterministe du TRIAC :
- timers matériels (pas de délais logiciels)
- code ISR stocké en IRAM (pas de blocages Flash)
- séparation des cœurs : temps réel vs Wi-Fi
- architecture compatible FreeRTOS
Repo: 👉 https://github.com/robotdyn-dimmer/rbdimmerESP32
Détails techniques clés — IRAM (Instruction RAM)
L'ESP32 exécute normalement le code depuis la Flash.
L'accès à la Flash peut bloquer le CPU pendant des centaines de microsecondes.
Solution :
Placez le code critique en termes de timing dans l'IRAM avec :
IRAM_ATTR void zeroCrossISR() {
// ultra-fast ISR code
}
Timers matériels
N'utilisez jamais delay() ou millis() pour le timing du TRIAC.
Utilisez les timers matériels de l'ESP32 pour une précision à la microseconde.
Stratégie double cœur
- Cœur 0 : timing du variateur (temps réel)
- Cœur 1 : Wi-Fi, MQTT, interface, journalisation
Cette isolation empêche le scintillement.
Quand la solution logicielle est pertinente
✅ ESP32 uniquement
✅ Vous maîtrisez les interruptions et le RTOS
✅ Vous avez besoin d'un contrôle total du firmware
⚠️ Nécessite une architecture soignée
À FAIRE ✅
- Utilisez les timers matériels de l'ESP32 pour le contrôle du TRIAC
- Gardez le code ISR en dessous de 10 µs
- Exécutez la variation sur le cœur 0, le Wi-Fi sur le cœur 1
- Stockez le code critique en termes de timing dans l'IRAM
À NE PAS FAIRE ❌
- N'appelez jamais Serial.print() depuis un ISR
- N'accédez pas à la Flash dans du code critique en termes de timing
- Évitez delay() à proximité de la logique de passage par zéro
- Ne mélangez pas les tâches de variation et de réseau
Solution 2 — Hardware-Based: ❌ non supporté (Recommended)
Le moyen le plus fiable d'éliminer le scintillement est de retirer le timing TRIAC du MCU principal.
What Is ❌ non supporté?
DimmerLink est un module contrôleur de variateur dédié :
- détecte le passage par zéro
- génère les impulsions TRIAC en interne
- garantit un timing stable
- communique via UART / I²C
Docs: 👉 https://github.com/robotdyn-dimmer/DimmerLink
Pourquoi DimmerLink élimine le scintillement
- Le Wi-Fi ne peut pas retarder l'amorçage du TRIAC
- Les erreurs de timing du MCU n'affectent pas la variation
- Les blocages Flash sont sans importance
- La mise à l'échelle sur plusieurs canaux est triviale
Votre MCU envoie simplement des commandes série (UART) comme :
Example: 02 53 00 32 → Set dimmer 0 to 50% Response: 00 → OK
| NIVEAU | Luminosité |
| 0x00 (0) | 0% — éteint |
| 0x32 (50) | 50% |
| 0x64 (100) | 100% — pleine luminosité |
Comparaison logicielle vs matérielle
| Critère | rbdimmerESP32.h | DimmerLink |
| Coût (BOM) | $0 | $1.5 |
| Consommation électrique | Identique au MCU | +10 mA |
| Espace PCB | 0 (logiciel) | ~1×2 cm |
| Certification (CE/UL) | DIY uniquement | DIY uniquement |
| Support ESP8266 | ❌ | ✔️ |
| Support ESP32 | ✔️ | ✔️ |
Raspberry Pi/Orange Pi.. | ❌ | ✔️ |
| Plusieurs variateurs | ⚠️ complexe | ✔️ facile |
| Adapté aux débutants | ❌ | ✔️ |
| Prêt pour la production | ⚠️ | ✔️ |
Arbre de décision : quelle solution est faite pour moi ?
Vous utilisez un ESP8266 ?
- Utilisez DimmerLink
Vous utilisez un ESP32 et voulez un contrôle total ?
- Utilisez rbdimmerESP32
Vous avez besoin de plusieurs variateurs et d'une stabilité à toute épreuve ?
- Utilisez DimmerLink
Vous développez un produit commercial ?
- Utilisez DimmerLink
Vous expérimentez et apprenez la programmation temps réel ?
- Utilisez rbdimmerESP32
Conclusion
La variation par TRIAC ne concerne pas la tension — c'est une question de timing à la microseconde.
Le Wi-Fi n'est pas temps réel.
Les délais sont dangereux.
La Flash est imprévisible.
If you want stable light and zero flicker, isolate timing or move it to dedicated hardware - ❌ non supporté.