Zum Inhalt springen

AC-Dimmer schaltet nicht ab: Restleuchten bei 0%

Warum eine Lampe bei 0% Dimmerstellung schwach weiterleuchtet und wie Sie dies mit Software-Befehlen, einem RC-Snubber oder einem Relais beseitigen.

Kurzfassung: Das Einstellen des Dimmers auf 0% garantiert nicht, dass die Lampe erlischt. Der TRIAC-Haltestrom hält den Schalter bei kleinen Lasten leitend. Lösung: Rufen Sie dimmer.setState(OFF) oder setMode(OFF_MODE) auf anstelle von setPower(0) — oder fügen Sie ein Relais für vollständige galvanische Trennung hinzu. DimmerLink stoppt alle Gate-Impulse bei Stufe 0 und beseitigt das Problem per Software.




Wie sich das Problem zeigt

Sie rufen setPower(0) auf oder setzen brightness: 0 in Ihrer Automatisierung. Die Last sollte aus sein. Stattdessen:

  • eine Glüh- oder Halogenlampe leuchtet weiterhin schwach;
  • die Lampe kann langsam flackern (1–4 Hz) auf „Null"-Stufe;
  • das Verhalten ist schlimmer bei Lampen geringer Leistung (25–40 W) und verschwindet ab 100 W+.

Dies ist kein Code-Fehler. Es ist eine grundlegende Eigenschaft von TRIAC-Schaltungen bei Interaktion mit kleinen ohmschen Lasten.




Grundursachen


Ursache 1 — TRIAC-Haltestrom

Ein TRIAC (Triode for Alternating Current) leitet in beiden AC-Halbwellen nach dem Zünden. Um die Leitung zu stoppen, muss er natürlich den Nulldurchgang erreichen — und der Strom durch die Last im Moment des Durchgangs muss unter den Haltestrom (I_H) des Bauteils fallen.

Typischer Haltestrom für einen BTA16 oder BT138 TRIAC: 25–80 mA.

Bei einer 25-W-Lampe an 230 V:

text
I_load = 25 W / 230 V ≈ 109 mA  (Spitzenwert während der Leitung)

Bei einem sehr kleinen Phasenanschnittwinkel (nahe 0%, d.h. nahe dem Nulldurchgang) ist der Stromimpuls so kurz, dass er unter I_H fällt, bevor der TRIAC Zeit hat zu zünden. Ergebnis: In manchen Halbwellen öffnet der TRIAC, in anderen nicht — es entsteht langsames, unregelmäßiges Flackern oder ein konstantes schwaches Leuchten.


Ursache 2 — Optokoppler-Leckstrom

Der TRIAC-Treiber-Optokoppler (MOC3041, MOC3021 oder gleichwertig) lässt einen geringen Leckstrom (typisch 1–5 mA) durch, selbst wenn die interne LED aus ist. Bei einer 100-W-Lampe ist dies unsichtbar. Bei einer 10-W-LED-Lampe oder einer 25-W-Glühlampe kann der Leckstrom allein ausreichen, um ein Leuchten aufrechtzuerhalten.


Ursache 3 — Minimaler Bibliotheks-Impuls bei 0%

Sowohl RBDdimmer als auch rbdimmerESP32 erzwingen einen minimalen, von null verschiedenen Zündwinkel, um Hardware-Instabilität nahe den Nulldurchgängen zu vermeiden. Der Aufruf von setPower(0) kann dennoch einen sehr kurzen Gate-Impuls in jeder Halbwelle erzeugen. Die Last erhält daher einen winzigen Leistungsstoß — nicht genug, um eine 100-W-Lampe zum Leuchten zu bringen, aber sichtbar bei einer 25-W-Lampe.

Die Lösung ist, den Bibliotheks-Modus auf OFF umzuschalten, nicht nur die Leistung auf 0 zu setzen.




