
Inhalt
Mit einem ESP32-Wroom und der Bibliothek time.h sollen Datum und Zeit auf einem TFT angezeigt werden.
Ein BMP280 steuert Temperatur und Luftdruck bei, der DHT11/DHT22 sorgt für die Anzeige der Luftfeuchtigkeit.
Darstellung auf dem TFT

Benötigte Bauteile
- Temperatursensor DHT11 oder DHT22
- BMP280
- Leitungsdrähte

⇒ Pinbelegungen verschiedener TFTs
Board installieren
Zuordnung der Pins
ESP32-Wroom mit 30 Pins

Das Programm
Benötigte Bibliothek installieren

Funktionen der Bibliothek Adafruit ST7735
| Schlüsselwort | Parameter | Aktion |
|---|---|---|
| width(); | Bildschirmbreite feststellen | |
| height(); | Bildschirmhöhe feststellen | |
| begin() | TFT starten | |
| initR(initR(INITR_*TAB);); | BLACKTAB GREENTAB REDTAB | Farbschema bestimmen |
| setRotation(Richtung); | Richtung = 0 → nicht drehen Richtung = 1 → 90° drehen Richtung = 2 → 180° drehen Richtung = 3 → 270 ° drehen | Bildschirm ausrichten |
| fillScreen(Farbe); | Standardfarben: ST7735_BLACK ST7735_WHITE ST7735_GREEN ST7735_RED ST7735_BLUE ST7735_YELLOW ST7735_ORANGE ST7735_MAGENTA ST7735_CYAN | Bildschirmhintergrund |
| drawLine(StartX, StartY, EndeX, EndeY, Farbe); | Linie zeichnen | |
| drawFastHLine(StartX, StartY, Länge, Farbe); | horizontale Linie zeichnen | |
| drawFastVLine(StartX, StartY, Länge, Farbe); | vertikale Linie zeichnen | |
| drawRect(StartX, StartY„ Breite, Höhe, Farbe); | Rechteck zeichnen | |
| drawRoundRect(StartX, StartY, Breite, Höhe, Eckenradius, Farbe); | abgerundetes Rechteck zeichnen | |
| fillRect(StartX, StartY, Breite, Höhe, Füllfarbe); | ausgefülltes Rechteck zeichnen | |
| drawCircle(MittelpunkX, MittelpunktY, Radius, Farbe); | Kreis zeichnen | |
| fillCircle(MittelpunktX, MittelpunktY, Radius, Füllfarbe); | Ausgefüllten Kreis zeichnen | |
| setCursor(x, y); | Cursor setzen | |
| setTextSize(Textgröße); | Textgröße: 1 — 4 | Textgröße bestimmen |
| setTextColor(Farbe); | Textfarbe setzen | |
| print(“Text”); println(“Text”); | Text schreiben | |
| setTextWrap(true/false); | false → Text fließt über den Rand des TFTs hinaus true → Text wird am Ende umgebrochen | Zeilenumbruch |
Benötigte Bibliotheken einbinden und Variablen definieren
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 | #include “WiFi.h” #include “time.h” #include “Adafruit_GFX.h” #include “Adafruit_ST7735.h” #include “Adafruit_BMP280.h” #include “DHT.h” // Schrftart einbinden #include “Fonts/FreeSans9pt7b.h” int SENSOR_DHT = 15; // Sensortyp festlegen // DHT11 // #define SensorTyp DHT11 // DHT22 #define SensorTyp DHT22 // Sensor einen Namen zuweisen DHT dht(SENSOR_DHT, SensorTyp); // Adafruit TFT, WaveShare TFT 1,8 Zoll #define TFT_CS 5 #define TFT_RST 4 #define TFT_DC 2 Adafruit_BMP280 bmp; Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // muss angepasst werden char Router[] = “Router_SSID”; char Passwort[] = “xxxxxxxx”; // statischeIP = false -> IP-Adresse über DHCP vergeben // statischeIP = true -> statische IP festlegen // ip und gateway müssen an das lokale Netz angepasst werden bool statischeIP = false; IPAddress ip(192, 168, 1, 200); IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 255, 0); /* öffentliche DNS-Server ———————————————– OpenDNS 208, 67, 222, 222 (USA) Google 8, 8, 8, 8 (USA) Cloudfare 1, 1, 1, 1 (USA) DNSWWatch 84.200.69.80 (Deutschland) Quad9 9, 9, 9, 9 (Schweiz) Neustar UltraDNS 56, 154, 70, 3 (USA, gefiltert) Deutsche Telekom 217, 5,100,185 ———————————————— oder die im Router eingetragene IP im Beispiel: 192, 168, 1, 20 */ IPAddress primaryDNS(192, 168, 1, 20); IPAddress secondaryDNS(9, 9, 9, 9); // NTP-Server aus dem Pool #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 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_wday -> Wochentag (0 = Sonntag, 6 = Samstag) 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; WiFiServer Server(80); WiFiClient Client; |
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 | void setup() { // Zeitzone: Parameter für die zu ermittelnde Zeit configTzTime(Zeitzone, Zeitserver); Serial.begin(9600); // auf serielle Verbindung warten while (!Serial); delay(1000); // WiFi starten WiFi.mode(WIFI_STA); WiFi.begin(Router, Passwort); Serial.println(“————————”); // statische IP vergeben if (statischeIP) { WiFi.config(ip, gateway, subnet, primaryDNS, secondaryDNS); Serial.print(“Verbunden mit ”); Serial.println(Router); // IP anzeigen Serial.print(“Statische IP: ”); Serial.println(ip); } // IP über DHCP ermitteln else { while (WiFi.status() != WL_CONNECTED) { delay(200); Serial.print(“.”); } Serial.println(); Serial.print(“Verbunden mit ”); Serial.println(Router); Serial.print(“IP über DHCP: ”); Serial.println(WiFi.localIP()); } // BMP280 starten bmp.begin(); // DHT starten dht.begin(); // schwarzer Hintergrund tft.initR(INITR_BLACKTAB); // Rotation anpassen tft.setRotation(1); } |
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 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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | void loop() { // aktuelle Zeit holen time(&aktuelleZeit); // localtime_r -> Zeit in die lokale Zeitzone setzen localtime_r(&aktuelleZeit, &Zeit); /* TFT-Parameter: Schriftart (muss im Kopf eingebunden werden) Cursor Spalte, Zeile setzen Textfarbe Bildschirm mit schwarz füllen */ tft.setFont(&FreeSans9pt7b); tft.setCursor(1, 13); tft.setTextColor(ST7735_GREEN); tft.fillScreen(ST7735_BLACK); Serial.println(“————————”); // es kann bis zu 60 Sekunden dauern // bis die Zeit ermittelt wird // Name des Wochentages 0–6 switch (Zeit.tm_wday) { case 0: Serial.print(“Sonntag”); tft.print(“Sonntag”); break; case 1: Serial.print(“Montag”); tft.print(“Montag”); break; case 2: Serial.print(“Dienstag”); tft.print(“Dienstag”); break; case 3: Serial.print(“Mittwoch”); break; tft.print(“Mittwoch”); case 4: Serial.print(“Donnerstag”); tft.print(“Donnerstag”); break; case 5: Serial.print(“Freitag”); tft.print(“Freitag”); break; case 6: Serial.print(“Samstag”); tft.print(“Samstag”); break; } Serial.print(“, ”); tft.setCursor(1, 33); // Datum if (Zeit.tm_mday < 10) { Serial.print(“0”); tft.print(“0”); } Serial.print(Zeit.tm_mday); tft.print(Zeit.tm_mday); Serial.print(“.”); tft.print(“.”); // Monat: führende 0 ergänzen if (Zeit.tm_mon < 9) { Serial.print(“0”); tft.print(“0”); } // Zählung beginnt mit 0 -> +1 Serial.print(Zeit.tm_mon + 1); Serial.print(“.”); tft.print(Zeit.tm_mon + 1); tft.print(“.”); // Anzahl Jahre seit 1900 Serial.print(Zeit.tm_year + 1900); Serial.print(“ ”); tft.print(Zeit.tm_year + 1900); tft.print(“ ”); tft.setCursor(1, 53); // Stunde: wenn Stunde < 10 -> 0 davor setzen if (Zeit.tm_hour < 10) { Serial.print(“0”); tft.print(“0”); } Serial.print(Zeit.tm_hour); Serial.print(“:”); tft.print(Zeit.tm_hour); tft.print(“:”); // Minuten if (Zeit.tm_min < 10) { Serial.print(“0”); tft.print(“0”); } Serial.print(Zeit.tm_min); Serial.print(“:”); tft.print(Zeit.tm_min); tft.print(“ Uhr”); // Sekunden (nur Serieller Monitor) if (Zeit.tm_sec < 10) Serial.print(“0”); Serial.print(Zeit.tm_sec); Serial.println(); Serial.println(“Tage seit dem 1.1. ” + String(Zeit.tm_yday)); // Normalzeit/Sommerzeit if(Zeit.tm_isdst > 0) Serial.println(“MESZ = Mitteleuropäische Sommerzeit”); else Serial.println(“MEZ = Mitteleuropäische Zeit”); // Temperatur BMP280 String Temperatur = String(bmp.readTemperature()); // alternativ: Temperatur DHT // String Temperatur = String(dht.readTemperature()); // . durch , ersetzen Temperatur.replace(“.”, “,”); /* BMP280 Luftdruck messen readPressure() liest in Pascal, Ausgabe in hPa (Hekto-Pascal) Ergebnis durch 100 teilen */ String Luftdruck = String(bmp.readPressure() / 100); Luftdruck.replace(“.”, “,”); // Luftfeuchtigkeit DHT lesen String Luftfeuchtigkeit = String(dht.readHumidity()); // . durch , ersetzen Luftfeuchtigkeit.replace(“.”, “,”); // Ausgabe Serieller Monitor Serial.println(“Temperatur: ” + Temperatur + “°C”); Serial.println(“Luftfeuchtigkeit: ” + Luftfeuchtigkeit + “%”); Serial.println(“Luftdruck: ” + Luftdruck + ” hPa”); // Ausgabe TFT tft.drawFastHLine(1, 57, tft.width(), ST7735_WHITE); tft.setCursor(1, 73); tft.print(Temperatur + ” Grad C”); tft.setCursor(1, 93); tft.print(Luftfeuchtigkeit + “%”); tft.setCursor(1, 113); tft.print(Luftdruck + ” hPa”); // Wartezeit bis zur nächsten Messung delay(5000); } |
letzte Aktualisierung:

