Forum: Projekte & Code LED-Steuerung mit WLAN-Server, bistablen Relais und ZeroCrossSwitching


von Uwe H. (uwe_ham)


Angehängte Dateien:

Lesenswert?

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

siehe Schaltplan.pdf

siehe WLAN-Server_LED_Steuerung.ino

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.

siehe fhem.cfg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.