Webserver für ESP8266

Reading Time: 2 minutes(Last Updated On: 15. Juli 2019)

Als kleinen Test habe ich einen Webserver für den ESP8266 benötigt. Ziel war es über einen ESP8266 und ein angeschlossenes Relais eine LED zu schalten. Das klingt jetzt nicht spannend, aber ich habe das gemacht um zu testen ob die Kommunikation zwischen meinem Devolo Smarthome auch wirklich mit HTTP funktioniert. So kann ich mir jetzt Teile für mein Smarthome selbst bauen oder günstig bestellen.

 

// Load Wi-Fi library
#include <ESP8266WiFi.h>

// Hier müssen noch die WLAN-Daten geändert werden
const char* ssid     = "YOUR WALND SSID";
const char* password = "YOUR WLAN KEY";

// Webserver soll auf Port 80 laufen
WiFiServer server(80);

// Variables zum Speichern des HTTP-Headers
String header;

// Variable zum Speichern des PIN-Zustands
String output5State = "off";
String output4State = "off";

#define output4 D4
#define output5 D5

void setup() {
  Serial.begin(115200);
  
  // Die Pins als Output-Pins definieren
  pinMode(output5, OUTPUT);
  pinMode(output4, OUTPUT);
  // Set outputs to LOW
  digitalWrite(output5, LOW);
  digitalWrite(output4, LOW);

  // Mit WLAN verbinden
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  // Lokale IP-Adresse ausgaben und Webserver starten
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  server.begin();
}

void loop(){
  WiFiClient client = server.available();   

  if (client) {                             
    Serial.println("New Client.");          
    String currentLine = "";                
    while (client.connected()) {            
      if (client.available()) {             
        char c = client.read();             
        Serial.write(c);                   
        header += c;
        if (c == '\n') {                    
          if (currentLine.length() == 0) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();

            Serial.println(header);

            // Hier werden die Pins geschaltet
            if (header.indexOf("GET /5/off") >= 0) {
              Serial.println("GPIO 5 geschalten");
              output5State = "PIN 5 geschalten";
              digitalWrite(output5, !(digitalRead(output5)));
            } else if (header.indexOf("GET /4/off") >= 0) {
              Serial.println("GPIO 4 geschlaten");
              output5State = "Pin 4 geschalten";
              digitalWrite(output4, !(digitalRead(output4)));
            } 
            
            //Webseite erstellen
            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>ESP8266 Web Server</h1>");
            
            // Aktuellen Status für die Pins ausgeben und Button zum Umschalten
            client.println("<p>GPIO 5 - State " + output5State + "</p>");
    
            if (output5State=="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>");
            } 

            client.println("<p>GPIO 4 - State " + output4State + "</p>");
 
            if (output4State=="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("</body></html>");
            
            client.println();

            break;
          } else { 
            currentLine = "";
          }
        } else if (c != '\r') {  
          currentLine += c;      
        }
      }
    }

    header = "";

    client.stop();
    Serial.println("Client disconnected.");
    Serial.println("");
  }
}

Den Sketch könnt ihr von meinem Github herunterladen.