Hallo zusammen,
ich mache gerade meine ersten Gehversuche mit einem ESP8266.
Natürlich bin ich noch sehr unbeholfen, lese viel und versuche andere Codes zu verstehen.
Aktuell arbeite ich mit Sonoff S20 Steckdosen, welche einen ESP8266 verbaut haben.
Die Steckdose ist soweit umprogrammiert und soll später maleingesteckt werden und dann mittels Ping das Vorhandensein einer IP abfragen. Ist der Ping erfolgreich, so soll die Steckdose angeschaltet werden.
Ist sie nicht erreichbar, bleibt das Relais aus.
Das funktioniert soweit auch schon mit folgendem Code:
#include <ESP8266WiFi.h>
#include <ESP8266Ping.h>
const char* ssid = "..."; //Name des bestehenden Wlan Netzwerks
const char* password = "..."; //Passwort des bestehenden Wlan Netzwerks
const IPAddress ThermostatMaster(192, 168, 10, 10); //IP-Adresse des Thermostat Masters
int Relais=12; // Das Wort „Relais“ steht jetzt für Pin „12“ GPIO12. Daran sind das Relais und die blaue LED parallel angeschlossen.
int PowerLED=13; // Das Wort „PowerLED“ steht jetzt für Pin „13“ GPIO13. Daran ist die grüne LED angeschlossen.
void setup() {
Serial.begin(115200);
delay(10);
// Start der WLan Verbindung
Serial.println();
Serial.println("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
pinMode(Relais, OUTPUT); // Pin 12 (Pin „Relais“) ist ein Ausgang.
pinMode(PowerLED, OUTPUT); // Pin 13 (Pin „PowerLED“) ist ein Ausgang.
}
Serial.println();
Serial.print("WiFi connected with ip ");
Serial.println(WiFi.localIP());
Serial.print("Pinging ip ");
Serial.println(ThermostatMaster);
}
void loop() {
//Ist-Dann Schleife
if(Ping.ping(ThermostatMaster))
{
digitalWrite(Relais, HIGH); // Schalte das Relais und die blaue LED an.
digitalWrite(PowerLED, HIGH); // Schalte die Grüne LED aus.
delay(10000);
}
else
{
digitalWrite(Relais, LOW); // Schalte das Relais und die blaue LED aus.
digitalWrite(PowerLED, LOW); // Schalte die Grüne LED an.
delay(10000);
}
}
Aktuell steht das delay testweise noch auf 10 Sekunden.
Später mal, wenn der Test erfolgreich ist, wird der auf 5 Minuten hochgesetzt, damit ich bei 3 Steckdosen nicht mein Netz nur durch Pings verseuche.
Das würde ja so wie oben alles schon funktionieren.
Genial wäre jetzt, wenn ich, da die Steckdose ja schon im Wlan ist, die IP eingeben könnte und die Steckdose öffnet dann eine ganz einfache Webseite auf der steht "Die Steckdose ist angeschaltet" oder "Die Steckdose ist ausgeschaltet"
Das jetzt vereinfacht beschrieben.
Mein bisheriges Problem ist der delay und die Abfrage meiner Meinung nach.
Durch das delay bremse ich doch den 8266 ein und er ist nicht empfänglich für Webseitenzugriffe oder sehe ich das falsch?
Versucht habe ich mich da mit folgendem Code den ich so abgewandelt habe.
#include <ESP8266WiFi.h>
#include <ESP8266Ping.h>
#include <ESP8266WebServer.h>
ESP8266WebServer Webserver(80);
const char* ssid = "..."; //Name des bestehenden Wlan Netzwerks
const char* password = "..."; //Passwort des bestehenden Wlan Netzwerks
const IPAddress ThermostatMaster(192, 168, 10, 10); //IP-Adresse des Thermostat Masters
int Relais=12; // Das Wort „Relais“ steht jetzt für Pin „12“ GPIO12. Daran sind das Relais und die blaue LED parallel angeschlossen.
int PowerLED=13; // Das Wort „PowerLED“ steht jetzt für Pin „13“ GPIO13. Daran ist die grüne LED angeschlossen.
void setup() {
Serial.begin(115200);
delay(10);
// Start der WLan Verbindung
Serial.println();
Serial.println("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
pinMode(Relais, OUTPUT); // Pin 12 (Pin „Relais“) ist ein Ausgang.
pinMode(PowerLED, OUTPUT); // Pin 13 (Pin „PowerLED“) ist ein Ausgang.
}
Serial.println();
Serial.print("WiFi connected with ip ");
Serial.println(WiFi.localIP());
Serial.print("Pinging ip ");
Serial.println(ThermostatMaster);
Webserver.begin(); //Starten des Webservers
}
void loop() {
Webserver.handleClient();
//Ist-Dann Schleife
if(Ping.ping(ThermostatMaster))
{
digitalWrite(Relais, HIGH); // Schalte das Relais und die blaue LED an.
digitalWrite(PowerLED, HIGH); // Schalte die Grüne LED aus.
Webserver.on("/", handleRoot_an);
delay(10000);
}
else
{
digitalWrite(Relais, LOW); // Schalte das Relais und die blaue LED aus.
digitalWrite(PowerLED, LOW); // Schalte die Grüne LED an.
Webserver.on("/", handleRoot_aus);
delay(10000);
}
}
void handleRoot_an()
{
Webserver.send(200, "text/html", "<html> <h2>Thermostat Status</h2><h3><b>an</b></h3> </html>"); //hier HTML Code einfügen
}
void handleRoot_aus()
{
Webserver.send(200, "text/html", "<html> <h2>Thermostat Status</h2><h3><b>aus</b></h3> </html>"); //hier HTML Code einfügen
}
Meine Frage an Euch ist jetzt ob das überhaupt geht wie ich mir das vorstelle und wenn es gehen kann, würde ich mich über Hilfe freuen.