Zum Inhalt springen

← Hardware-Anschluss | Inhaltsverzeichnis | Weiter: Arduino-Leitfaden und Beispiele →

Universelle Bibliothek für ESP32



Übersicht der Bibliothek

Die AC-Dimmer-Bibliothek ist eine effiziente Lösung zur Helligkeitssteuerung von Wechselstromgeräten (AC) mithilfe eines Mikrocontrollers der ESP32-Familie. Die Bibliothek nutzt die Hardware-Fähigkeiten des ESP32 – GPIO-Interrupt-Verarbeitung und hochpräzise Timer – um den TRIAC-Zündzeitpunkt in jeder Halbwelle des Wechselstroms präzise zu steuern.



Funktionen und Vorteile

  • Kompatibel mit den Frameworks Arduino, ESP-IDF und ESPHome
  • Kompatibel mit Mehrphasensystemen
  • Unterstützung mehrerer unabhängiger Dimmkanäle
  • Minimale Prozessorressourcennutzung dank Hardware-Interrupts und ESP-Timern
  • Hochpräzise Helligkeitssteuerung für AC-Geräte
  • Verschiedene Helligkeitsregelkurven (linear, RMS, logarithmisch)
  • Automatische Erkennung der Netzfrequenz (50/60 Hz und andere)
  • Sanfte Übergänge zwischen Helligkeitsstufen
  • Unterstützung von Callback-Funktionen zur Synchronisation mit anderen Ereignissen



Anforderungen


Mikrocontroller der ESP32-Familie

Kompatibel mit Arduino ESP32 Core (Version 2.0.0 oder höher):

  • ESP32
  • ESP32-C3
  • ESP32-C6
  • ESP32-H2
  • ESP32-P4
  • ESP32-S2
  • ESP32-S3

Kompatibel mit ESP-IDF (5.0 oder höher):

  • ESP32
  • ESP32-S2
  • ESP32-C3
  • ESP32-S3
  • ESP32-C2
  • ESP32-C6
  • ESP32-H2
  • ESP32-P4

Kompatibel mit ESPHome:

  • ESP32
  • ESP32-S2
  • ESP32-S3
  • ESP32-C3
  • ESP32-H2



Frameworks: Leitfäden und Beispiele


Verfügbare Dokumentation

  • Arduino-Leitfaden & Beispiele
  • ESP-IDF-Leitfaden & Beispiele
  • ESPHome-Leitfaden & Beispiele



Funktionale Spezifikationen


Auswahl der Helligkeitskurve (Dimmkurve)

Die Bibliothek unterstützt drei Kurventypen für die Helligkeitsregelung:

Linear (AC_DIMMER_CURVE_LINEAR)

  • Gleichmäßige Änderung des Verzögerungswinkels
  • Geeignet für einfache Anwendungen
  • Die wahrgenommene Helligkeit ist nicht linear

RMS (AC_DIMMER_CURVE_RMS)

  • Kompensiert die RMS-Charakteristik eines sinusförmigen Signals
  • Bietet lineare Leistungsänderung
  • Ideal für Glühlampen und resistive Lasten

Logarithmisch (AC_DIMMER_CURVE_LOGARITHMIC)

  • Kompensiert die logarithmische Helligkeitswahrnehmung des menschlichen Auges
  • Bietet visuell lineare Helligkeitsänderung
  • Empfohlen für LED-Beleuchtung


Sanfte Übergänge

Für sanfte Übergänge zwischen Helligkeitsstufen die Funktion ac_dimmer_set_brightness_transition() verwenden:

Tip
Die Funktion erzeugt einen sanften Übergang, indem sie ihn in mehrere kleine Schritte unterteilt. Die Funktion verwendet einen FreeRTOS-Task; während des Übergangs wird der Hauptcode weiter ausgeführt.


Mehrkanalsysteme

Die Bibliothek unterstützt mehrere unabhängige Dimmkanäle. Die Anzahl der Kanäle ist in den Bibliothekseinstellungen in der Datei ac_dimmer.h begrenzt. Jeder Dimmkanal muss einen separaten Ausgangspin haben.


Verwendung von Interrupt-Callback-Funktionen

Callback-Funktionen ermöglichen die Synchronisation des Codes mit Nulldurchgangsereignissen. Dies ist nützlich für Aufgaben, die eine präzise Synchronisation mit dem AC-Netz erfordern.

Warning
Minimalen Code in der Callback-Funktion verwenden. Es wird empfohlen, FreeRTOS-Task-Aufrufe zu verwenden.



Optimierung und Debugging


Optimale Ressourcennutzung

