Zum Inhalt springen

LED-Flimmern mit AC-Dimmer: TRIAC oder MOSFET — Ursachen und Lösungen

LED flimmert beim Dimmen? Drei Grundursachen erklärt — LED-Treiberqualität, TRIAC-Haltestrom, ESP32-Timing — mit spezifischen Lösungen für jede, einschließlich MOSFET AC-Dimmer als Hardware-Lösung.

Kurzfassung: LED-Flimmern mit einem AC-Dimmer hat drei verschiedene Ursachen. Typen 1 und 2 entstehen durch architektonische Inkompatibilität von TRIAC AC-Dimmern mit LED-Lampen — die Hardware-Lösung ist ein MOSFET AC-Dimmer (Trailing Edge, entwickelt für LED). Bei Verwendung eines TRIAC-Dimmers: Wechseln Sie zu einer Philips/Osram/Ikea-Lampe und halten Sie die Helligkeit über 20 %. Typ 3 ist eine ESP32-Timing-Störung durch WiFi/BLE — behoben durch die rbdimmerESP32-Bibliothek oder DimmerLink (gilt für jeden Dimmertyp).



Das Problem

Sie haben Ihren Dimmer eingerichtet, der Code funktioniert, die Nulldurchgangserkennung ist korrekt — aber die LED-Lampe flimmert trotzdem. Am deutlichsten unter 40–50 % Helligkeit. Sie vermuten ein Problem mit Interrupts oder Timing, aber Code-Änderungen helfen nicht.

Die Kernaussage: Flimmern hat mehrere Grundursachen, die verschiedene Lösungen erfordern. Code-Änderungen helfen nur bei Typ 3 (ESP32-Timing). Bei Typen 1 und 2 müssen Sie den Dimmertyp (auf MOSFET) oder die Lampe wechseln — nicht den Code.

Symptome nach Flimmertyp:

Typ 1 (LED-Treiber / TRIAC-Architektur):

  • „Billige dimmbare LEDs verwenden das gedimmte Netz direkt zum PWM der LED, was zu merklichem Flimmern führt" (Arduino Forum, 2019)
  • Flimmern sichtbar unter 40–50 % Helligkeit; Lampe funktioniert bei 100 % einwandfrei
  • Code-Änderungen machen keinen Unterschied — gleicher Effekt bei allen Einstellungen
  • Selbst bei 50 % flimmern billige Lampen sichtbar

Typ 2 (TRIAC-Haltestrom):

  • Zufällige Blitze bei geringer Helligkeit oder kleiner Last
  • Summen/Brummen bei Helligkeit unter 20 %
  • Einzelne 5–7-W-LED-Lampe ohne zusätzliche Last

Typ 3 (ESP32-Timing):

  • Unregelmäßiges, unvorhersehbares Flimmern — nicht synchron mit dem Netz
  • Verschwindet beim Trennen des WiFi (WiFi.disconnect())
  • Erscheint unter aktiver MQTT/HTTP-Last auf dem ESP32
  • Qualitätslampen flimmern auch — ändert sich bei Code-Modifikation



TRIAC vs. MOSFET: Warum der Dimmertyp wichtiger ist als der Code

Typen 1 und 2 sind keine Fehler der Lampe oder des Codes. Sie sind das Ergebnis davon, dass TRIAC AC-Dimmer für Glühlampen entwickelt wurden — nicht für LED-Lampen.

Parameter TRIAC AC-Dimmer MOSFET AC-Dimmer
Schaltmethode Leading Edge (steiler Peak zu Beginn des Halbzyklus) Trailing Edge (sanfter Schnitt am Ende)
Entwickelt für Glühlampen, Halogen, Widerstandsheizungen LED-Lampen, Niederspannungstransformatoren
Haltestrom Ja — Mindeststrom zum Leiten Nein — funktioniert mit jeder Last
LED-Flimmern Typen 1 und 2 bei billigen Lampen Keins — Trailing Edge ist LED-kompatibel
Dimmbereich mit LED 20–95 % (instabil darunter) 5–95 %

Der MOSFET AC-Dimmer beseitigt Typen 1 und 2 auf Hardware-Ebene:

  • Trailing Edge öffnet die Last zu Beginn jedes Halbzyklus: der LED-Treiber bekommt sofort die volle Spannung und lädt seine Pufferkondensatoren — keine 100/120-Hz-Pulsation.
  • Kein Haltestrom: stabiler Betrieb auch mit Lasten so klein wie 5 W.

Typ 3 (ESP32-Timing) gilt gleichermaßen für beide Dimmertypen — er hängt nicht mit der Schaltmethode zusammen, sondern nur mit der MCU-Interrupt- Genauigkeit.



Grundursachen

