Passa al contenuto

Sfarfallio LED con dimmer AC: TRIAC o MOSFET — cause e soluzioni

LED sfarfalla durante la regolazione? Tre cause fondamentali spiegate — qualità del driver LED, corrente di mantenimento TRIAC, timing ESP32 — con soluzioni specifiche per ciascuna, incluso il dimmer AC MOSFET come soluzione hardware.

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:

  • ☐ Lampadine LED di qualsiasi marca (incluse le no-name economiche)
  • ☐ Carichi leggeri — singola lampada da 5–20 W
  • ☐ Serve un ampio range di regolazione (5–95 %)
  • ☐ Si vuole eliminare lo sfarfallio senza sostituire le lampade
  • 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à:

    1. Philips WarmGlow, SceneSwitch, Master LED
    2. Osram CLASSIC A, SUPERSTAR
    3. 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:

  • ☐ Raspberry Pi / single-board computer (nessun OS real-time per ISR)
  • ☐ ESP32 single-core (S2, C3, H2) — librerie software non supportate
  • ☐ WiFi in conflitto con gli interrupt su ESP32
  • ☐ Serve stabilità senza fare debug del timing
  • cpp
    // 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.

    cpp
    // 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à:

    cpp
    // 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 invariato

    Regola 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

    cpp
    // 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 rbdimmerESP32 su 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)

    cpp
    // 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:

  • ☐ Hai considerato un dimmer AC MOSFET come soluzione hardware?
  • ☐ La lampada è etichettata «dimmable» ed è di un marchio di qualità (Philips, Osram)?
  • ☐ Il carico totale supera i 15 W (o è collegata una resistenza di lastro)?
  • ☐ La luminosità minima nel codice è impostata al 20 % o più?
  • ☐ Stai usando rbdimmerESP32 per ESP32 (non il vecchio RBDdimmer)?
  • ☐ Hai testato semplicemente cambiando la lampada senza modificare il codice?
  • ☐ ESP32 + WiFi: lo sfarfallio scompare con `WiFi.disconnect()`?
  • → 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



    Hai ancora domande?

    Post on rbdimmer.com forum or open a GitHub Issue.

    Condividi articolo
    Accedi per lasciare un commento