Diagnose des Problems

  1. Leistung prüfen — ersetzen Sie die 25–40-W-Lampe durch eine 100-W-Glühlampe. Wenn das Leuchten verschwindet, ist der Haltestrom die Ursache.
  2. MCU trennen — ziehen Sie alle Steuersignale ab (DIM, ZC, VCC, GND auf der MCU-Seite). Wenn die Lampe weiterhin leuchtet, ist der Leckstrom die Ursache; wenn sie erlischt, sendet die Bibliothek Restimpulse.
  3. API-Aufruf prüfen — durchsuchen Sie Ihren Code nach setPower(0). Stellen Sie sicher, dass Sie keinen setState(OFF)-Aufruf vergessen haben.



Lösungen


🟢 Für Einsteiger — DimmerLink oder Relais verwenden

DimmerLink verwaltet die Gate-Zündung in seiner eigenen Firmware (Cortex-M0+). Bei Stufe 0 erzeugt er keine Gate-Impulse — der TRIAC wird unabhängig vom Leckstrom nicht getriggert. Schreiben Sie 0 in Register 0x10 (DIM0_LEVEL), und die Lampe schaltet vollständig ab.

cpp
// Arduino / ESP32 — DimmerLink I2C
Wire.beginTransmission(0x50);
Wire.write(0x10);   // DIM0_LEVEL-Register
Wire.write(0);      // 0% — keine Gate-Impulse
Wire.endTransmission();

Relais hinzufügen, wenn die Last vollständig spannungsfrei sein muss (galvanische Trennung). Schließen Sie ein Schließer-Relais (oder SSR) in Reihe mit dem AC-IN des Dimmers an. Öffnen Sie das Relais, wenn die Last aus sein soll; schließen Sie es zum Dimmen:

cpp
// Arduino-Beispiel
const int RELAY_PIN = 7;
void setLoad(bool on, uint8_t level) {
    if (!on) {
        dimmer.setState(OFF);
        digitalWrite(RELAY_PIN, LOW);   // Relais offen — vollständig aus
    } else {
        digitalWrite(RELAY_PIN, HIGH);  // Relais geschlossen — AC-Pfad aktiv
        delay(5);                       // Kontakte einschwingen lassen
        dimmer.setState(ON);
        dimmer.setPower(level);
    }
}


🔵 Für fortgeschrittene Anwender — Software- und Hardware-Lösungen


Option A — Korrekten OFF-Modus verwenden (Software)

setPower(0) setzt den Zündwinkel auf nahe null, kann aber dennoch einen Impuls erzeugen. Der korrekte Weg, die Last vollständig auszuschalten, ist den Betriebs-Modus zu ändern:

rbdimmerESP32 / RBDdimmer:

cpp
#include <rbdimmerESP32.h>  // oder RBDdimmer.h für AVR/ESP8266
rbdimmer::Dimmer dimmer(DIM_PIN, ZC_PIN);
void setup() {
    dimmer.begin(NORMAL_MODE, ON);
    dimmer.setPower(50);
}
void turnOff() {
    // Korrekt: Modus auf OFF umschalten — keine Gate-Impulse
    dimmer.setState(OFF);
    // Falsch: dimmer.setPower(0) — kann weiterhin zünden
}
void turnOn(uint8_t level) {
    dimmer.setState(ON);
    dimmer.setPower(level);
}

Wenn Ihre Bibliotheksversion setMode() verwendet:

cpp
dimmer.setMode(OFF_MODE);    // schaltet ab
dimmer.setMode(NORMAL_MODE); // setzt das Dimmen fort

ESPHome ac_dimmer-Komponente:

Die ESPHome-Komponente ac_dimmer setzt output: false, um Gate-Impulse vollständig zu unterbinden:

yaml
output:
  - platform: ac_dimmer
    id: triac_output
    gate_pin: GPIO4
    zero_cross_pin: GPIO5
light:
  - platform: monochromatic
    output: triac_output
    name: "Lamp"
    # Wenn HA einen Ausschaltbefehl sendet, stoppt die Komponente die Gate-Impulse.

