Passa al contenuto

Il dimmer AC non si spegne: bagliore residuo allo 0%

Perché una lampada continua a brillare debolmente quando il dimmer è allo 0% e come eliminarlo con comandi software, un circuito RC snubber o un relè.

In sintesi: Impostare il dimmer allo 0% non garantisce lo spegnimento della lampada. La corrente di mantenimento del TRIAC mantiene la conduzione con carichi bassi. Soluzione: chiamare dimmer.setState(OFF) o setMode(OFF_MODE) invece di setPower(0) — oppure aggiungere un relè per la disconnessione galvanica completa. DimmerLink arresta tutti gli impulsi di gate al livello 0, eliminando il problema via software.




Come si manifesta il problema

Si chiama setPower(0) o si imposta brightness: 0 nell'automazione. Il carico dovrebbe essere spento. Invece:

  • una lampada a incandescenza o alogena continua a brillare debolmente;
  • la lampada può sfarfallare lentamente (1–4 Hz) al livello «zero»;
  • il comportamento peggiora con lampade di bassa potenza (25–40 W) e scompare con 100 W+.

Questo non è un errore di codice. È una proprietà fondamentale dei circuiti TRIAC nell'interazione con piccoli carichi resistivi.




Cause fondamentali


Causa 1 — Corrente di mantenimento del TRIAC

Un TRIAC (Triode for Alternating Current) conduce in entrambi i semicicli AC dopo l'innesco. Per smettere di condurre deve raggiungere naturalmente il passaggio per lo zero — e la corrente attraverso il carico al momento del passaggio deve scendere al di sotto della corrente di mantenimento (I_H) del dispositivo.

Corrente di mantenimento tipica per un BTA16 o BT138 TRIAC: 25–80 mA.

Con una lampada da 25 W a 230 V:

text
I_load = 25 W / 230 V ≈ 109 mA  (picco durante la conduzione)

A un angolo di taglio di fase molto piccolo (vicino allo 0%, cioè vicino al passaggio per lo zero), l'impulso di corrente è così breve che scende sotto I_H prima che il TRIAC abbia il tempo di agganciarsi. Risultato: in alcuni semicicli il TRIAC si apre, in altri no — producendo uno sfarfallio lento e irregolare o un bagliore costante debole.


Causa 2 — Corrente di dispersione dell'optoaccoppiatore

L'optoaccoppiatore di pilotaggio del TRIAC (MOC3041, MOC3021 o equivalente) lascia passare una piccola corrente di dispersione (tipicamente 1–5 mA) anche quando il LED interno è spento. Per una lampada da 100 W questo è invisibile. Per una lampada LED da 10 W o una lampada a incandescenza da 25 W, la dispersione da sola può essere sufficiente per mantenere un bagliore.


Causa 3 — Impulso minimo della libreria allo 0%

Sia RBDdimmer che rbdimmerESP32 impongono un angolo di innesco minimo diverso da zero per evitare instabilità hardware vicino ai passaggi per lo zero. La chiamata a setPower(0) può comunque generare un impulso di gate molto breve ad ogni semiciclo. Il carico riceve quindi un piccolo burst di potenza — insufficiente per accendere una lampadina da 100 W, ma visibile su una lampada da 25 W.

La soluzione è commutare la libreria in modalità OFF, non semplicemente impostare la potenza a 0.




Diagnosi del problema

  1. Verificare la potenza — sostituire la lampada da 25–40 W con una a incandescenza da 100 W. Se il bagliore scompare, la corrente di mantenimento è la causa.
  2. Scollegare il MCU — staccare tutti i segnali di controllo (DIM, ZC, VCC, GND lato MCU). Se la lampada continua a brillare, la corrente di dispersione è la causa; se si spegne, la libreria sta inviando impulsi residui.
  3. Verificare la chiamata API — cercare setPower(0) nel codice. Confermare di non aver dimenticato una chiamata a setState(OFF).



Soluzioni


🟢 Per principianti — Usare DimmerLink o un relè

DimmerLink gestisce l'innesco del gate nel proprio firmware (Cortex-M0+). Al livello 0 non genera impulsi di gate — il TRIAC non viene innescato indipendentemente dalla dispersione. Scrivere 0 nel registro 0x10 (DIM0_LEVEL) e la lampada si spegne completamente.

cpp
// Arduino / ESP32 — DimmerLink I2C
Wire.beginTransmission(0x50);
Wire.write(0x10);   // registro DIM0_LEVEL
Wire.write(0);      // 0% — nessun impulso di gate
Wire.endTransmission();

Aggiungere un relè se il carico deve essere completamente disalimentato (isolamento galvanico). Collegare un relè normalmente aperto (o SSR) in serie con l'AC-IN del dimmer. Aprire il relè quando il carico deve essere spento; chiuderlo per abilitare la dimmerizzazione:

cpp
// Esempio Arduino
const int RELAY_PIN = 7;
void setLoad(bool on, uint8_t level) {
    if (!on) {
        dimmer.setState(OFF);
        digitalWrite(RELAY_PIN, LOW);   // relè aperto — completamente spento
    } else {
        digitalWrite(RELAY_PIN, HIGH);  // relè chiuso — percorso AC attivo
        delay(5);                       // attendere la stabilizzazione dei contatti
        dimmer.setState(ON);
        dimmer.setPower(level);
    }
}


🔵 Per utenti avanzati — Soluzioni software e hardware


Opzione A — Usare la corretta modalità OFF (software)

setPower(0) imposta l'angolo di innesco vicino a zero ma può comunque generare un impulso. Il modo corretto per spegnere completamente il carico è cambiare la modalità operativa:

rbdimmerESP32 / RBDdimmer:

cpp
#include <rbdimmerESP32.h>  // o RBDdimmer.h per AVR/ESP8266
rbdimmer::Dimmer dimmer(DIM_PIN, ZC_PIN);
void setup() {
    dimmer.begin(NORMAL_MODE, ON);
    dimmer.setPower(50);
}
void turnOff() {
    // Corretto: commutare la modalità su OFF — nessun impulso di gate
    dimmer.setState(OFF);
    // Errato: dimmer.setPower(0) — può comunque innescare
}
void turnOn(uint8_t level) {
    dimmer.setState(ON);
    dimmer.setPower(level);
}

Se la versione della libreria usa setMode():

cpp
dimmer.setMode(OFF_MODE);    // spegne
dimmer.setMode(NORMAL_MODE); // riprende la dimmerizzazione

Componente ESPHome ac_dimmer:

Il componente ac_dimmer di ESPHome imposta output: false per inibire completamente gli impulsi di gate:

yaml
output:
  - platform: ac_dimmer
    id: triac_output
    gate_pin: GPIO4
    zero_cross_pin: GPIO5
light:
  - platform: monochromatic
    output: triac_output
    name: "Lamp"
    # Quando HA invia un comando di spegnimento, il componente arresta gli impulsi di gate.

Quando Home Assistant invia un comando di spegnimento, ESPHome arresta completamente gli impulsi di gate — il TRIAC non viene innescato e la lampada si spegne.


Opzione B — Circuito RC snubber (hardware)

Un circuito RC snubber collegato in parallelo al TRIAC riduce la velocità di salita della tensione (dV/dt) ai capi del dispositivo dopo un passaggio per lo zero. Questo aiuta il TRIAC ad autocommutarsi in modo affidabile ad angoli di conduzione piccoli.

text
Anodo/catodo del TRIAC
┌──────────┐
│  TRIAC   │
└──────────┘
     │     ← in parallelo: 100 Ω (0,5 W) + 100 nF classe X2
     └── R ── C ── ┘

Valori standard dello snubber: R = 100 Ω (0,5 W) e C = 100 nF, classe X2 (dimensionato per la tensione di rete).

La maggior parte dei moduli rbdimmer include già uno snubber integrato. Verificare lo schema del modulo prima di aggiungerne uno esterno.

Un circuito RC snubber non elimina completamente il problema — rende lo spegnimento del TRIAC più affidabile, ma la dispersione dell'optoaccoppiatore persiste.


Opzione C — Relè in serie per disconnessione completa

Se il carico deve essere completamente disalimentato (requisito di sicurezza o carico induttivo), aggiungere un relè in serie:

Scenario Tipo di relè Nota
Carichi normali Relè SPST NO Aperto = nessun percorso AC
Induttivi (motori) Relè SPST NO Soppressione dell'arco raccomandata
Isolamento dalla rete richiesto SSR (relè a stato solido) Nessuna parte mobile

Usare il dimmer per il controllo di potenza e il relè per accensione/spegnimento:

cpp
void loop() {
    if (targetLevel == 0) {
        dimmer.setState(OFF);
        digitalWrite(RELAY_PIN, LOW);
    } else {
        digitalWrite(RELAY_PIN, HIGH);
        delay(5);
        dimmer.setState(ON);
        dimmer.setPower(targetLevel);
    }
}



Matrice di compatibilità dei carichi

Carico Sintomo allo 0% Causa Soluzione
Incandescenza 100 W+ Nessun bagliore Carico sufficiente setState(OFF) sufficiente
Incandescenza 25–40 W Bagliore debole Corrente di mantenimento setState(OFF) o relè
Alogena 50 W Bagliore o sfarfallio lento Corrente di mantenimento RC snubber + setState(OFF)
Alogena 12 V (trasformatore) Bagliore Corrente reattiva Relè per disconnessione completa
Elemento riscaldante Nessun bagliore Carico resistivo setState(OFF) sufficiente



Errori frequenti

Errore Effetto Soluzione
Chiamare setPower(0) invece di setState(OFF) Impulso residuo ad ogni semiciclo Usare setState(OFF)
Presumere che 0% = spento per lampade di bassa potenza Bagliore o sfarfallio Usare la modalità OFF
Aggiungere uno snubber sottodimensionato (resistore < 0,5 W) Surriscaldamento dello snubber Usare un resistore da 0,5 W o 1 W
Usare un relè senza protezione d'arco su carichi induttivi Saldatura dei contatti Aggiungere snubber sui contatti del relè



Checklist rapida

Prima di sostituire l'hardware, verificare in quest'ordine:

  • ☐ Il codice usa `setState(OFF)` / `setMode(OFF_MODE)`, non solo `setPower(0)`
  • ☐ La potenza della lampada è > 60 W (al di sotto, la corrente di mantenimento è spesso la causa)
  • ☐ La versione della libreria supporta una modalità OFF separata
  • ☐ Lo snubber integrato nel modulo è presente (verificare la PCB)
  • ☐ Se DimmerLink: il registro di livello 0x10 è impostato a 0 via I2C



  • Articoli correlati



    Hai ancora domande?

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

    Condividi articolo
    Accedi per lasciare un commento