Lesezeit: 6 Minuten
Die mit dem Temperatursensor DHT11/DHT22 gemessenen Werte sollen mit WiFi in einem Internetbrowser angezeigt werden.
So sieht es aus:
Beispiele für DHT11/DHT22 Sensoren
Die Pinbelegung kann sich von der hier gezeigten unterscheiden. Achte auf die Beschriftung auf dem Modul!
Benötigte Bauteile
- Temperatursensor DHT22 oder DHT11
- Leitungsdrähte
Schaltpläne
Für das Programm brauchst du eine freie IP-Adresse und eine freie MAC-Adresse in deinem lokalen Netzwerk.
Im Regelfall befindet sich in einem lokalen Netzwerk ein DHCP-Server, der jedem Gerät im Netzwerk automatisch eine IP-Adresse zuteilt. Im Programm wird eine über DHCP vergebene Adresse verwendet.
Installiere mit dem Boardverwalter das passende Board:
Benötigte Bibliotheken:
Die Bibliothek WiFiNINA muss für den UNO R4 WiFi nicht installiert werden.
Binde die benötigten Bibliotheken ein und lege die Variablen fest.:
#include "DHT.h"
#include "WiFiS3.h"
#include "NTP.h"
// Router: Name des Routers
// Passwort: WLAN-Passwort
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";
// DHT22
#define DHTTYPE DHT22
#define DHTPIN 8
// Sensor zuordnen
DHT dht(DHTPIN, DHTTYPE);
WiFiServer WiFiServer(80);
WiFiClient client = WiFiServer.available();
byte Zaehler = 0;
// maximale Anzahl gespeicherter Werte
const byte AnzahlDaten = 11;
// Arrays für die Speicherung
String gespeicherteTemperatur[AnzahlDaten];
String gespeichertesDatum[AnzahlDaten];
String gespeicherteLuftfeuchtigkeit[AnzahlDaten];
WiFiUDP wifiUdp;
NTP ntp(wifiUdp);
Der setup-Teil startet das RTC-Modul und fordert über DHCP eine IP an oder legt manuell eine fest:
void setup()
{
// dht starten
dht.begin();
Serial.begin(9600);
while (!Serial);
delay(1000);
Serial.print("Verbindung aufbauen mit ");
Serial.println(WiFi.SSID());
// WiFi starten
WiFi.begin(Router, Passwort);
while (WiFi.status() != WL_CONNECTED)
{
delay(200);
Serial.print(".");
}
WiFiServer.begin();
Serial.print("Router: ");
Serial.println(WiFi.SSID());
Serial.print("IP Adresse Arduino: ");
Serial.println(WiFi.localIP());
// Sommerzeit/Normalzeit
ntp.ruleDST("CEST", Last, Sun, Mar, 2, 120);
ntp.ruleSTD("CET", Last, Sun, Oct, 3, 60);
// ntp starten Zeit aktualisieren
ntp.begin();
ntp.update();
// Wochentag
switch (ntp.weekDay())
{
case 0:
Serial.print("Sonntag");
break;
case 1:
Serial.print("Montag");
break;
case 2:
Serial.print("Dienstag");
break;
case 3:
Serial.print("Mittwoch");
break;
case 4:
Serial.print("Donnerstag");
break;
case 5:
Serial.print("Freitag");
break;
case 6:
Serial.print("Samstag");
break;
}
Serial.print(", ");
Serial.println(ntp.formattedTime("%d. %B %Y %T Uhr"));
}
Im Seriellen Monitor werden die IP des Arduinos und das aktuelle Datum und die aktuelle Zeit angezeigt. Diese Adresse wird in einem Browser eingegeben.
Der loop-Teil. Beachte die Kommentare.
void loop()
{
float Temperatur;
float Luftfeuchtigkeit;
String Nummer;
String AnzeigeTemperatur;
String AnzeigeLuftfeuchtigkeit;
String aktuelleZeit = "";
client = WiFiServer.available();
if (client)
{
String SchaltungLesen = "";
while (client.connected())
{
if (client.available())
{
char Zeichen = client.read();
if (Zeichen == '\n')
{
if (SchaltungLesen.length() == 0)
{
// HTTP-Anforderung senden
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
// Leerzeile zwingend erforderlich
client.println();
/*
HTML-Seite aufbauen
die folgenden Anweisungen müssen mit print oder println gesendet werden
println "verschönert" den Quelltext
" muss mit \" maskiert werden
*/
client.println("<!doctype html>");
client.println("<html>");
client.println("<body>");
// alle 60 Sekunden aktualisieren mit meta-Tag
client.println("<meta http-equiv=\"refresh\" content=\"60\">");
client.println("<h1> Temperatur und Luftfeuchtigkeit messen</h1>");
client.println("<hr />");
client.print("<h2>Letzte Messung: ");
ntp.update();
// Wochentag Datim zusammensetzen
switch (ntp.weekDay())
{
case 0:
aktuelleZeit += "Sonntag";
break;
case 1:
aktuelleZeit += "Montag";
break;
case 2:
aktuelleZeit += "Dienstag";
break;
case 3:
aktuelleZeit += "Mittwoch";
break;
case 4:
aktuelleZeit += "Donnerstag";
break;
case 5:
aktuelleZeit += "Freitag";
break;
case 6:
aktuelleZeit += "Samstag";
break;
}
aktuelleZeit += ", ";
aktuelleZeit += ntp.formattedTime("%d. %B %Y %T Uhr");
client.println(aktuelleZeit);
client.println("</h2>");
client.println("<hr />");
// Daten lesen
AnzeigeTemperatur = String(dht.readTemperature());
AnzeigeTemperatur.replace(".", ",");
AnzeigeLuftfeuchtigkeit = String(dht.readHumidity());
AnzeigeLuftfeuchtigkeit.replace(".", ",");
client.print("<b>Temperatur:</b><blockquote>");
client.println(AnzeigeTemperatur + " °C</blockquote>");
client.println("<br>");
client.print("<b>Luftfeuchtigkeit:</b><blockquote>");
client.println(AnzeigeLuftfeuchtigkeit + " %</blockquote><hr>");
client.println("<form>");
// Datum speichern
gespeichertesDatum[Zaehler] = aktuelleZeit;
// Temperatur speichern
gespeicherteTemperatur[Zaehler] = AnzeigeTemperatur;
// Luftfeuchtigkeit speichern
gespeicherteLuftfeuchtigkeit[Zaehler] = AnzeigeLuftfeuchtigkeit;
client.println("<b>Gespeicherte Werte:<br></b>");
// gespeicherte Daten anzeigen
for (int i = 0; i <= Zaehler; i++)
{
client.println(String(i + 1) + ": ");
client.println(gespeichertesDatum[i]);
client.print(" | Temperatur: → ");
client.println(gespeicherteTemperatur[i]);
client.print(" °C");
client.print(" | Luftfeuchtigkeit: → ");
client.println(gespeicherteLuftfeuchtigkeit[Zaehler]);
client.println("%");
client.println("<br>");
}
client.println("<hr />");
// Button formatieren
client.print("<input style=\"font-size:16pt; font-weight:bold;");
client.print("background-color:#55A96B;");
client.print("display:block; cursor:pointer;\"type=\"button\"");
client.println(" onClick=\"location.href='WiFi.localIP()'\" value=\"aktualisieren\">");
client.println("</form>");
client.println("<hr />");
// IPs anzeigen
client.print("<b>Eigene IP: ");
client.print(client.remoteIP());
client.print("</b>");
client.print("<br><b>IP Arduino: ");
client.print(WiFi.localIP());
client.print("</b>");
client.println("</b>");
client.println("</body>");
client.print("</html>");
// HTTP-Antwort endet mit neuer Zeile
client.println();
// Seite vollständig geladen -> loop verlassen
break;
}
else
{
SchaltungLesen = "";
}
}
// bei einem anderen Zeichen als return (\r)
// -> Zeichen dem String SchaltungLesen hinzufügen
else if (Zeichen != '\r')
{
SchaltungLesen += Zeichen;
}
}
}
client.stop();
// Zaehler erhöhen und bei > AnzahlDaten zurücksetzen
if (Zaehler < AnzahlDaten) Zaehler++;
if (Zaehler >= AnzahlDaten) Zaehler = 0;
}
Wenn die Seite mit Aufruf der IP nicht angezeigt wird, versuche ein http:// davorzusetzen.
Verwandte Anleitungen:
- BME280 -Messdaten anzeigen
- DHT11/DHT22 - Durchschnittstemperatur berechnen und auf einem OLED-Display anzeigen
- DHT11/DHT22 - Wetterdaten aufzeichnen
- DHT11/DHT22 - Wetterdaten mit Bluetooth-Modul übermitteln
- DHT11/DHT22 - Wetterstation LAN
- DHT11/DHT22 - Wetterstation Anzeige auf einem LCD
- Messdaten mit BME680 und ESP32 anzeigen
- BMP280 - Temperatur und Luftdruck messen
- Temperaturanzeige auf einem LCD mit einem ESP32-Wroom
- TMP36 - Temperatur messen
- Wetterstation mit CO2-Messung
- Wetterstation mit Nano ESP32, ESP32-Wroom, NodeMCU, DHT11/DHT22 und OLED
- Wetterstation mit UNO R4 WiFi und LCD
- DHT11/DHT22 - Wetterstation LAN Daten speichern
Letzte Aktualisierung: