
Ziel des Projekts
Mit dem Sensor DHT11/DHT22 werden Temperatur und Luftfeuchtigkeit gemessen, das Ergebnis wird auf einem OLED angezeigt. Die über einen Zeitserver ermittelte Zeit wird ebenfalls auf dem OLED dargestellt. Als Mikrocontroller wird ein ESP verwendet.

Pinbelegung der Mikrocontroller (Beispiele)



I²C–Pins der Mikrocontroller
- ESP32-Wroom
- ESP32-C6
- XIAO-ESP32-C3
- ESP32-C3 Zero
- ESP32-C6 Zero (Waveshare)
- ESP32-C3 Super Mini
- ESP32-S3
- ESP32-S3 Super Mini/ESP32-S3 Zero
- Wemos D1
- NodeMCU
- Arduino Nano ESP32
Board installieren
Installiere mit dem Boardverwalter das passende Board:
- ESP32-Wroom
- ESP32C6
- XIAO-ESP32-C3
- ESP32-C3-Zero
- ESP32-C6 Zero (Waveshare)
- ESP32-C3 Super Mini
- ESP32-S3
- ESP32-S3 Super Mini/ESP32-S3 Zero
- Arduino Nano ESP32
- Wemos D1
- NodeMCU
Das Programm
Erläuterungen zum Quellcode
- das Programm verwendet die Funktion WiFiMulti
das WLAN-Netzwerk mit der besten Signalstärke wird automatisch verbunden
ab Zeile 22 werden die verfügbaren WiFi-Netze als Werte-Paar definiert:
SSID des Routers/Repeaters, PasswortWiFiNetzwerke.addAP("Router_SSID", "xxxxxxxx");
WiFiNetzwerke.addAP("Repeater_1", "xxxxxxxx"); - die Synchronisation mit dem NTP-Server kann etwas Zeit in Anspruch nehmen
kommt nach 60 Sekunden keine Verbindung zustande, wird das Programm beendet - Liste der Zeitzonen 🔗https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
#define Zeitzone “CET-1CEST,M3.5.0/02,M10.5.0/03”
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 - Elemente der Struktur tm der Bibliothek time.h
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) - der Pin und der Typ des DHT-Sensors muss angepasst werden

