LED-Steuerung mit WLAN-Server, bistablen Relais und ZeroCrossSwitching

Begonnen von murphy56, 21 August 2017, 17:45:36

Vorheriges Thema - Nächstes Thema

murphy56

LED-Steuerung mit WLAN-Server, bistablen Relais und ZeroCrossSwitching zur Reduzierung des Einschaltstroms

Ziel:

Eine LED-Steuerung für den Garten, die möglichst stromsparend ist.

Randbedingungen:
1. Die Standorte waren mit Funk-Steckdosen und WLAN-Steckdosen nicht sicher erreichbar.
2. Nur 12VDC LED-Lampen -> Keine 230VAC im Garten
3. Eingliederung der Steuerung in eine vorhandene Hausautomatisierung zur automatischen Ein- und Ausschaltung der LEDs abhängig von Jahreszeit und Wochentag.

Lösung:
ESP8266 NodeMcu V3 (sehr gute WLAN Verbindung)
Programmierung mit Arduino Sketch
Nutzung des DeepSleepModus
Einbindung in das Hausautomatisierungssystem FHEM

Schaltplan.pdf

Programm.zip

Hardwarebeschreibung:
Genutzt wurde ein ESP8266 NodeMcu V3, der über eine I2C-Schnittstelle einen ,,PCF8574 Remote 8-Bit I/O Expander for I2C Bus" ansteuert und damit genügend Ausgänge hat, um die Relais anzusteuern. Die PCF8574-Ausgänge werden über ein Widerstandsnetzwerk mit je 10 kOhm als PullUp auf ein Treiber-IC ULN2803A geschaltet. Dieses IC steuert die Relais an. Die Relais benötigen jeweils einen kurzen Impuls, um den Kontakt zu schließen oder ihn zu öffnen. Ein Haltestrom wird so vermieden.

Zur Reduzierung des Einschaltstroms wird eine ZeroCrossSwitching-Schaltung genutzt. Dazu wird 230VAC mit Vorwiderständen auf einen Optokoppler geleitet. Der Ausgang erzeugt in dem  ESP8266 einen Interrupt. Dieser wird mit einer Zeitverzögerung in der CPU so genutzt, dass die Relais etwa im Nulldurchgang der 230VAC schalten.

Um den Status der Schaltung abzufragen, werden die 12VDC Ausgänge über einen Vorwiderstand und eine 3,3V-Zenerdiode auf die Digitaleingänge des  ESP8266 gelegt.

Der Widerstand zwischen Reset (RST) und D0 ist für ein DeepSleep erforderlich.

Softwarebeschreibung ESP8266:
Die Software teilt sich, wie bei Arduino üblich, in die beiden Hauptprogramme setup (läuft nur nach Neustart) und loop (läuft ständig).

Im setup wird nach einer Einschaltphase (5 Sekunden -> delay(5000)) der I2C-Bus initialisiert und die Ausgänge des  PCF8574 werden auf 0 gesetzt.

Dann werden über die Unterprogramme r1_off bis r3_off die Relais ausgeschaltet.

Mit dem Befehl wifiMulti.addAP("WLAN-Router","WLAN-Passwort") lassen sich mehrere WLAN-Router festlegen.
Wenn eine Verbindung abgebaut werden konnte, wird der Sever gestartet und eine Info an die serielle Schnittstelle abgesetzt.

Mit dem Befehl pinMode erfolgt die Definition der Eingänge und der Ausgang für die LED auf der CPU-Platine.

Über den Befehl digitalRead wird der Status der 12VDC-Ausgänge abgefragt.

Im Programmteil loop erfolgt zunächst die Prüfung, ob noch einen WLAN-Verbindung existiert. Ggf. wird versucht sie neu aufzubauen. In dieser Zeit blinkt die LED auf der CPU-Platine mit 0,5 Herz.

Der Befehl ,,server.on("/schalten/", handleSchalten)" aktiviert die Routine handleSchalten, wenn ,,/schalten/" in der Befehlszeile enthalten ist. Diese Routine transportiert den Befehl (z.B. r1_on) in die Variable sBefehl, die im weiteren Loop-Verlauf ausgewertet wird. Außerdem gibt sie den Status zurück an den Web-Browser.

Der Befehl server.handleClient() startet nun den Client.

Die folgenden Befehlszeilen interpretieren die Befehle, die über einen Web-Browser erfolgen können:

DeepSleep30Sek: Der ESP8266 legt sich für 30 Sekunden schlafen und wacht danach durch einen Reset wieder auf (wird nur für Testzwecke genutzt)

DeepSleep55Min: Der ESP8266 legt sich für 55 Minuten schlafen und wacht danach durch einen Reset wieder auf.

r1_on: Es wird die Freigabe erteilt, dass das Relais1 eingeschaltet werden kann. Kommt es nun zu einem Interrupt am Eingang interruptPin D5 (Nulldurchgang des Sinus der 230VAC) wird nach einer definieren Zeit (nächster Nulldurchgang plus Verzögerung durch I2C und Relais) das Relais für 0,5 Sekunden aktiviert und der Schalter damit geschlossen. Die in meinem Aufbau gemessene Zeit beträgt 1500 Microsekunden. Hier muss der Befehl ,,delayMicroseconds" statt ,,delay" genutzt werden, da sonst die Interrupt-Routine nicht läuft.

r2_on und r3_on: Wie r1_on

r1_off: Bei diesem Befehl ist eine Interrupt-Steuerung nicht erforderlich. Der für den Aus-Befehl zuständige Ausgang wird einfach für 0,5 Sekunden aktiviert.

r2_off und r3_off: Wie r1_off

Danach werden die Rückmeldungen der 12VDC-Spannungen ausgelesen und daraus die Variablen bStatus1 bis bStatus3 gefüllt.

Zur Lebensüberwachung erfolgt am Ende der  loop-Schleife eine Blinkfolge für die LED auf der CPU-Platine. Sie unterscheidet sich von der Blinkfolge bei der Suche nach einer WLAN-Verbindung.

Softwarebeschreibung FHEM:
Das FHEM läuft bei mir auf einem Raspberry Pi und dient der Hausautomatisierung. Es ist so aufgebaut, dass viele verschiedene Sensoren und Aktoren (verschiedene Hersteller und Protokolle) dort eingebunden werden können. Auch Internetserver wie der ESP8266 lassen sich dort einbinden.
FHEM holt sich aus dem Internet die Sonnenauf- und –untergangszeiten. Dadurch kann die LED- Steuerung abhängig von der Jahreszeit automatisch eingeschaltet werden. Es wird eine Variable gesetzt, die ca. 1 Stunde von Sonnenuntergang das Einschalten der LEDs ermöglicht. Das Ausschalten erfolgt freitags und samstags fest um 00:42 Uhr und an den restlichen Wochentagen um 22:45 Uhr. Automatisch eingeschaltet wird bei Sonnenuntergang.

Durch den DeepSleep-Modus des ESP8266 soll der Stromverbrauch möglichst niedrig gehalten werden. Da sich der DeepSleep-Modus nur auf max. 71 Minuten schalten lässt, wird dieser von FHEM alle 60 Minuten für 55 Minuten aktiviert. Nach 55 Minuten wacht der ESP8266 auf und meldet sich beim WLAN-Router an. FHEM fragt dann den Status ab. Ist die LED-Variable gesetzt, bleibt der ESP8266 wacht und wartet auf einen manuellen oder automatischen Ein- oder Ausschaltbefehl.