Direkt zum Hauptinhalt

AP Webserver - Programmier Anleitung

Einleitung

Diese Anleitung beschreibt den Aufbau eines WEB-Servers mit einem ESP32. Dabei nutzen wir die WLAN-Funktion des ESP32 und erstellen einen Access-Point. Nachdem wir uns mit dem Access-Point verbunden haben, rufen wir den WEB-Server mit seiner IP-Adresse auf und steuern damit zwei Ausgänge des ESP32.

ap1.png

Die Programmierung

Das Programm in den ESP32 laden:
Starte die Arduino IDE
Kopiere aus der Nextcloud das Programm "ESP32_AP.txt" in die Arduino IDE
Ändere in der Zeile const char* ssid = "Oberlab01"; die Nummer 01 in deine Platznummer
Verbinde den ESP32 über die USB-Schnittstelle mit dem Notebook
Lade das Programm in den ESP32

balken.png

Die Verbindung mit dem ESP32 herstellen und den WEB-Server starten:
Öffne die WLAN-Einstellungen deines Handys/Tablet
Wähle das Netzwerk Oberlabxx aus
Wenn das Handy/Tablet mit dem ESP32 verbunden ist, dann öffne deinen Browser
gibt im Webadressfeld die IP-Adresse 192.168.4.1 ein
Wenn der WEB-Server geladen ist, kannst du die Ausgänge des ESP32 steuern


Das Oberlabxx Netzwerk auswählen

ap3.png

IP-Adresse 192.168.4.1 eingeben

ap4.png

balken.png

 

ESP32 Test-Programm (interne LED blinkt)

void setup() {
  pinMode(2, OUTPUT);

}

void loop() {
    digitalWrite(2, HIGH);
    delay(1000);
    digitalWrite(2, LOW);
    delay(1000);

}

WEB-Server Programm

/************************************************************************************************* 
                                      PROGRAMMINFO
************************************************************************************************** 
Funktion: ESP32 Access Point mit WEB Server fuer zwei GPIOs
Mobile Browser:   192.168.4.1
**************************************************************************************************
Version: khf 23.05.2022
**************************************************************************************************
Board: ESP32vn IoT UNO Boardverwalter V1.0.4 (2.0.0)
**************************************************************************************************
C++ Arduino IDE V1.8.19
**************************************************************************************************
Einstellungen:
https://dl.espressif.com/dl/package_esp32_index.json
http://dan.drown.org/stm32duino/package_STM32duino_index.json
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json
**************************************************************************************************
**************************************************************************************************/
//Wi-Fi Library https://github.com/arduino-libraries/WiFi
#include <WiFi.h>

const char* ssid     = "Dein Name"; //Mit diesen Namen erscheint der ESP32 in deiner WLAN-Liste
const char* password = "12345678";

WiFiServer server(80);

String header;

String output26State = "off";
String output27State = "off";

const int output26 = 26;
const int output27 = 27;

void setup() {
  Serial.begin(115200);
  // Definiere Ausgänge
  pinMode(output26, OUTPUT);
  pinMode(output27, OUTPUT);
  // Setzt Ausgänge auf LOW
  digitalWrite(output26, LOW);
  digitalWrite(output27, LOW);

  // Wi-Fi verbinden
  Serial.print("Service Set Identifier (Access Point)…");

  WiFi.softAP(ssid, password);

  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(IP);
  
  server.begin();
}

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

  if (client) {                             // Wenn neue Client-Verbindung,
    Serial.println("New Client.");          // sende Info an seriellen Monitor
    String currentLine = "";                // Zeichenfolge, um eingehende Daten vom Client zu speichern
    while (client.connected()) {            // Schleife, während der Client verbunden ist
      if (client.available()) {             // wenn es Bytes gibt, die vom Client gelesen werden müssen,
        char c = client.read();             // Byte lesen und dann
        Serial.write(c);                    // auf den seriellen Monitor ausgeben
        header += c;
        if (c == '\n') {                    // Wenn es sich bei dem Byte um ein Zeilenumbruchzeichen handelt
          // Wenn die aktuelle Zeile leer ist, dann schreibe zwei Zeilenumbruchzeichen in einer Zeile.
          // Das ist das Ende der Client-HTTP-Anforderung, also sende eine Antwort:
          if (currentLine.length() == 0) {
            // HTTP-Header beginnen immer mit einem Antwortcode (z.B. HTTP/1.1 200 OK)
            // und ein Content-Typ, damit der Client weiß, was kommt, dann eine Leerzeile:)
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();
            
            // Aktiviert und deaktiviert die GPIOs
            if (header.indexOf("GET /26/on") >= 0) {
              Serial.println("GPIO 26 on");
              output26State = "on";
              digitalWrite(output26, HIGH);
            } else if (header.indexOf("GET /26/off") >= 0) {
              Serial.println("GPIO 26 off");
              output26State = "off";
              digitalWrite(output26, LOW);
            } else if (header.indexOf("GET /27/on") >= 0) {
              Serial.println("GPIO 27 on");
              output27State = "on";
              digitalWrite(output27, HIGH);
            } else if (header.indexOf("GET /27/off") >= 0) {
              Serial.println("GPIO 27 off");
              output27State = "off";
              digitalWrite(output27, LOW);
            }
            
            // Anzeigen der HTML-Webseite
            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:,\">");
            // CSS Style on/off Buttons
            client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
            client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;");
            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
            client.println(".button2 {background-color: #FF0D0D;}</style></head>");
            
            // Webseite Kopf
            client.println("<body><h1>ESP32 Web Server</h1>");
            
            // Anzeigen des aktuellen Zustands und der Ein-/Aus-Tasten für GPIO 26  
            client.println("<p>GPIO 26 - Status " + output26State + "</p>");
            // Wenn der output26State deaktiviert ist, wird die ON-Taste angezeigt      
            if (output26State=="off") {
              client.println("<p><a href=\"/26/on\"><button class=\"button\">OFF</button></a></p>");
            } else {
              client.println("<p><a href=\"/26/off\"><button class=\"button button2\">ON</button></a></p>");
            } 
               
            // Anzeigen des aktuellen Zustands und der Ein-/Aus-Tasten für GPIO 27 
            client.println("<p>GPIO 27 - Status " + output27State + "</p>");
            // Wenn der output27State deaktiviert ist, wird die ON-Taste angezeigt      
            if (output27State=="off") {
              client.println("<p><a href=\"/27/on\"><button class=\"button\">OFF</button></a></p>");
            } else {
              client.println("<p><a href=\"/27/off\"><button class=\"button button2\">ON</button></a></p>");
            }
            client.println("</body></html>");
            
            // Die HTTP-Antwort endet mit einer weiteren Leerzeile
            client.println();
             break;
          } else { 
            currentLine = "";
          }
        } else if (c != '\r') {  // Wenn etwas anderes als ein Return-Zeichen dann,
          currentLine += c;      // füge es am Ende der currentLine hinzu
        }
      }
    }
    // Lösche header variable
    header = "";
    // Schließe Verbindung
    client.stop();
    Serial.println("Client getrennt");
    Serial.println("");
  }
}

Fertig, Glückwunsch!

Aufgabe

Erweitere den ESP-WEB-Server auf vier Ausgänge.