Passa al contenuto

How to Fix ESP32 AC Dimmer Flickering. Guide

ESP32 TRIAC dimmer flickers? Learn why it happens and 2 proven solutions: software (rbdimmerESP32.h) vs hardware (DimmerLink module).
10 febbraio 2026 di
How to Fix ESP32 AC Dimmer Flickering. Guide
Administrator
| Ancora nessun commento

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:

  1. 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
LIVELLOLuminosità
0x00 (0)0% — spento
0x32 (50)50%
0x64 (100)100% — luminosità massima

Confronto software vs hardware

CriteriorbdimmerESP32.hDimmerLink
Costo (BOM)$0$1.5
Consumo energeticoUguale al MCU+10 mA
Spazio su PCB0 (software)~1×2 cm
Certificazione (CE/UL)Solo DIYSolo 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.




Condividi articolo
Accedi per lasciare un commento