|
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.