Webserver -  Schalten von Ausgängen

Es ist eigentlich nur ein Exkurs - Das Schalten von Ausgängen am ESP8266 mittels Webserver. Damit das Beispiel vollständig ist, zeige ich einen Ansatz wie man Schaltvorgänge auf der Weboberfläche auslösen kann.

Die Verwaltung der einzelnen Seiten ist uns nun geläufig - es braucht einen Handler und eine Funktion die eine Seite ausgibt. Selbiges können wir auch nutzen um einen GPIO eines ES8266 zu schalten. Da mir eine ganze Seite für einen einzigen GPIO etwas overkill erscheint, übergebe ich alle Schaltaufgaben an einen zentralen "Commander" c.php und teile mittels Parameter mit, welcher Ausgang wie geschaltet werden soll.

Eine Anmerkung: Am ESP8266 läuft kein PHP. Die Dateiendung dient nur zur Unterscheidung, dass hier keine HTML Ausgabe erfolgen wird, sondern dass der Webserver eine Resource zur Verfügung stellt (nämlich einen Zugang zu den GPIO's).

Wir ergänzen also wieder einen Handler im setup()

 server.on("/c.php", handleCommand); // process commands

sowie den entsprechenden "Commander":

void handleCommand() {
// receive command and handle accordingly
Serial.println(F("D223 handleCommand"));
for (uint8_t i = 0; i < server.args(); i++) {
Serial.print(server.argName(i));
Serial.print(F(": "));
Serial.println(server.arg(i));
}
if (server.argName(0) == "toggle") // the parameter which was sent to this server
{
  if (server.arg(0) == "1") // the value for that parameter
  {
    Serial.println(F("D232 toggle output1"));
    if (digitalRead(OUTPUT1_PIN)) { // toggle: if the pin was on - switch it of and vice versa
      digitalWrite(OUTPUT1_PIN, LOW);
    } else {
      digitalWrite(OUTPUT1_PIN, HIGH);
    }
  }
if (server.arg(0) == "2") // the value for that parameter
{
  Serial.println(F("D232 toggle output2"));
  if (digitalRead(OUTPUT2_PIN)) {
    digitalWrite(OUTPUT2_PIN, LOW);
  } else {
    digitalWrite(OUTPUT2_PIN, HIGH);
  }
}
}
else if (server.argName(0) == "CMD" && server.arg(0) == "RESET") // Example how to reset the module. Just send ?CMD=RESET
{
  Serial.println(F("D238 will reset"));
  ESP.restart();
}
server.send(204, "text/plain", "No Content"); // this page doesn't send back content --> 204
}

Von diesem Commander erwarten wir keine HTML-Ausgabe, daher setze ich den HTML-Response auf "204 No Content".

Im HTML einer Seite kann somit mit einem einfachen HREF eine Aktion ausgeführt werden:

message += F("<h2>Switch</h2>\n" // example how to switch/toggle an output
"<p>Example how to switch/toggle outputs, or to initiate actions. "
"The buttons are 'fake' buttons and only styled by CSS. Click to toggle the output.</p>\n"
"<p class='off'><a href='c.php?toggle=1' target='i'>Output 1</a></p>\n"
"<p class='off'><a href='c.php?toggle=2' target='i'>Output 2</a></p>\n"
"<iframe name='i' style='display:none' ></iframe>\n" // hack to keep the button press in the window
);

Das Ziel des "Links" leite ich an ein unsichtbares IFRAME. Das kann man später auch schöner machen. Dazu brauchen wir aber noch etwas mehr JavaScript. Daher belassen wir es zunächst bei dem einfachen HREF mit target Angabe.

Umgesetzt ist ein reines "Umschalten" (toggle). Man kann natürlich auch andere Befehle erfinden z.B. on für einschalten - und richtig off für das ausschalten von GPIOs.

Es geht weiter mit: Webclient - Senden mittels HTTP-POST

Links

  • Download des finalen Sketch ESP8266 Webserver WebClient
  • Amazon (Suchlink für NodeMCU V2 mit CP2102 *)
  • Amazon (Alternativ: Wemos D1 pro Mini *)

Die mit Sternchen (*) gekennzeichneten Verweise sind sogenannte Affiliate/Provision-Links. Wenn du auf so einen Verweis klickst und über diesen Link einkaufst, bekomme ich von deinem Einkauf eine (kleine) Provision. Für dich verändert sich der Preis dadurch nicht. Ich empfehle nur Produkte die ich selber besitze und wenn ich überzeugt bin, dass sie für andere interesssant sind.

 

Protokoll

erstellt: 2018-09-02 | Stand: 2021-09-01