esp-timer-Einschränkungen:

  • Die Bibliothek verwendet esp_timer, der das Erstellen mehrerer Software-Timer ermöglicht
  • Für jeden Kanal werden 2 Timer verwendet: einer für die Verzögerung und einer für die Impulsbreite

Interrupt-Optimierung:

  • Interrupt-Handler werden so kurz wie möglich gehalten, um die Last zu reduzieren
  • Das Attribut IRAM_ATTR wird verwendet, um den Handler-Code im IRAM zu platzieren
  • Komplexe Berechnungen werden außerhalb von Interrupt-Handlern durchgeführt
Warning
Wichtig: Keinen aufwändigen Code in der Nulldurchgang-Interrupt-Callback-Funktion verwenden. Es wird empfohlen, FreeRTOS-Task-Aufrufe zu verwenden.

Leistung:

  • Vorberechnete Tabellen für Helligkeitskurven reduzieren die Rechenzeit
  • Parameter-Caching reduziert wiederholte Berechnungen

Protokollierung:

Die Bibliothek verfügt über ein erweitertes Protokollierungssystem. Für das Projekt-Debugging die Protokollierung von Bibliotheksfunktionsoperationen an den seriellen Port aktivieren.



Lösung häufiger Probleme


Die Lampe flimmert oder die Helligkeit ist instabil

Dies kann bei Dimmstufen von 0–8 auftreten.

Ursachen und Lösungen:

  • Falsche AC-Neutral- und Phasenverbindung: Die AC-Stromquellenverbindung prüfen. Neutral zu N, Phase zu AC-L IN
  • Probleme mit dem Nulldurchgang-Detektor: Signalwellenform und Auslöseschwelle prüfen
  • ESP32-Mikrocontroller-Architektur und Arduino Core: Suboptimale Kompatibilität und Prioritäten des ISR-Moduls und Timer-Moduls auf Arduino-Core-Ebene
  • Hohe CPU-Last: Anzahl der Berechnungen in der Hauptschleife reduzieren
  • Interrupt-Konflikte: Sicherstellen, dass andere Bibliotheken keine Konflikte mit Interrupts verursachen


Falsche Helligkeit für bestimmte Lasttypen

Ursachen: Bei 50 % Helligkeit erscheint die Lampe zu hell oder zu dunkel

Lösung: Den Helligkeitskurventyp für Ihre Last ändern


Nulldurchgang-Detektor funktioniert nicht

Der Dimmer reagiert nicht auf Einstellungen:

  • Nulldurchgang-Pin-Verbindung prüfen
  • Sicherstellen, dass das Signal den ESP32 erreicht
  • Die Funktion ac_dimmer_get_frequency() prüfen – wenn sie 0 zurückgibt, ist die Netzfrequenz nicht erkannt



Technische Informationen


Betriebsprinzipien des AC-Dimmers

Die Leistungssteuerung in AC-Kreisen basiert auf dem Prinzip der Phasenregelung mithilfe eines TRIAC (Thyristors).

Info
Weitere Details finden Sie im Artikel über den TRIAC-Betrieb.


ESP-Timer-Eigenschaften im ESP32

Die Bibliothek verwendet esp_timer für präzise Verzögerungssteuerung:

Vorteile von esp-timer:

  • Mikrosekundenauflösung
  • Software-Implementierung ermöglicht das Erstellen zahlreicher Timer
  • Geringer Overhead

esp-timer-Architektur:

  • Ein Hardware-Timer für alle Software-Timer
  • Timer-Warteschlange, geordnet nach Auslösezeit
  • Callback-Funktionen werden im Kontext des Timer-Tasks aufgerufen

Einschränkungen:

  • Kleines Jitter (±10–50 µs) bei hoher Systemlast
  • Callback-Funktion sollte die Ausführung nicht lange blockieren


Interrupt-Behandlung

Nulldurchgang-Interrupts:

  • Werden im Moment des Nulldurchgangs erzeugt
  • Interrupt-Typ GPIO_INTR_POSEDGE wird verwendet (nur steigende Flanke)
  • Der Handler startet Timer für alle aktiven Kanäle der jeweiligen Phase

Timer:

  • Der erste Timer wird für die Verzögerungszeit gestartet und aktiviert den Ausgang
  • Der zweite Timer wird zur Bestimmung der Impulsbreite gestartet

Methoden zur Stabilitätsverbesserung:

  • Interrupt-Handler werden so kurz wie möglich gehalten und im IRAM platziert
  • Kritische Abschnitte schützen gemeinsam genutzte Daten
  • Minimale Berechnungen in Interrupt-Handlern

← Hardware-Anschluss | Inhaltsverzeichnis | Weiter: Arduino-Leitfaden und Beispiele →