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
- RTC-Modul DS3231
- Leitungsdrähte
Baue die Schaltung auf
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
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:
![]() |
![]() |
![]() |
Binde die benötigten Bibliotheken ein und lege die Variablen fest.:
# include "DHT.h"
# include "RTClib.h"
# include "WiFiNINA.h"
// Name des RTC-Moduls
RTC_DS3231 rtc;
// DHT11
// # define DHTTYPE DHT11
// DHT22
# define DHTTYPE DHT22
# define DHTPIN 8
// Sensor zuordnen
DHT dht(DHTPIN, DHTTYPE);
// Router: Name des Routers
// Passwort: WLAN-Passwort
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";
int status = WL_IDLE_STATUS;
WiFiServer server(80);
WiFiClient client = server.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];
Der setup-Teil startet das RTC-Modul und fordert über DHCP eine IP an oder legt manuell eine fest:
void setup()
{
// RTC-Modul starten
rtc.begin();
/*
wenn Datum und Zeit nicht korrekt -> Datum/Zeit setzen
Jahr, Monat, Tag, Stunde, Minute, Sekunde
rtc.adjust(DateTime(2023, 5, 10, 13, 31, 30);
*/
// rtc.adjust(DateTime(2023, 5, 10, 13, 31, 30));
// dht starten
dht.begin();
Serial.begin(9600);
// auf serielle Verbindung warten
while (!Serial) {;}
// Verbindung aufbauen
if (WiFi.status() == WL_NO_MODULE)
{
Serial.println(F("Verbindungsaufbau gescheitert!"));
}
Serial.print("Verbindung aufbauen mit ");
Serial.println(Router);
while (status != WL_CONNECTED)
{
status = WiFi.begin(Router, Passwort);
delay(2000);
}
server.begin();
Serial.print("Router: ");
Serial.println(WiFi.SSID());
IPAddress ip = WiFi.localIP();
Serial.print("IP Adresse Arduino: ");
Serial.println(ip);
DateTime aktuell = rtc.now();
// Datum und Zeit holen
char Datum[] = "DD.MM.YYYY ";
char Zeit[] = "hh:mm:ss Uhr";
Serial.print(aktuell.toString(Datum));
Serial.println(aktuell.toString(Zeit));
}
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;
client = server.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: ");
DateTime aktuell = rtc.now();
char Datum[] = "DD.MM.YYYY ";
char Zeit[] = "hh:mm:ss Uhr";
switch (aktuell.dayOfTheWeek())
{
case 0:
client.print("Sonntag");
break;
case 1:
client.print("Montag");
break;
case 2:
client.print("Dienstag");
break;
case 3:
client.print("Mittwoch");
break;
case 4:
client.print("Donnerstag");
break;
case 5:
client.print("Freitag");
break;
case 6:
client.print("Samstag");
break;
}
client.print(", ");
client.print(aktuell.toString(Datum));
client.println(aktuell.toString(Zeit));
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] = aktuell.toString(Datum);
gespeichertesDatum[Zaehler] = gespeichertesDatum[Zaehler] + aktuell.toString(Zeit);
// 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) + ": ");
switch (aktuell.dayOfTheWeek())
{
case 0:
client.print(F("Sonntag"));
break;
case 1:
client.print("Montag");
break;
case 2:
client.print("Dienstag");
break;
case 3:
client.print("Mittwoch");
break;
case 4:
client.print("Donnerstag");
break;
case 5:
client.print("Freitag");
break;
case 6:
client.print("Samstag");
break;
}
client.print(", ");
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(F("<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(F("<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 Aufgaben:
- 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
- ESP32-Wroom/Arduino ESP32: Wetterdaten von Openweather auf einem TFT anzeigen
- BMP280 - Temperatur und Luftdruck messen
- TMP36 - Temperatur messen
- Wetterstation mit CO2-Messung
- Wetterstation mit Nano ESP32, DHT11/DHT22 und OLED
- Wetterstation mit UNO R4 WiFi und LCD
- DHT11/DHT22 - Wetterstation LAN Daten speichern
Letzte Aktualisierung: