Hallo zusammen,
bevor ich zu meiner Frage komme, möchte ich mich kurz vorstellen.
Ich bin Thomas, 36 Jahre alt, von Beruf Maschinenbauingenieur und habe seit dem Teenageralter immer mal wieder Spaß am Programmieren gefunden. Bin zwar nie so richtig tief in eine bestimmte Programmiersprache eingestiegen, aber dafür kann ich von vielen Programmiersprachen zumindest die Basics Vor circa einem Jahr habe ich den Arduino für mich entdeckt und bin von den Möglichkeiten schlichtweg begeistert. Aktuell bastel ich mein zweites Smarthome Projekt mit dem ESP8266 (mit der praktischen WLAN Anbindung).
Ich möchte zur Beleuchtungssteuerung in der Werkstatt einige Relays schalten. Ich möchte Sie gerne per Smartphone über ein Webinterface steuern und habe mich an einen relativ einfachen Code (gefunden auf Youtube Youtube LINK ) angelehnt.
Hier mal der Code Ausschnitt:
WiFiClient client = server.available(); // Wartet auf eingehende Clients
if (client) { // Wenn ein Client sich verbindet....
String currentLine = ""; // Einen String erstellen um ankommende Daten festzuhalten
currentTime = millis(); // Timer für timeout
previousTime = currentTime;
while (client.connected() && currentTime - previousTime <= timeoutTime) { // loop while the client's connected
currentTime = millis();
if (client.available()) { // Wenn es etwas vom Client zu lesen gibt...
char c = client.read(); // lese es aus
header += c;
if (c == '\n') { // if the byte is a newline character
// if the current line is blank, you got two newline characters in a row.
// that's the end of the client HTTP request, so send a response:
if (currentLine.length() == 0) {
// HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
// and a content-type so the client knows what's coming, then a blank line:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();
// turns the GPIOs on and off
if (header.indexOf("GET /5/on") >= 0) {
pin1Status = "on";
digitalWrite(pin1, HIGH);
} else if (header.indexOf("GET /5/off") >= 0) {
pin1Status = "off";
digitalWrite(pin1, LOW);
} else if (header.indexOf("GET /4/on") >= 0) {
pin2Status = "on";
digitalWrite(pin2, HIGH);
} else if (header.indexOf("GET /4/off") >= 0) {
pin2Status = "off";
digitalWrite(pin2, LOW);
} else if (header.indexOf("GET /16/on") >= 0) {
pin0Status = "on";
digitalWrite(pin0, HIGH);
} else if (header.indexOf("GET /16/off") >= 0) {
pin0Status = "off";
digitalWrite(pin0, LOW);
} else if (header.indexOf("GET /0/on") >= 0) {
pin3Status = "on";
digitalWrite(pin3, HIGH);
} else if (header.indexOf("GET /0/off") >= 0) {
pin3Status = "off";
digitalWrite(pin3, LOW);
}
// Display the HTML web page
client.println("<!DOCTYPE html><html>");
client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"icon\" href=\"data:,\">");
client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
client.println(".button { background-color: #195B6A; border: none; color: white; padding: 16px 40px;");
client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
client.println(".button2 {background-color: #77878A;}</style></head>");
client.println("<body><h1>Garage Smart Home</h1>"); //Überschrift Webseite
// Zeige Status und Off/On Button an für Pin1
client.println("<p>Pin 1 is " + pin1Status + "</p>");
// Wenn pin1Status = off, zeige ON Button, sonst OFF Button
if (pin1Status=="off") {
client.println("<p><a href=\"/5/on\"><button class=\"button\">ON</button></a></p>");
} else {
client.println("<p><a href=\"/5/off\"><button class=\"button button2\">OFF</button></a></p>");
}
// Zeige Status und Off/On Button an für Pin2
client.println("<p>Pin 2 is " + pin2Status + "</p>");
// Wenn pin2Status = off, zeige ON Button, sonst OFF Button
if (pin2Status=="off") {
client.println("<p><a href=\"/4/on\"><button class=\"button\">ON</button></a></p>");
} else {
client.println("<p><a href=\"/4/off\"><button class=\"button button2\">OFF</button></a></p>");
}
client.println("<p>Pin 0 is " + pin0Status + "</p>");
if (pin0Status=="off") {
client.println("<p><a href=\"/16/on\"><button class=\"button\">ON</button></a></p>");
} else {
client.println("<p><a href=\"/16/off\"><button class=\"button button2\">OFF</button></a></p>");
}
client.println("<p>Pin 3 is " + pin3Status + "</p>");
if (pin3Status=="off") {
client.println("<p><a href=\"/0/on\"><button class=\"button\">ON</button></a></p>");
} else {
client.println("<p><a href=\"/0/off\"><button class=\"button button2\">OFF</button></a></p>");
}
client.println("</body></html>");
// The HTTP response ends with another blank line
client.println();
// Break out of the while loop
break;
} else { // if you got a newline, then clear currentLine
currentLine = "";
}
} else if (c != '\r') { // if you got anything else but a carriage return character,
currentLine += c; // add it to the end of the currentLine
}
}
}
// Clear the header variable
header = "";
// Close the connection
client.stop();
An den Pins hängen momentan noch LEDs, die stellvertretend für die später eingesetzten Relays stehen. Nun zu meinem Problem: Die Webseite baut sich wunderbar auf und steuern lässt sich darüber auch alles. ABER: ich möchte die Relays aber ebenfalls über Buttons in einer selbst gebauten Steuerbox bedienen können und genau an diesem Punkt komme ich nicht weiter. Der Programmcode wartet immer auf einer Reaktion vom "client" auf der Webseite, bevor er die weiteren Aktionen durchführt.
Jetzt ließen sich zwar separat von der Webseitenaktivität die LEDs/Relays per Button Befehl ansteuern, nur würde sich die Webseite nicht dementsprechen aktualisieren (Schaltflächen springen von OFF auf ON usw.). Gibt es eine Möglichkeit durch einen simplen Knopfdruck eine entsprechende Reaktion des Webclients zu simulieren, um den EIN-AUS Schaltvorgang in Gang zu setzen?
Ich hoffe, ich habe mich verständlich ausgedrückt und freue mich auf eure Rückmeldungen.
Gruß,
Madlock