Inhalt
Beschreibung der Anleitung
Die Temperatursensoren DHT11 und DHT22 messen Temperatur und Luftfeuchtigkeit. Diese Daten werden über WiFi an einen Browser übertragen und angezeigt. Alle 60 Sekunden wird die Anzeige automatisch aktualisiert.
Zusätzlich wird mit Hilfe der Standardbibliothek time.h das aktuelle Datum und die Zeit der Messung angezeigt. Über einen Button kann die Seite auch händisch aktualisiert werden.
Ansicht im Browser
Benötigte Bauteile
Der Schaltplan
Die Pinbelegung des DHT-Moduls kann sich von der hier gezeigten unterscheiden.
Achte deshalb auf die Beschriftung des Sensors!
Das Programm
Benötigte Bibliothek installieren
Globale Variablen definieren und Bibliothek einbinden
Die Bibliothek time.h sorgt für die Ermittlung der aktuellen Zeit über NTP-Server. Das NTP (Network Time Protocol) ist ein Protokoll zur Synchronisierung von Uhren in Computersystemen. Im Internet existieren öffentlich zugängliche NTP-Server, die sich zur Zeitsynchronisation nutzen lassen. Hier wird ein Pool von Zeitservern verwendet. Das hat den Vorteil, dass bei einem Ausfall eines Zeitservers der nächste in der Liste verwendet wird.
// benötigte Bibliotheken
#include
#include
#include
// DHT11
// # define DHTTYPE DHT11
// DHT22
#define DHTTYPE DHT22
#define DHTPIN D7
// Sensor zuordnen
DHT dht(DHTPIN, DHTTYPE);
#define Router "Router_SSID"
#define Passwort "xxxxxxxx"
/*
NTP-Server aus Pool
# define Zeitserver "de.pool.ntp.org"
oder z.B. Zeitserver der Physikalisch-technischen Bundesanstalt
# define Zeitserver "ptbtime1.ptb.de"
*/
#define Zeitserver "de.pool.ntp.org"
/*
Liste der Zeitzonen
https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
Zeitzone CET = Central European Time -1 -> 1 Stunde zurück
CEST = Central European Summer Time von
M3 = März, 5.0 = Sonntag 5. Woche, 02 = 2 Uhr
bis M10 = Oktober, 5.0 = Sonntag 5. Woche 03 = 3 Uhr
*/
#define Zeitzone "CET-1CEST,M3.5.0/02,M10.5.0/03"
// time_t enthält die Anzahl der Sekunden seit dem 1.1.1970 0 Uhr
time_t aktuelleZeit;
/*
Struktur tm wandelt die ermittelte Zeit in ein "lesbares" Format um:
tm_hour -> Stunde: 0 bis 23
tm_min -> Minuten: 0 bis 59
tm_sec -> Sekunden 0 bis 59
tm_mday -> Tag 1 bis 31
tm_mon -> Monat: 0 (Januar) bis 11 (Dezember)
tm_year -> Jahre seit 1900
tm_yday -> vergangene Tage seit 1. Januar des Jahres
tm_isdst -> Wert > 0 = Sommerzeit (dst = daylight saving time)
*/
tm Zeit;
// Webserver Port 80
WiFiServer Server(80);
// Client-Objekt mit dem Namen Client erstellen
WiFiClient Client;
Der setup-Teil
void setup()
{
Serial.begin(9600);
// Parameter für die zu ermittelnde Zeit
configTime(Zeitzone, Zeitserver);
WiFi.begin(Router, Passwort);
// Verbindung herstellen
while (WiFi.status() != WL_CONNECTED)
{
delay(200);
Serial.print(".");
}
Server.begin();
// SSID des Routers anzeigen
Serial.println();
Serial.print("Verbunden mit ");
Serial.println(WiFi.SSID());
// IP des D! anzeigen
Serial.println(WiFi.localIP());
// dht starten
dht.begin();
}
Im Seriellen Monitor wird die IP-Adresse des Wemos D1 angezeigt.
Diese IP-Adresse musst du in der Adresszeile eines Browsers deiner Wahl eingeben.
Der loop-Teil
void loop()
{
// aktuelle Zeit lesen
time(&aktuelleZeit);
// localtime_r -> ermittelte Zeit in die lokale Zeitzone setzen
localtime_r(&aktuelleZeit, &Zeit);
// Variable für Temperatur und Luftfeuchtigkeit
float Temperatur;
float Luftfeuchtigkeit;
String AnzeigeTemperatur;
String AnzeigeLuftfeuchtigkeit;
Client = Server.available();
if (Client)
{
// Seite aufbauen wenn SeiteAufbauen true ist
boolean SeiteAufbauen = true;
// String SchaltungLesen = "";
while (Client.connected())
{
if (Client.available())
{
char Zeichen = Client.read();
if (Zeichen == '\n')
{
// wenn SeiteAufbauen den Wert true hat
if (SeiteAufbauen)
{
// 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("");
Client.println("");
Client.println("");
// alle 60 Sekunden aktualisieren mit meta-Tag
Client.println("");
Client.println(" Temperatur und Luftfeuchtigkeit messen
");
Client.println("
");
Client.print("Letzte Messung: ");
// tm_mday -> Wochentag anzeigen
switch (Zeit.tm_wday)
{
case 0:
Client.print(F("Sonntag"));
break;
case 1:
Client.print(F("Montag"));
break;
case 2:
Client.print(F("Dienstag"));
break;
case 3:
Client.print(F("Mittwoch"));
break;
case 4:
Client.print(F("Donnerstag"));
break;
case 5:
Client.print(F("Freitag"));
break;
case 6:
Client.print(F("Samstag"));
break;
}
Client.print(", ");
// Tag
// bei einstelligen Werten -> führende 0 ergänzen
if (Zeit.tm_mday < 10) Client.print("0");
Client.print(Zeit.tm_mday);
Client.print(".");
// Monat Zählung beginnt mit 0
// bei einstelligen Werten -> führende 0 ergänzen
if (Zeit.tm_mon < 10) Client.print("0");
Client.print(Zeit.tm_mon + 1);
Client.print(".");
// tm_year + 1900
Client.print(Zeit.tm_year + 1900);
// Uhrzeit
Client.print(" Uhrzeit: ");
// Stunden
if (Zeit.tm_hour < 10) Client.print("0");
Client.print(Zeit.tm_hour);
Client.print(":");
// Minuten
if (Zeit.tm_min < 10) Client.print("0");
Client.print(Zeit.tm_min);
Client.print(":");
// Sekunden
if (Zeit.tm_sec < 10) Client.print("0");
Client.print(Zeit.tm_sec);
Client.println("
");
Client.println("
");
// Temperatur lesen
AnzeigeTemperatur = String(dht.readTemperature());
// . durch , ersetzen
AnzeigeTemperatur.replace(".", ",");
// Luftfeuchtigkeit lesen
AnzeigeLuftfeuchtigkeit = String(dht.readHumidity());
// . durch , ersetzen
AnzeigeLuftfeuchtigkeit.replace(".", ",");
// Daten im Browser anzeigen
Client.print("Temperatur:");
Client.println(AnzeigeTemperatur + " °C
");
Client.println("
");
Client.print("Luftfeuchtigkeit:");
Client.println(AnzeigeLuftfeuchtigkeit + " %
");
Client.println(" ");
Client.println("
");
// IPs anzeigen
Client.print("Eigene IP: ");
Client.print(Client.remoteIP());
Client.print("");
Client.print("
IP Klient (D1): ");
Client.print(WiFi.localIP());
Client.print("");
Client.println("");
Client.print("");
// HTTP-Antwort endet mit neuer Zeile
Client.println();
// Seite vollständig geladen -> loop verlassen
break;
}
// wenn new line (\n) gesendet wurde -> Seite aufbauen
if (Zeichen == '\n') SeiteAufbauen = true;
// bei einem anderen Zeichen als return (\r)
else if (Zeichen != '\r')
{
SeiteAufbauen = false;
}
delay(1);
Client.stop();
}
}
}
}
}
Funduino - Dein Onlineshop für Mikroelektronik
-
Dauerhaft bis zu 10% Rabatt für Schüler, Studenten und Lehrkräfte
-
Mehr als 3.500 Artikel sofort verfügbar!
-
Über 8 Jahre Erfahrung mit Arduino, 3D-Druck und co.