Detailed theory of zero-cross detection and TRIAC operation: AC Dimmer: Zero-Cross and TRIAC — How It Works.


Typ 1: LED-Treiber-Flimmern (TRIAC-spezifisch)

Der TRIAC schneidet die AC-Sinuswelle vom Leading Edge: In jedem Halbzyklus wird der erste Teil abgeschnitten, Strom fließt nur im zweiten Teil. Bei geringer Helligkeit — nur ein kurzer Stromimpuls am Ende jedes Halbzyklus.

Ein Qualitäts-LED-Treiber glättet diese Impulse durch Kondensatoren und betreibt sein eigenes Hochfrequenz-PWM (1–4 kHz). Ergebnis: gleichmäßiges, stabiles Licht.

Ein billiger LED-Treiber richtet den Strom ohne Pufferung gleich. Die LED empfängt pulsierenden Gleichstrom mit 100 Hz (50-Hz-Netz) oder 120 Hz (60-Hz-Netz). Diese Frequenz ist für das menschliche Auge sichtbar — das Flimmern ist deutlich.

Ein MOSFET AC-Dimmer (Trailing Edge) öffnet die Last zu Beginn jedes Halbzyklus: der LED-Treiber bekommt sofort die volle Spannung und lädt seine Kondensatoren. Die 100-Hz-Pulsation verschwindet — selbst bei einer billigen Lampe.


Typ 2: TRIAC-Haltestrom (TRIAC-spezifisch)

Jeder TRIAC hat einen Haltestrom-Parameter — den Mindeststrom, der nötig ist, um leitend zu bleiben. Fällt der Laststrom unter diesen Wert, schaltet sich der TRIAC zufällig ab — vor dem Nulldurchgang. Ergebnis: fehlende Halbzyklen, zufällige Blitze und Brummen bei geringer Helligkeit.

MOSFET hat keinen Haltestrom — es ist ein Transistor, kein Thyristor. Stabiler Betrieb auch mit Lasten so klein wie 5 W.


Typ 3: ESP32-Timing-Störung (dimmerunabhängig)

TRIAC-Steuerung erfordert ±50-µs-Genauigkeit: Das MCU muss den TRIAC exakt nach der berechneten Verzögerung nach dem Nulldurchgang zünden. Der ESP32-WiFi-Stack und RTOS-Tasks können die ISR-Ausführung um 200–500 µs verzögern — Flimmern erscheint unter aktivem WiFi.

Verzögerungsquellen:

  • WiFi-/BLE-Stack blockiert vorübergehend Interrupts während der Paketverarbeitung
  • Flash-Speicher-Zugriff (OTA, SPIFFS, Serial) — Einfrieren für 10–100 ms
  • ISR nicht in IRAM: ESP32 liest sie bei jedem Aufruf aus dem Flash — fügt Verzögerung hinzu
  • loop() und WiFi auf demselben Kern (Core 1) konkurrieren um CPU

Wesentlicher Unterschied zu Typen 1 und 2: Das Flimmern ist unregelmäßig, verschwindet bei WiFi.disconnect() und ändert sich bei Code-Modifikation — nicht beim Lampenwechsel.

Detailed breakdown: How to Fix ESP32 AC Dimmer Flickering.



Lösungen



🔑 Beste Lösung: MOSFET AC-Dimmer

Beseitigt Typen 1 und 2 auf Hardware-Ebene — kein Lampenwechsel, kein Code-Tuning erforderlich.

Der MOSFET AC-Dimmer (Trailing Edge) ist speziell für LED-Lampen entwickelt. Trailing-Edge-Schaltung gibt dem LED-Treiber einen sauberen Start in jeden Halbzyklus — 100/120-Hz-Pulsation verschwindet. Kein Haltestrom — stabiler Betrieb mit einer einzelnen 5–7-W-Lampe.

