In breve: Lo sfarfallio LED con un dimmer AC ha tre cause distinte. I Tipi 1 e 2 sono causati da incompatibilità architettonica dei dimmer AC TRIAC con le lampadine LED — la soluzione hardware è un dimmer AC MOSFET (trailing edge, progettato per LED). Se si usa un dimmer TRIAC, passare a una lampada Philips/Osram/Ikea e mantenere la luminosità sopra il 20 %. Il Tipo 3 è una perturbazione del timing ESP32 da WiFi/BLE — risolto dalla libreria rbdimmerESP32 o DimmerLink (applicabile a qualsiasi tipo di dimmer).
Il problema
Hai configurato il dimmer, il codice funziona, il rilevamento del passaggio per lo zero è corretto — ma la lampadina LED sfarfalla ancora. È più evidente al di sotto del 40–50 % di luminosità. Sospetti un problema con gli interrupt o il timing, ma le modifiche al codice non aiutano.
La chiave: lo sfarfallio ha cause multiple che richiedono soluzioni diverse. Le modifiche al codice aiutano solo con il Tipo 3 (timing ESP32). Per i Tipi 1 e 2, è necessario cambiare il tipo di dimmer (a MOSFET) o la lampada — non il codice.
Sintomi per tipo di sfarfallio:
Tipo 1 (driver LED / architettura TRIAC):
- «Le LED dimmerabili economiche usano la rete attenuata direttamente per il PWM del LED, causando sfarfallio percepibile» (Arduino Forum, 2019)
- Sfarfallio visibile sotto il 40–50 % di luminosità; lampada ok al 100 %
- Le modifiche al codice non fanno differenza — stesso effetto con qualsiasi impostazione
- Anche al 50 %, le lampade economiche sfarfallano visibilmente
Tipo 2 (corrente di mantenimento TRIAC):
- Lampi casuali a bassa luminosità o con carico leggero
- Ronzio/sibilo sotto il 20 % di luminosità
- Singola lampadina LED da 5–7 W senza carico aggiuntivo
Tipo 3 (timing ESP32):
- Sfarfallio irregolare, imprevedibile — non sincronizzato con la rete
- Scompare disconnettendo il WiFi (
WiFi.disconnect()) - Appare sotto carico attivo MQTT/HTTP su ESP32
- Anche le lampade di qualità sfarfallano — cambia modificando il codice
TRIAC vs MOSFET: perché il tipo di dimmer conta più del codice
I Tipi 1 e 2 non sono difetti della lampada o del codice. Sono il risultato del fatto che i dimmer AC TRIAC sono stati progettati per le lampadine a incandescenza — non per le lampadine LED.
| Parametro | Dimmer AC TRIAC | Dimmer AC MOSFET |
|---|---|---|
| Metodo di commutazione | Leading edge (picco brusco all'inizio del semiciclo) | Trailing edge (taglio dolce alla fine) |
| Progettato per | Incandescenza, alogeno, riscaldatori resistivi | Lampadine LED, trasformatori a bassa tensione |
| Corrente di mantenimento | Sì — corrente minima per rimanere conduttivo | No — funziona con qualsiasi carico |
| Sfarfallio LED | Tipi 1 e 2 con lampade economiche | Nessuno — trailing edge è compatibile con LED |
| Range di regolazione LED | 20–95 % (instabile sotto) | 5–95 % |
Il dimmer AC MOSFET elimina i Tipi 1 e 2 a livello hardware:
- Il trailing edge apre il carico all'inizio di ogni semiciclo: il driver LED riceve immediatamente la tensione piena e carica i suoi condensatori tampone — la pulsazione a 100/120 Hz scompare.
- Nessuna corrente di mantenimento: funzionamento stabile anche con carichi piccoli come 5 W.
Il Tipo 3 (timing ESP32) si applica ugualmente a entrambi i tipi di dimmer — non è correlato al metodo di commutazione, solo alla precisione degli interrupt del MCU.
Cause fondamentali
Detailed theory of zero-cross detection and TRIAC operation: AC Dimmer: Zero-Cross and TRIAC — How It Works.
Tipo 1: sfarfallio del driver LED (specifico del TRIAC)
Il TRIAC taglia la sinusoide AC dal leading edge: in ogni semiciclo la prima parte viene tagliata e la corrente scorre solo nella seconda parte. A bassa luminosità — solo un breve impulso di corrente alla fine di ogni semiciclo.
Un driver LED di qualità ammorbidisce questi impulsi tramite condensatori ed esegue il proprio PWM ad alta frequenza (1–4 kHz). Risultato: luce stabile e uniforme.
Un driver LED economico raddrizza la corrente senza buffer. Il LED riceve corrente continua pulsante a 100 Hz (rete a 50 Hz) o 120 Hz (rete a 60 Hz). Questa frequenza è visibile all'occhio umano — lo sfarfallio è evidente.
Un dimmer AC MOSFET (trailing edge) apre il carico all'inizio di ogni semiciclo: il driver LED riceve immediatamente la tensione piena e carica i suoi condensatori. La pulsazione a 100 Hz scompare — anche con una lampada economica.
Tipo 2: corrente di mantenimento TRIAC (specifico del TRIAC)
Ogni TRIAC ha un parametro di corrente di mantenimento — la corrente minima necessaria per rimanere conduttivo. Se la corrente di carico scende sotto questo valore, il TRIAC si spegne casualmente — prima del passaggio per lo zero. Risultato: semicicli mancanti, lampi casuali e ronzio a bassa luminosità.
Il MOSFET non ha corrente di mantenimento — è un transistor, non un tiristore. Funzionamento stabile anche con carichi piccoli come 5 W.
Tipo 3: perturbazione del timing ESP32 (indipendente dal dimmer)
Il controllo TRIAC richiede precisione di ±50 µs: il MCU deve far scattare il TRIAC esattamente al ritardo calcolato dopo il passaggio per lo zero. Lo stack WiFi di ESP32 e i task RTOS possono ritardare l'esecuzione dell'ISR di 200–500 µs — lo sfarfallio appare sotto WiFi attivo.
Sorgenti di ritardo:
- Lo stack WiFi / BLE blocca temporaneamente gli interrupt durante l'elaborazione dei pacchetti
- Accesso alla memoria Flash (OTA, SPIFFS, Serial) — congelamento per 10–100 ms
- ISR non in IRAM: ESP32 la legge dalla Flash ad ogni chiamata — aggiunge ritardo
loop()e WiFi sullo stesso core (Core 1) competono per la CPU
Differenza chiave rispetto ai Tipi 1 e 2: lo sfarfallio è irregolare,
scompare con WiFi.disconnect(), e cambia modificando il codice — non
cambiando la lampada.
Detailed breakdown: How to Fix ESP32 AC Dimmer Flickering.
Soluzioni
🔑 Soluzione migliore: dimmer AC MOSFET
Elimina i Tipi 1 e 2 a livello hardware — senza sostituzione della lampada, senza tuning del codice.
Il dimmer AC MOSFET (trailing edge) è progettato specificamente per le lampadine LED. La commutazione trailing edge dà al driver LED un inizio pulito a ogni semiciclo — la pulsazione a 100/120 Hz scompare. Nessuna corrente di mantenimento — funzionamento stabile con una singola lampada da 5–7 W.
Quando scegliere il dimmer AC MOSFET:
Il Tipo 3 (timing ESP32) si applica anche ai dimmer MOSFET — la precisione dell'ISR è ugualmente importante. Usare rbdimmerESP32 o DimmerLink per risolverlo.
🟢 Principiante: TRIAC + lampada di qualità o DimmerLink
Si usa un dimmer TRIAC? Due opzioni: sostituire la lampada o usare DimmerLink.
Opzione 1: Sostituire la lampada con un modello con driver LED di qualità:
- Philips WarmGlow, SceneSwitch, Master LED
- Osram CLASSIC A, SUPERSTAR
- Ikea TRÅDFRI (gamma dimmerabile)
Cercare sulla confezione: «TRIAC dimmable», «phase-cut compatible», «leading edge compatible».
Opzione 2: Carico minimo.
Almeno 15–20 W. Per carichi più leggeri, collegare una resistenza di lastro in parallelo: 100–150 Ω / 20 W.
Opzione 3: Controllo I2C senza ISR — DimmerLink.
If you use Raspberry Pi, ESP32-S2/C3/H2, or simply don't want to deal with interrupts — DimmerLink controls TRIAC via I2C without writing any ISR code.
Quando scegliere DimmerLink:
// DimmerLink via I2C — senza ISR, senza passaggio per lo zero nel codice
// Funziona con: Arduino, ESP32, Raspberry Pi
// Documentazione: https://www.rbdimmer.com/docs/dimmerlink-I2CCommunication
#include <Wire.h>
#define DIMMER_ADDR 0x50
#define REG_LEVEL 0x10
// Impostare la luminosità (20–95 % per lampadine LED con 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); // 50 % di luminosità
}
void loop() {}Risultato: luminosità stabile senza sfarfallio, a condizione di usare una lampada di qualità.
🔵 Avanzato: correggere il timing ESP32 (Tipo 3)
Il Tipo 3 si applica a qualsiasi dimmer AC — TRIAC o MOSFET.
Identificare prima il tipo di sfarfallio — altrimenti la correzione non aiuterà:
| Sintomo | Tipo | Soluzione |
|---|---|---|
| Stesso sfarfallio con qualsiasi codice | Tipo 1 — driver LED | Dimmer AC MOSFET o sostituire lampada |
| Lampi casuali, ronzio < 20 % | Tipo 2 — corrente di mantenimento TRIAC | Dimmer AC MOSFET o min. 20 % |
| Cambia con WiFi acceso/spento | Tipo 3 — timing ESP32 | IRAM_ATTR / rbdimmerESP32 |
Correggere il timing ESP32 (Tipo 3)
Se lo sfarfallio scompare con WiFi.disconnect() — il problema è il timing
dell'ISR.
// Problema: ISR non in IRAM — ESP32 la legge dalla Flash ad ogni chiamata
// Soluzione: IRAM_ATTR posiziona l'ISR in RAM in modo permanente
// ❌ Errato (senza IRAM_ATTR — sfarfallio sotto carico WiFi):
void zeroCrossISR() {
triggerTriac();
}
// ✅ Corretto (IRAM_ATTR — ISR sempre in RAM, senza ritardi Flash):
void IRAM_ATTR zeroCrossISR() {
triggerTriac();
}For rbdimmerESP32, IRAM_ATTR is applied automatically inside the library.
La separazione dei core migliora ulteriormente la stabilità:
// rbdimmerESP32: ISR gira su Core 0 (core di sistema)
// loop() e WiFi girano su Core 1 — nessuna competizione CPU
#include "rbdimmerESP32.h"
// ... resto del codice invariatoRegola chiave per le lampadine LED: non impostare mai la luminosità sotto il 20 %. La maggior parte delle lampadine LED si comporta in modo instabile nell'intervallo 0–15 %.
Opzione A: ESP32 con rbdimmerESP32 ✅ Consigliato
When: dual-core ESP32 only (not S2/C3/H2) Library: rbdimmerESP32 — docs · GitHub
// Piattaforma: ESP32 dual-core
// Libreria: rbdimmerESP32
// Range: 20–95 % per dimmerizzazione LED stabile con TRIAC
#include "rbdimmerESP32.h"
#define ZC_PIN 18 // ingresso passaggio per lo zero
#define DIM_PIN 19 // controllo gate TRIAC
rbdimmer dimmer;
// Limitare il range di luminosità per le lampadine LED
void setLedLevel(uint8_t percent) {
// Converte 0–100 % → 20–95 % per stabilità LED con 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); // rete a 50 Hz
setLedLevel(50);
}
void loop() {}Errori comuni:
- Usare
rbdimmerESP32su ESP32 single-core (S2/C3/H2) — non supportato - Impostare luminosità = 0 invece di chiamare off: il TRIAC è instabile
con angoli di innesco molto piccoli. Usare
setPower(0)solo per spegnere completamente.
Opzione B: Arduino AVR (Uno, Mega, Nano)
When: AVR boards only — do not use on ESP32! Library: RBDdimmer (legacy)
// Piattaforma: Arduino Uno / Mega / Nano (solo AVR)
// ATTENZIONE: per ESP32 usare rbdimmerESP32!
// Passaggio per lo zero: solo pin 2 o 3 su Uno/Nano
#include <RBDdimmer.h>
#define ZC_PIN 2 // passaggio per lo zero — solo pin 2 o 3
#define DIM_PIN 11 // pin con PWM
dimmerLamp dimmer(DIM_PIN, ZC_PIN);
void setup() {
dimmer.begin(NORMAL_MODE, ON);
dimmer.setPower(20); // minimo 20 % per lampadine LED
}
void loop() {}⚠️ Errori comuni dai forum
Errori reali da 3 thread di forum (2019–2025).
-
«Ho provato codici diversi — lo sfarfallio non scompare»: Il codice non è il problema per i Tipi 1 e 2. Bisogna cambiare il dimmer (dimmer AC MOSFET) o la lampada (Philips/Osram).
-
«Sotto il 30 % di luminosità, lampi brillanti casuali»: Corrente di mantenimento TRIAC (Tipo 2). Soluzione: dimmer AC MOSFET, o mantenere la luminosità sopra il 20 %, o aggiungere più carico.
-
«Al 100 % funziona bene, sfarfalla solo quando si regola»: Segnale classico di un driver LED economico (Tipo 1). A piena potenza la sinusoide non viene tagliata. Dimmer AC MOSFET o sostituzione della lampada risolve.
-
«Ho aggiunto delay() in loop() — un po' meglio»: Illusione. Sincronizzazione accidentale con la frequenza di rete. Con altre impostazioni di luminosità lo sfarfallio riapparirà.
-
«ESP32 sfarfalla solo con WiFi attivo»: Tipo 3 — perturbazione del timing ISR. Soluzione:
rbdimmerESP32(IRAM_ATTR applicato automaticamente) o DimmerLink (isolamento hardware del controllo dimmer).
Lista di controllo rapida
Prima di pubblicare sul forum, verificare:
→ Tipo 3 — usare IRAM_ATTR o rbdimmerESP32
Tabella di compatibilità
| Lampada | TRIAC (leading edge) | MOSFET (trailing edge) | Note |
|---|---|---|---|
| Philips WarmGlow / Master LED | ✅ 10–95 % | ✅ 5–95 % | Consigliato |
| Osram SUPERSTAR | ✅ 15–95 % | ✅ 5–95 % | Consigliato |
| Ikea TRÅDFRI dimmable | ✅ 10–95 % | ✅ 5–95 % | Consigliato |
| «Dimmable» generica economica | ⚠️ Sfarfalla < 40 % | ✅ 5–95 % | MOSFET risolve |
| Lampadina a incandescenza | ✅ 10–95 % | ✅ 5–95 % | Carico resistivo ideale |
| Qualsiasi LED «non-dimmable» | ❌ Sfarfallio costante | ❌ Possibile | Sostituire la lampada |
Argomenti correlati
- LED Lamps with AC Dimmer: TRIAC vs MOSFET — Compatibility Guide
- Trailing Edge vs Leading Edge: Which Dimmer Method to Choose
Hai ancora domande?
Post on rbdimmer.com forum or open a GitHub Issue.