Ziel ist es zwei Leuchten getrennt voneinander über WLAN zu schalten. Grundsätzlich ist es aber auch möglich andere Verbraucher zu schalten. Ich möchte jedoch schon jetzt darauf hinweisen, dass diese Schaltung nur mit „ohmschen Lasten“ funktioniert. Sollten „INDUKTIVE“ Lasten geschaltet werden, ist eine Snubber erforderlich. Ich habe mich für eine Solid State Relais entschieden mit der Bezeichnung PR36MF2 und habe diese über Reichelt bezogen. Somit entfällt das lästige knacken und Relais. Ein weiterer Vorteil ist die Schaltung im Nulldurchgang, welche im Relais bereits integriert ist. Das Relais schaltet mit den 3,3V Betriebsspannung, somit ist auch keine weitere Spannungsquelle erforderlich. Der Hauptgrund lag jedoch in der Möglichkeit diese Schaltung direkt in der Schalterdose zu integrieren. Dafür war die kleine Abmessung natürlich optimal.
Über den Aufruf der IP-Adresse (192.168.178.240) kann somit von jedem Punkt im Haus das Licht ein und ausgeschaltet werden. Ich habe mich hierbei entschieden eine feste IP-Vergabe durchzuführen.
Den Prototypen habe ich auf Lochrasterplatine aufgebaut mit einer Abmessung 35mmx35mm. Ich habe diesen Prototypen nun seit einer Woche im Testbetrieb und konnte bislang keine Probleme feststellen.
Nun werde ich mir noch Gedanken über ein passenden Netzteil machen und ein Layout erstellen.
Achtung!! Ihr arbeitet mit Netzspannung!!!!
Programmcode für ARUDINO IDE mit ESP8266 Plugin
#include <ESP8266WiFi.h>
const char* ssid = „SSID_WLAN_Bezeichnung“;
const char* password = „WLAN-KEY“;
const IPAddress ipadd(192,168,178,240);
const IPAddress ipgat(192,168,178,1);
const IPAddress ipsub(255,255,255,0);
unsigned long ulReqcount;
unsigned long ulReconncount;
// Create an instance of the server on Port 80
WiFiServer server(80);
void setup()
{
// setup globals
ulReqcount=0;
ulReconncount=0;
// prepare GPIO2
pinMode(2, OUTPUT);
digitalWrite(2, 0);
// prepare GPIO0
pinMode(0, OUTPUT);
digitalWrite(0, 0);
// start serial
Serial.begin(9600);
delay(1);
// inital connect
WiFi.mode(WIFI_STA);
WiFiStart();
}
void WiFiStart()
{
ulReconncount++;
// Connect to WiFi network
Serial.println();
Serial.println();
Serial.print(„Connecting to „);
Serial.println(ssid);
WiFi.config(ipadd, ipgat, ipsub);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(„.“);
}
Serial.println(„“);
Serial.println(„WiFi connected“);
// Start the server
server.begin();
Serial.println(„Server started“);
// Print the IP address
Serial.println(WiFi.localIP());
}
void loop()
{
// check if WLAN is connected
if (WiFi.status() != WL_CONNECTED)
{
WiFiStart();
}
// Check if a client has connected
WiFiClient client = server.available();
if (!client)
{
return;
}
// Wait until the client sends some data
unsigned long ultimeout = millis()+250;
while(!client.available() && (millis()<ultimeout) )
{
delay(1);
}
if(millis()>ultimeout)
{
Serial.println(„client connection time-out!“);
return;
}
// Read the first line of the request
String sRequest = client.readStringUntil(‚\r‘);
//Serial.println(sRequest);
client.flush();
// stop client, if request is empty
if(sRequest==““)
{
Serial.println(„empty request! – stopping client“);
client.stop();
return;
}
String sPath=““,sParam=““, sCmd=““;
String sGetstart=“GET „;
int iStart,iEndSpace,iEndQuest;
iStart = sRequest.indexOf(sGetstart);
if (iStart>=0)
{
iStart+=+sGetstart.length();
iEndSpace = sRequest.indexOf(“ „,iStart);
iEndQuest = sRequest.indexOf(„?“,iStart);
// are there parameters?
if(iEndSpace>0)
{
if(iEndQuest>0)
{
// there are parameters
sPath = sRequest.substring(iStart,iEndQuest);
sParam = sRequest.substring(iEndQuest,iEndSpace);
}
else
{
// NO parameters
sPath = sRequest.substring(iStart,iEndSpace);
}
}
}
///////////////////////////////////////////////////////////////////////////////
// output parameters to serial, you may connect e.g. an Arduino and react on it
///////////////////////////////////////////////////////////////////////////////
if(sParam.length()>0)
{
int iEqu=sParam.indexOf(„=“);
if(iEqu>=0)
{
sCmd = sParam.substring(iEqu+1,sParam.length());
Serial.println(sCmd);
}
}
///////////////////////////
// format the html response
///////////////////////////
String sResponse,sHeader;
////////////////////////////
// 404 for non-matching path
////////////////////////////
if(sPath!=“/“)
{
sResponse=“<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL was not found on this server.</p></body></html>“;
sHeader = „HTTP/1.1 404 Not found\r\n“;
sHeader += „Content-Length: „;
sHeader += sResponse.length();
sHeader += „\r\n“;
sHeader += „Content-Type: text/html\r\n“;
sHeader += „Connection: close\r\n“;
sHeader += „\r\n“;
}
///////////////////////
// format the html page
///////////////////////
else
{
ulReqcount++;
sResponse = „<html><head><title>Haussteuerung</title></head><body>“;
sResponse += „<font color=\“#000000\“><body bgcolor=\“#d0d0f0\“>“;
sResponse += „<meta name=\“viewport\“ content=\“width=device-width, initial-scale=1.0, user-scalable=yes\“>“;
sResponse += „<h1>Haussteuerung</h1>“;
sResponse += „<BR>“;
sResponse += „<BR>“;
sResponse += „<FONT SIZE=+1>“;
sResponse += „<p>Licht 1 <a href=\“?pin=FUNCTION1ON\“><button>einschalten</button></a> <a href=\“?pin=FUNCTION1OFF\“><button>ausschalten</button></a></p>“;
sResponse += „<p>Licht 2 <a href=\“?pin=FUNCTION2ON\“><button>einschalten</button></a> <a href=\“?pin=FUNCTION2OFF\“><button>ausschalten</button></a></p>“;
if (sCmd.length()>0)
{
// write received command to html page
sResponse += „Kommando:“ + sCmd + „<BR>“;
// switch GPIO
if(sCmd.indexOf(„FUNCTION1ON“)>=0)
{
digitalWrite(2, 1);
}
else if(sCmd.indexOf(„FUNCTION1OFF“)>=0)
{
digitalWrite(2, 0);
}
if(sCmd.indexOf(„FUNCTION2ON“)>=0)
{
digitalWrite(0, 1);
}
else if(sCmd.indexOf(„FUNCTION2OFF“)>=0)
{
digitalWrite(0, 0);
}
}
sResponse += „<FONT SIZE=-2>“;
sResponse += „<BR>“;
sResponse += „</body></html>“;
sHeader = „HTTP/1.1 200 OK\r\n“;
sHeader += „Content-Length: „;
sHeader += sResponse.length();
sHeader += „\r\n“;
sHeader += „Content-Type: text/html\r\n“;
sHeader += „Connection: close\r\n“;
sHeader += „\r\n“;
}
// Send the response to the client
client.print(sHeader);
client.print(sResponse);
// and stop the client
client.stop();
}
