
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.

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
- Durchschnittstemperatur verschiedener Messungen des DHT-Sensors berechnen und auf einem OLED-Display anzeigen
- ESP-01 Zeit und Messwerte DHT/BME280 auf einem LCD und im Browser anzeigen
- Klimaanlage mit 12V-Lüfter und Transistor
- Messwerte BME280 mit GFXcanvas auf TFT anzeigen
- Messwerte des BME280-Sensors auf LCD anzeigen
- Messwerte des BME280-Sensors mit UNO R4 WiFi im Webbrowser anzeigen
- Messwerte des BME680-Sensors auf LCD und im Webbrowser anzeigen
- Messwerte des BMP280-Sensor auf LCD anzeigen
- Messwerte des DHT-Sensor auf der SD-Karte des Ethernet-Shields speichern und im Webbrowser anzeigen
- Messwerte des DHT-Sensor mit Ethernet-Shield im Webbrowser anzeigen
letzte Aktualisierung:

