Praxis

 

Praxis 18: Ausgabe der Temperatur über eine Webseite

 

Benötigtes Material:

  • ESP32 Dev Modul mit USB-Kabel
  • Breadboard
  • zwei Kabelstück (männlich↔männlich)
  • drei Kabelstücke (weiblich↔männlich)
  • ein DHT11-Sensor

 

 

 

 

Die Möglichkeit einen Webserver auf dem ESP32 laufen zu lassen eröffnet die Möglichkeit, die Temperatur und Luftfeuchtigkeitswerte über das Netz an anderen Rechnern und Orten zugänglich zu machen.

Der Aufbau bleibt von Praxis 15 gleich, der Sketch ist eine „Vereinigung“ der Sketche aus Praxis 15 und Praxis 17. Allerdings entfällt hier das Auswerten der Anfrage des Clients, da der Server nur die eine Seite mit den Messwerten ausgibt.

#include <Arduino.h>
/* -------------------------------------
    Praxis 18
    DHT11-Messung
    Ausgabe über Webseite
  -----------------------------------*/

#include <WiFi.h>
#include <DHT.h>
#define DHT_SENSOR_PIN 26
#define DHT_SENSOR_TYPE DHT11

const char* ssid = "Labornetz";
const char* password = "ITLabor2024!";

WiFiServer server(80);

String header;
unsigned long currentTime = millis();
unsigned long previousTime = 0;
const long timeoutTime = 4000;
unsigned long waitTime = millis();
DHT dht_sensor(DHT_SENSOR_PIN, DHT_SENSOR_TYPE);

void setup() {
  Serial.begin(115200);
  dht_sensor.begin();
  Serial.print("Verbindung zu WLAN ");
  Serial.print(ssid);
  Serial.println(" aufbauen:");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Verbunden mit ");
  Serial.println(ssid);
  Serial.print("IP Adresse: ");
  Serial.println(WiFi.localIP());
  server.begin();
  delay(1000);
}

void loop() {
  float humi = dht_sensor.readHumidity();
  float tempC = dht_sensor.readTemperature();
  String tempAus;
  String humiAus;
  if ( isnan(tempC) || isnan(humi)) {
    tempAus="Fehler!";
    humiAus="Fehler!";
  } else {
    tempAus=(String)tempC;
    humiAus=(String)humi;
  }
  waitTime = millis() + 10000;
  while (millis() < waitTime) {
  WiFiClient client = server.available();
    if (client) {
      currentTime = millis();
      previousTime = currentTime;
      String currentLine = "";
      while (client.connected() && currentTime - previousTime <= timeoutTime) {
        currentTime = millis();
        if (client.available()) {
          char c = client.read();
          header += c;
          if (c == '\n') {
            if (currentLine.length() == 0) {
              // Dem Client antworten
              client.println("HTTP/1.1 200 OK");
              client.println("Content-type:text/html");
              client.println("Connection: close");
              client.println();
              client.println("<!DOCTYPE html><html>");
              client.print("<head><meta name=\"viewport\" content=\"width=device-width");
              client.println(", initial-scale=1\">");
              client.println("<meta http-equiv=\"refresh\" content=\"20\">");
              client.println("<link rel=\"icon\" href=\"data:,\">");
              client.print("<style>html { font-family: Helvetica; display: inline-block; ");
              client.println("margin: 0px auto; text-align: center;}");
              client.println("</style></head>");
              client.println("<body><h1>ESP32-Thermo- und Hygrometer</h1>");
              client.println("<h2>CPS an der BS Obernburg (Elter/Rink/Bayer)</h2>");
              client.println("<p>Temperatur:   " + tempAus + " Grad Celsius</p>");
              client.println("<p>Feuchtigkeit: " + humiAus + "%</p>");
              client.print("<p align=center>Temperaturmessung mit DHT11. Die Seite wird re");
              client.print("gelmäßig neu geladen, um die aktuellen Messwerte zu ");
              client.println("erhalten.</p>");
              client.println("</body></html>");
              client.println();
              break;
            } else {
              currentLine = "";
            }
          } else if (c != '\r') {
            currentLine += c;
          }
        }
      }
      header = "";
      client.stop();
    }
  }
}

Im Grunde handelt es sich bei diesem Sketch um eine "Vereinigung" von Praxis 15 mit Praxis 17.Die Behandlung der Serveranfrage kann hier aber deutlich einfacher ausfallen, da keine Zustandsänderungen vom Client veranlasst werden können, die abgefragt werden müssten.

Damit die Messwerte regelmäßig aktualisiert werden können, wird über <meta http-equiv="refresh" content="20"> ein regelmäßiges Reload der Webseite eingerichtet.

 

Aufgaben

  1. Bauen Sie die die Schaltung mit den LEDs auf einem Breadboard auf.
    Beachten Sie dabei die Polung der LEDs.
  2. Geben Sie den Sketch in die IDE ein.
  3. Fügen Sie die benötigte „DHT Sensor Library“ zum Projekt hinzu, oder laden Sie sie in die IDE, falls noch nicht geschehen.
  4. Kompilieren und Übertragen Sie das Programm auf den ESP32.
  5. Öffnen Sie den seriellen Monitor bzw. das Terminal und prüfen Sie, ob eine Verbindung mit dem WLAN-Netz aufgebaut wurde:
    Sollten sich, statt einer sinnvollen Ausgabe, seltsame Zeichen aneinanderfügen, muss die Baudrate gegebenenfalls noch auf 115200 Baud eingestellt werden. Unter VS-Code erhalten Sie das Terminal über das „Stecker“-Symbol in der PlatformIO-Menüleiste. Die Baudrate können Sie in der „platformio.ini“ des Projekts eintragen.
  6. 6. Wurde die Verbindung erfolgreich aufgebaut, starten Sie einen Webbrowser und geben die IP-Adresse des ESP32 ein:
  7. Warten Sie 20 Sekunden, um zu prüfen, ob die Seite neu geladen wird.
  8. Schauen Sie sich den Seitenquelltext an. Vergleichen Sie die Informationen mit den client.println-Zeilen.