Wann MOSFET AC-Dimmer wählen:

  • ☐ LED-Lampen jeder Marke (auch billige No-Name-Produkte)
  • ☐ Kleine Lasten — einzelne Lampe 5–20 W
  • ☐ Breiter Dimmbereich nötig (5–95 %)
  • ☐ Flimmern ohne Lampenwechsel beseitigen wollen
  • Typ 3 (ESP32-Timing) gilt auch für MOSFET-Dimmer — ISR-Genauigkeit ist genauso wichtig. Verwenden Sie rbdimmerESP32 oder DimmerLink zur Lösung.



    🟢 Einsteiger: TRIAC + Qualitätslampe oder DimmerLink

    Verwenden Sie einen TRIAC-Dimmer? Zwei Optionen: Lampe wechseln oder DimmerLink verwenden.

    Option 1: Lampe ersetzen durch ein Modell mit Qualitäts-LED-Treiber:

    1. Philips WarmGlow, SceneSwitch, Master LED
    2. Osram CLASSIC A, SUPERSTAR
    3. Ikea TRÅDFRI (dimmbarer Bereich)

    Achten Sie auf der Verpackung auf: „TRIAC dimmable", „phase-cut compatible", „leading edge compatible".

    Option 2: Mindestlast.

    Mindestens 15–20 W. Bei kleineren Lasten einen Ballastwiderstand parallel schalten: 100–150 Ω / 20 W.

    Option 3: I2C-Steuerung ohne ISR — DimmerLink.

    If you use Raspberry Pi, ESP32-S2/C3/H2, or simply don't want to deal with interrupts — Jeder ESP32 controls TRIAC via I2C without writing any ISR code.

    Wann DimmerLink wählen:

  • ☐ Raspberry Pi / Einplatinen-Computer (kein Echtzeit-OS für ISR)
  • ☐ Einzelkern-ESP32 (S2, C3, H2) — Software-Bibliotheken nicht unterstützt
  • ☐ WiFi kollidiert mit Interrupts auf ESP32
  • ☐ Stabilität ohne Timing-Debugging benötigt
  • cpp
    // DimmerLink via I2C — kein ISR, kein Nulldurchgang im Code
    // Funktioniert mit: Arduino, ESP32, Raspberry Pi
    // Dokumentation: https://www.rbdimmer.com/docs/dimmerlink-I2CCommunication
    #include <Wire.h>
    #define DIMMER_ADDR 0x50
    #define REG_LEVEL   0x10
    // Helligkeit setzen (20–95 % für LED-Lampen mit 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 % Helligkeit
    }
    void loop() {}

    Ergebnis: stabile Helligkeit ohne Flimmern, sofern Sie eine Qualitätslampe verwenden.



    🔵 Fortgeschritten: ESP32-Timing korrigieren (Typ 3)

    Typ 3 gilt für jeden AC-Dimmer — TRIAC oder MOSFET.

    Bestimmen Sie zuerst den Flimmertyp — sonst hilft die Lösung nicht:

    Symptom Typ Lösung
    Gleiches Flimmern bei beliebigem Code Typ 1 — LED-Treiber MOSFET AC-Dimmer oder Lampe wechseln
    Zufällige Blitze, Brummen unter 20 % Typ 2 — TRIAC-Haltestrom MOSFET AC-Dimmer oder min. 20 %
    Ändert sich mit WiFi ein/aus Typ 3 — ESP32-Timing IRAM_ATTR / rbdimmerESP32


    ESP32-Timing korrigieren (Typ 3)

    Wenn das Flimmern bei WiFi.disconnect() verschwindet — das Problem ist das ISR-Timing.

    cpp
    // Problem: ISR nicht in IRAM — ESP32 liest sie bei jedem Aufruf aus Flash
    // Lösung: IRAM_ATTR platziert ISR dauerhaft im RAM
    // ❌ Falsch (ohne IRAM_ATTR — Flimmern unter WiFi-Last):
    void zeroCrossISR() {
        triggerTriac();
    }
    // ✅ Richtig (IRAM_ATTR — ISR immer im RAM, ohne Flash-Verzögerungen):
    void IRAM_ATTR zeroCrossISR() {
        triggerTriac();
    }

    For ESP32 Dual-Core, IRAM_ATTR is applied automatically inside the library.

    Kerntrennung verbessert die Stabilität zusätzlich:

    cpp
    // rbdimmerESP32: ISR läuft auf Core 0 (System-Kern)
    // loop() und WiFi laufen auf Core 1 — keine CPU-Konkurrenz
    #include "rbdimmerESP32.h"
    // ... restlicher Code unverändert

    Grundregel für LED-Lampen: Helligkeit niemals unter 20 % setzen. Die meisten LED-Lampen verhalten sich im Bereich 0–15 % instabil.


    Option A: ESP32 mit rbdimmerESP32 ✅ Empfohlen

    When: dual-core ESP32 only (not S2/C3/H2) Library: rbdimmerESP32 — docs · GitHub

    cpp
    // Plattform: Dual-Core-ESP32
    // Bibliothek: rbdimmerESP32
    // Bereich: 20–95 % für stabiles LED-Dimmen mit TRIAC
    #include "rbdimmerESP32.h"
    #define ZC_PIN  18   // Nulldurchgang-Eingang
    #define DIM_PIN 19   // TRIAC-Gate-Steuerung
    rbdimmer dimmer;
    // Helligkeitsbereich für LED-Lampen begrenzen
    void setLedLevel(uint8_t percent) {
        // 0–100 % → 20–95 % für LED-Stabilität mit TRIAC umrechnen
        uint8_t mapped = 20 + (percent * 75) / 100;
        if (mapped > 95) mapped = 95;
        dimmer.setPower(mapped);
    }
    void setup() {
        dimmer.begin(ZC_PIN, DIM_PIN, 50);  // 50-Hz-Netz
        setLedLevel(50);
    }
    void loop() {}

    Häufige Fehler:

    • rbdimmerESP32 auf Einzelkern-ESP32 (S2/C3/H2) verwenden — nicht unterstützt
    • Helligkeit = 0 setzen statt off aufzurufen: TRIAC ist bei sehr kleinen Zündwinkeln instabil. Verwenden Sie setPower(0) nur zum vollständigen Ausschalten.


    Option B: Arduino AVR (Uno, Mega, Nano)

    When: AVR boards only — do not use on ESP32! Library: Arduino Uno/Mega (legacy)

    cpp
    // Plattform: Arduino Uno / Mega / Nano (nur AVR)
    // WARNUNG: Für ESP32 rbdimmerESP32 verwenden!
    // Nulldurchgang: nur Pins 2 oder 3 auf Uno/Nano
    #include <RBDdimmer.h>
    #define ZC_PIN  2   // Nulldurchgang — nur Pins 2 oder 3
    #define DIM_PIN 11  // PWM-fähiger Pin
    dimmerLamp dimmer(DIM_PIN, ZC_PIN);
    void setup() {
        dimmer.begin(NORMAL_MODE, ON);
        dimmer.setPower(20);  // Minimum 20 % für LED-Lampen
    }
    void loop() {}


    ⚠️ Häufige Fehler aus den Foren

    Echte Fehler aus 3 Forum-Threads (2019–2025).

    • „Verschiedene Codes probiert — Flimmern geht nicht weg": Der Code ist bei Typen 1 und 2 nicht das Problem. Sie müssen den Dimmer (MOSFET AC-Dimmer) oder die Lampe (Philips/Osram) wechseln.

    • „Unter 30 % Helligkeit zufällige helle Blitze": TRIAC-Haltestrom (Typ 2). Lösung: MOSFET AC-Dimmer, oder Helligkeit über 20 % halten, oder mehr Last hinzufügen.

    • „Bei 100 % einwandfrei, flimmert nur beim Dimmen": Klassisches Zeichen eines billigen LED-Treibers (Typ 1). Bei voller Leistung wird die Sinuswelle nicht geschnitten. MOSFET AC-Dimmer oder Lampenwechsel behebt dies.

    • delay() in loop() hinzugefügt — etwas besser": Illusion. Zufällige Synchronisation mit der Netzfrequenz. Bei anderen Helligkeits- einstellungen wird wieder geflimmert.

    • „ESP32 flimmert nur bei aktivem WiFi": Typ 3 — ISR-Timing-Störung. Lösung: rbdimmerESP32 (IRAM_ATTR automatisch angewendet) oder DimmerLink (Hardware-Isolation der Dimmersteuerung).




    Schnell-Checkliste

    Vor dem Posten im Forum prüfen:

  • ☐ Haben Sie einen MOSFET AC-Dimmer als Hardware-Lösung in Betracht gezogen?
  • ☐ Ist die Lampe mit „dimmable" gekennzeichnet und von einer Qualitätsmarke (Philips, Osram)?
  • ☐ Ist die Gesamtlast über 15 W (oder Ballastwiderstand angeschlossen)?
  • ☐ Ist die Mindesthelligkeit im Code auf 20 % oder mehr eingestellt?
  • ☐ Verwenden Sie rbdimmerESP32 für ESP32 (nicht das veraltete RBDdimmer)?
  • ☐ Haben Sie getestet, ob das Flimmern mit einfachem Lampenwechsel (ohne Code-Änderung) verschwindet?
  • ☐ ESP32 + WiFi: verschwindet das Flimmern bei `WiFi.disconnect()`?
  • → Typ 3 — IRAM_ATTR oder rbdimmerESP32 verwenden



    Kompatibilitätstabelle

    Lampe TRIAC (Leading Edge) MOSFET (Trailing Edge) Hinweise
    Philips WarmGlow / Master LED ✅ 10–95 % ✅ 5–95 % Empfohlen
    Osram SUPERSTAR ✅ 15–95 % ✅ 5–95 % Empfohlen
    Ikea TRÅDFRI dimmable ✅ 10–95 % ✅ 5–95 % Empfohlen
    Billige „dimmable" No-Name ⚠️ Flimmert < 40 % ✅ 5–95 % MOSFET behebt es
    Glühlampe ✅ 10–95 % ✅ 5–95 % Ideale Widerstandslast
    Beliebige „non-dimmable" LED ❌ Dauerhaftes Flimmern ❌ Möglich Lampe ersetzen



    Verwandte Themen



    Noch Fragen?

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

    Diesen Beitrag teilen
    Anmelden , um einen Kommentar zu hinterlassen