Bibliotheken und Variable
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include "WiFi.h" #include "time.h" #include "U8g2lib.h" #include "DHT.h" #include "WiFiMulti.h" WiFiMulti WiFiNetzwerke; // OLED initialisieren U8G2_SSD1306_128X64_NONAME_F_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE); // Pin des Sensors anpassen int SENSOR_DHT = 13; //Sensortyp anpassen // DHT11 // #define SensorTyp DHT11 // DHT22 #define SensorTyp DHT22 // Sensor einen Namen zuweisen DHT dht(SENSOR_DHT, SensorTyp); // NTP-Server aus dem Pool #define Zeitserver "de.pool.ntp.org" #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; tm Zeit; boolean Start = true; int Stunden, Minuten, Sekunden; unsigned long Zeitmessung = 0; |
Der setup-Teil
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
void setup() { // OLED starten oled.begin(); // Zeichenfarbe weiß oled.setDrawColor(1); // horizontale Schrift oled.setFontDirection(0); Serial.begin(9600); // Parameter für die zu ermittelnde Zeit configTzTime(Zeitzone, Zeitserver); oled.setCursor(0, 20); oled.setFont(u8g2_font_helvB12_tf); oled.print("WiFi verbinden"); oled.sendBuffer(); // verfügbare WiFi-Netzwerke WiFiNetzwerke.addAP("Router", "xxxxxxxx"); WiFiNetzwerke.addAP("Repeater-1", "xxxxxxxx"); WiFiNetzwerke.addAP("Repeater-2", "xxxxxxxx"); WiFi.mode(WIFI_STA); WiFi.setSleep(false); WiFi.setAutoReconnect(true); if (WiFiNetzwerke.run() == WL_CONNECTED) { Serial.println("WiFi verbunden ..."); } oled.setCursor(0, 40); oled.print("WiFi verbunden"); oled.sendBuffer(); // localtime_r -> Zeit in die lokale Zeitzone setzen localtime_r(&aktuelleZeit, &Zeit); // Zeitzone: Parameter für die zu ermittelnde Zeit configTzTime(Zeitzone, Zeitserver); Serial.println("aktuelle Zeit holen"); oled.setCursor(0, 60); oled.print("Zeit holen"); oled.sendBuffer(); oled.clearBuffer(); int Zaehler = 0; // beim Start entspricht das Datum der Unixtime: 1.1.1970 // das Datum soll erst angezeigt werden, wenn es korrekt ist String Jahr = String(Zeit.tm_year + 1900); // String Jahr nach "1970" durchsuchen int Suche = Jahr.indexOf("1970"); // solange die Suche nicht erfolgreich ist // maximal 60 Sekunden while (Suche != -1 && Zaehler < 60) { // aktuelle Zeit holen time(&aktuelleZeit); // localtime_r -> Zeit in die lokale Zeitzone setzen localtime_r(&aktuelleZeit, &Zeit); Jahr = String(Zeit.tm_year + 1900); // String Jahr nach "1970" durchsuchen Suche = Jahr.indexOf("1970"); delay(1000); Zaehler ++; } // Status der Verbindung if(Suche == -1) { oled.setCursor(0,20); oled.print(WiFi.SSID()); oled.setCursor(0,40); oled.print(WiFi.localIP()); oled.setCursor(0,60); oled.print(WiFi.RSSI()); oled.sendBuffer(); oled.clearBuffer(); } delay(3000); // DHT starten dht.begin(); time(&aktuelleZeit); localtime_r(&aktuelleZeit, &Zeit); Stunden = Zeit.tm_hour, Minuten = Zeit.tm_min, Sekunden = Zeit.tm_sec; Zeitmessung = millis() + 1000; } |
Die Funktion DatenAnzeigen()
Im loop-Teil wird die Funktion DatenAnzeigen aufgerufen:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
void DatenAnzeigen() { // Zeit jede Minute mit Zeitserver synchronisieren time(&aktuelleZeit); localtime_r(&aktuelleZeit, &Zeit); Stunden = int(Zeit.tm_hour), Minuten = int(Zeit.tm_min), Sekunden = int(Zeit.tm_sec); // Temperatur String Temperatur = String(dht.readTemperature()); Temperatur.replace(".", ","); // Luftfeuchtigkeit String Luftfeuchtigkeit = String(dht.readHumidity()); Luftfeuchtigkeit.replace(".", ","); // localtime_r -> Zeit in die lokale Zeitzone setzen localtime_r(&aktuelleZeit, &Zeit); // horizontale Linie oled.setCursor(2, 20); // Zeit anzeigen oled.setFont(u8g2_font_helvB12_tf); if (Zeit.tm_hour < 10) oled.print("0"); oled.print(Zeit.tm_hour); oled.print(":"); if (Zeit.tm_min < 10) oled.print("0"); oled.print(Zeit.tm_min); oled.drawHLine(1, 25, oled.getDisplayWidth()); oled.setCursor(2, 43); oled.print(Temperatur); oled.print((char)176); oled.print("C"); oled.setCursor(2, 63); oled.print(Luftfeuchtigkeit +"%"); oled.sendBuffer(); oled.clearBuffer(); } |
Der loop-Teil
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
void loop() { // Start = true // -> Zeit einmalig synchronisieren if (Start) { Start = false; DatenAnzeigen(); } // Sekunden weiter zählen if (Zeitmessung < millis()) { Zeitmessung += 1000; Sekunden++; if (Sekunden == 60) { DatenAnzeigen(); } } } |
Ähnliche Projekte
- BME280 – Messdaten anzeigen
- BMP280 – Messdaten auf LCD anzeigen
- DHT – Messdaten und Zeit auf TFT anzeigen
- DHT11/DHT22 – Wetterstation LAN Daten speichern
- DHT11/DHT22 – Durchschnittstemperatur berechnen und auf einem OLED-Display anzeigen
- DHT11/DHT22 – Wetterdaten aufzeichnen
- DHT11/DHT22 – Wetterdaten mit Bluetooth-Modul übermitteln
- DHT11/DHT22 – Wetterstation Anzeige auf einem LCD
- DHT11/DHT22 – Wetterstation LAN
- DHT11/DHT22 – Wetterstation mit Arduino WiFi
letzte Aktualisierung:

