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. (Arduino MKR WiFi 1010)
(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;
// 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";
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(2020, 12, 13, 13, 31, 30));
*/
// rtc.adjust(DateTime(2024, 5, 7, 12, 44, 30));
// dht starten
dht.begin();
Serial.begin(9600);
while (!Serial);
delay(1000);
Serial.print("Verbindung aufbauen mit ");
Serial.println(Router);
// WiFi starten
WiFi.begin(Router, Passwort);
while (WiFi.status() != WL_CONNECTED)
{
delay(200);
Serial.print(".");
}
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("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("<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
- Wetterdaten von Openweather mit der API 3.0 auf einem TFT anzeigen
- 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, Wemos D1 Mini, DHT11/DHT22 und OLED
- Wetterstation mit UNO R4 WiFi und LCD
- DHT11/DHT22 - Wetterstation LAN Daten speichern
Letzte Aktualisierung: