ESP Webserver auch mit Buttons ansteuern

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 :slight_smile: 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 :smiley: und freue mich auf eure Rückmeldungen.

Gruß,
Madlock

Setze deinen Sketch bitte in Code-Tags, verwende dazu die Schaltfläche </> oben links im Editorfenster oder [ code] vor dem Sketch und [ /code] hinter dem Sketch, aber ohne die Leerzeichen. Dann ist dein Sketch auch richtig lesbar.

Für dein Problem schau dir mal die Webseite von fips an.

Ab // Display the HTML web page könntest Du die Gestaltung der Webseite in eine Funktion verlagern. Dann kannst Du diese Funktion auch bei Tastendrücken aufrufen. Mal so als grobe Idee.

Der Programmcode wartet immer auf einer Reaktion vom "client" auf der Webseite, bevor er die weiteren Aktionen durchführt.

Vergiss den WiFiServer, nimm stattdesen den WebServer aus den Beispielen.

Gruß Fips

Danke schonmal für eure Antworten.

Dann versuche ich mich mal in die Beispiele von Fips einzudenken.

Schau dir auch die Beispiele in der IDE unter Datei -> Beispiele -> Esp8266WebServer an.

Gruß Fips