Wenn Home Assistant einen Ausschaltbefehl sendet, stoppt ESPHome die Gate-Impulse vollständig — der TRIAC wird nicht getriggert und die Lampe erlischt.


Option B — RC-Snubber (Hardware)

Ein RC-Snubber, der parallel zum TRIAC geschaltet ist, reduziert die Spannungsanstiegsrate (dV/dt) am Bauteil nach einem Nulldurchgang. Dies hilft dem TRIAC, sich bei kleinen Leitungswinkeln zuverlässig selbst zu kommutieren.

text
TRIAC Anode/Kathode
┌──────────┐
│  TRIAC   │
└──────────┘
     │     ← parallel: 100 Ω (0,5 W) + 100 nF Klasse X2
     └── R ── C ── ┘

Standard-Snubber-Werte: R = 100 Ω (0,5 W) und C = 100 nF, Klasse X2 (für Netzspannung ausgelegt).

Die meisten rbdimmer-Module enthalten bereits einen eingebauten Snubber. Prüfen Sie den Schaltplan Ihres Moduls, bevor Sie einen externen hinzufügen.

Ein RC-Snubber beseitigt das Problem nicht vollständig — er macht das TRIAC-Abschalten zuverlässiger, aber der Optokoppler-Leckstrom bleibt bestehen.


Option C — Reihen-Relais für vollständige Trennung

Wenn die Last vollständig spannungsfrei sein muss (Sicherheitsanforderung oder induktive Last), fügen Sie ein Relais in Reihe hinzu:

Szenario Relaistyp Hinweis
Normale Lasten SPST-NO-Relais Offen = kein AC-Pfad
Induktiv (Motoren) SPST-NO-Relais Funkenunterdrückung empfohlen
Netzisolation erforderlich SSR (Halbleiterrelais) Keine beweglichen Teile

Verwenden Sie den Dimmer zur Leistungssteuerung und das Relais zum Ein-/Ausschalten:

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);
    }
}



Lastkompatibilitätsmatrix

Last Symptom bei 0% Ursache Lösung
Glühlampe 100 W+ Kein Leuchten Ausreichende Last setState(OFF) ausreichend
Glühlampe 25–40 W Schwaches Leuchten Haltestrom setState(OFF) oder Relais
Halogen 50 W Leuchten oder langsames Flackern Haltestrom RC-Snubber + setState(OFF)
Halogen 12 V (Trafo) Leuchten Blindstrom Relais für vollständige Trennung
Heizelement Kein Leuchten Ohmsche Last setState(OFF) ausreichend



Häufige Fehler

Fehler Auswirkung Lösung
setPower(0) statt setState(OFF) aufrufen Restimpuls in jeder Halbwelle setState(OFF) verwenden
Annahme, dass 0% = aus bei Lampen geringer Leistung Leuchten oder Flackern OFF-Modus verwenden
Unterdimensionierten Snubber einbauen (< 0,5-W-Widerstand) Snubber überhitzt 0,5-W- oder 1-W-Widerstand verwenden
Relais ohne Funkenunterdrückung bei induktiven Lasten Kontaktverschweißung Snubber an Relaiskontakten anbringen



Schnell-Checkliste

Bevor Sie Hardware austauschen, prüfen Sie in dieser Reihenfolge:

  • ☐ Code verwendet `setState(OFF)` / `setMode(OFF_MODE)`, nicht nur `setPower(0)`
  • ☐ Lampenleistung ist > 60 W (darunter ist Haltestrom oft die Ursache)
  • ☐ Bibliotheksversion unterstützt einen separaten OFF-Modus
  • ☐ Eingebauter Snubber auf dem Modul vorhanden (PCB prüfen)
  • ☐ Wenn DimmerLink: Level-Register 0x10 ist auf 0 via I2C gesetzt



  • Verwandte Artikel



    Noch Fragen?

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

    Diesen Beitrag teilen
    Anmelden , um einen Kommentar zu hinterlassen