Se state costruendo un dimmer AC con un TRIAC, probabilmente avete notato sfarfallio, luminosità instabile o salti casuali nell'intensità della luce.
La maggior parte degli sviluppatori DIY pensa che il problema sia causato da:
- hardware del dimmer di bassa qualità
- TRIAC o optoaccoppiatore difettoso
- problemi di layout del PCB
Ma nella maggior parte dei progetti reali, l'hardware del dimmer non è il problema.
Il vero problema è la precisione del timing nel firmware, specialmente su ESP8266 ed ESP32.
Questa guida spiega:
- perché i dimmer TRIAC sfarfallano
- perché l'ESP32 aggrava il problema
- come risolvere lo sfarfallio via software
- perché il controllo hardware dedicato è la soluzione più affidabile
Come funziona un dimmer AC a TRIAC
Un dimmer TRIAC non riduce la tensione in modo graduale.
Controlla quando il TRIAC si attiva durante ogni semiciclo AC.
Processo:
- La forma d'onda AC attraversa lo zero (evento di passaggio per lo zero)


2. Il MCU attende un ritardo preciso (angolo di fase)
3. Il MCU invia un breve impulso di gate al TRIAC


4. Il TRIAC conduce fino al successivo passaggio per lo zero
La luminosità dipende interamente dalla precisione del timing a livello di microsecondi.
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
Perché il timing è critico (in numeri)
La dimmerizzazione AC è un controllo in tempo reale. Ecco i dati concreti:
- Frequenza AC: 50 Hz (60 Hz) → passaggio per lo zero ogni 10 ms
- Precisione di innesco del TRIAC richiesta: ±50 µs per una luminosità stabile
- Blocco degli interrupt Wi-Fi su ESP32: 200–500 µs
- Risultato: sfarfallio visibile anche con carico CPU moderato
💡 Questo significa che il Wi-Fi può alterare il timing del TRIAC di 10 volte il margine di errore accettabile.
Perché lo sfarfallio si verifica nei progetti ESP8266 / ESP32
I chip ESP sono potenti ma non funzionano in tempo reale per impostazione predefinita.
Eseguono:
- Stack Wi-Fi / BLE
- Accessi alla memoria Flash (spesso bloccanti)
- Schedulazione RTOS (ESP32)
- Task di sistema in background
Se il codice di timing del dimmer compete con questi task:
- gli interrupt di passaggio per lo zero vengono ritardati
- gli impulsi di gate del TRIAC si spostano
- la luminosità diventa instabile
La situazione peggiora quando:
- MQTT / OTA / interfaccia web è attivo
- il logging è abilitato
- si utilizzano più canali di dimmerizzazione
Errori comuni dei principianti
Gli esempi popolari per Arduino / ESPHome / Tasmota spesso:
- usano delay() dopo il passaggio per lo zero
- eseguono la logica di timing in callback non deterministici
- chiamano funzioni bloccanti all'interno degli ISR
- accedono alla memoria Flash nel codice critico in termini di tempistica
Funzionano nelle demo, ma falliscono nei prodotti reali.
Solution 1 — Software-Based: rbdimmerESP32.h
Per i chip ESP32 dual-core, lo sfarfallio può essere risolto via software se fatto correttamente.
What rbdimmerESP32.h Does
rbdimmerESP32.h è progettata per il controllo deterministico del TRIAC:
- timer hardware (nessun ritardo software)
- codice ISR memorizzato in IRAM (nessun blocco Flash)
- separazione dei core: tempo reale vs Wi-Fi
- architettura compatibile con FreeRTOS
Repo: 👉 https://github.com/robotdyn-dimmer/rbdimmerESP32
Dettagli tecnici chiave — IRAM (Instruction RAM)
L'ESP32 normalmente esegue il codice dalla Flash.
L'accesso alla Flash può bloccare la CPU per centinaia di microsecondi.
Soluzione:
Posizionate il codice critico in termini di tempistica nell'IRAM usando:
IRAM_ATTR void zeroCrossISR() {
// ultra-fast ISR code
}
Timer hardware
Non usate mai delay() o millis() per il timing del TRIAC.
Usate i timer hardware dell'ESP32 per la precisione al microsecondo.
Strategia dual-core
- Core 0: timing del dimmer (tempo reale)
- Core 1: Wi-Fi, MQTT, interfaccia, logging
Questo isolamento previene lo sfarfallio.
Quando la soluzione software ha senso
✅ Solo ESP32
✅ Conoscete gli interrupt e il RTOS
✅ Avete bisogno del controllo completo del firmware
⚠️ Richiede un'architettura accurata
DA FARE ✅
- Usate i timer hardware dell'ESP32 per il controllo del TRIAC
- Mantenete il codice ISR sotto i 10 µs
- Eseguite la dimmerizzazione sul core 0, il Wi-Fi sul core 1
- Memorizzate il codice critico in termini di tempistica nell'IRAM
DA NON FARE ❌
- Non chiamate mai Serial.print() da un ISR
- Non accedete alla Flash nel codice critico in termini di tempistica
- Evitate delay() vicino alla logica di passaggio per lo zero
- Non mescolate task di dimmerizzazione e di rete
Solution 2 — Hardware-Based: DimmerLink (Recommended)
Il modo più affidabile per eliminare lo sfarfallio è rimuovere il timing del TRIAC dal MCU principale.
What Is DimmerLink?
DimmerLink è un modulo controller dimmer dedicato:
- rileva il passaggio per lo zero
- genera gli impulsi TRIAC internamente
- garantisce un timing stabile
- comunica tramite UART / I²C
Docs: 👉 https://github.com/robotdyn-dimmer/DimmerLink
Perché DimmerLink elimina lo sfarfallio
- Il Wi-Fi non può ritardare l'innesco del TRIAC
- Gli errori di timing del MCU non influenzano la dimmerizzazione
- I blocchi della Flash sono irrilevanti
- La scalabilità a più canali è banale
Il vostro MCU invia semplicemente comandi seriali (UART) come:
Example: 02 53 00 32 → Set dimmer 0 to 50% Response: 00 → OK
| LIVELLO | Luminosità |
| 0x00 (0) | 0% — spento |
| 0x32 (50) | 50% |
| 0x64 (100) | 100% — luminosità massima |
Confronto software vs hardware
| Criterio | rbdimmerESP32.h | DimmerLink |
| Costo (BOM) | $0 | $1.5 |
| Consumo energetico | Uguale al MCU | +10 mA |
| Spazio su PCB | 0 (software) | ~1×2 cm |
| Certificazione (CE/UL) | Solo DIY | Solo DIY |
| Supporto ESP8266 | ❌ | ✔️ |
| Supporto ESP32 | ✔️ | ✔️ |
Raspberry Pi/Orange Pi.. | ❌ | ✔️ |
| Più dimmer | ⚠️ complesso | ✔️ facile |
| Adatto ai principianti | ❌ | ✔️ |
| Pronto per la produzione | ⚠️ | ✔️ |
Albero decisionale: quale soluzione è giusta per me?
State usando ESP8266?
- Usate DimmerLink
State usando ESP32 e volete il controllo totale?
- Usate rbdimmerESP32
Vi servono più dimmer e stabilità assoluta?
- Usate DimmerLink
State sviluppando un prodotto commerciale?
- Usate DimmerLink
State sperimentando e imparando la programmazione in tempo reale?
- Usate rbdimmerESP32
Conclusione
La dimmerizzazione con TRIAC non riguarda la tensione — riguarda il timing al microsecondo.
Il Wi-Fi non è in tempo reale.
I ritardi sono pericolosi.
La Flash è imprevedibile.
If you want stable light and zero flicker, isolate timing or move it to dedicated hardware - DimmerLink.