Das LilyGO TTGO T5-4.7 E-Paper ist ein integriertes Entwicklungsmodul, das ein 4,7-Zoll E-Paper (E-Ink) Display mit einem ESP32-S3 Mikrocontroller kombiniert.
Der E-Paper-Bildschirm des Boards arbeitet mit einer Auflösung von 540 × 960 Pixeln, unterstützt 16 Graustufen und benötigt nur während der Aktualisierung Strom, was den Energieverbrauch bei langsam wechselnden Daten wie Wetterdaten minimiert.
In diesem Tutorial lernst du, wie du mit dem LilyGO TTGO T5-4.7 E-Paper Board startest. Außerdem bauen wir eine Wetterstation, die ihre Daten über das Internet von OpenWeatherMap abruft und auf dem E-Paper anzeigt.
Benötigte Teile
Das LilyGO TTGO T5-4.7 E-Paper kannst du über DFRobot oder Amazon über die untenstehenden Links beziehen. Wenn du das Display mit Batteriestrom betreiben möchtest, benötigst du außerdem eine Batterie.
Ich empfehle eine 18650-Akkuzelle mit passendem Batteriehalter. Allerdings musst du die Kabel des Batteriehalters an den Batterieanschluss des LilyGO E-Paper Displays löten. Das ist nicht schwer, erfordert aber einen Lötkolben.

LilyGO TTGO T5-4.7 E-Paper

18650 Akku

18650 Batteriehalter
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Hardware des LilyGO TTGO T5-4.7 E-Paper
Die LilyGO TTGO T5-4.7 E-Paper Plattform ist ein 4,7-Zoll E-Ink Display-Controller-Board, das ein ESP32-S3 Modul mit einem angeschlossenen Graustufen-E-Paper-Panel integriert.
Das Design richtet sich an Anwendungen, die von dauerhaft sichtbaren Informationen auf dem Bildschirm und niedrigem durchschnittlichen Stromverbrauch profitieren, da der Displayinhalt ohne kontinuierliche Aktualisierung sichtbar bleibt. Das Foto unten zeigt Vorder- und Rückseite des LilyGO TTGO T5-4.7 E-Paper Boards.

Prozessor- und Speichersubsystem
Das Board basiert auf dem ESP32-S3-WROOM-1-N16R18 Modul. Diese Konfiguration bietet 16 MB Onboard-Flash für Firmware und Assets sowie 8 MB PSRAM zur Unterstützung speicherintensiver Operationen wie Grafikpuffer, Schriftarten-Rendering und Netzwerkdatenverarbeitung.
Der ESP32-S3 ermöglicht zudem Wi-Fi-Konnektivität und ausreichend Rechenleistung für periodische Datenerfassung, lokale Verarbeitung und Display-Updates, wie sie bei Wetterstationen üblich sind.
E-Paper Display Eigenschaften
Das integrierte E-Paper-Panel hat eine Auflösung von 540 × 960 Pixeln im Hochformat und unterstützt 16 Graustufen. Das Display erlaubt partielle Aktualisierungen, bei denen nur bestimmte Bereiche erneuert werden, um die Aktualisierungszeit und den Energieverbrauch zu reduzieren, wenn sich nur ein Teil des Bildschirms ändert.
Das Display darf jedoch nicht über längere Zeit partiell aktualisiert werden, da sonst irreversible Nachbilder zurückbleiben!
Benutzereingabe und On-Board Steuerungen
Physische Eingaben werden über drei Tasten unterstützt, darunter eine benutzerdefinierbare Taste für anwendungsspezifische Funktionen. Die anderen Tasten sind Reset und Boot.

Das Board bietet außerdem eine dedizierte 6-Pin-Schnittstelle zum Anschluss eines Touchscreen-Panels, das separat erworben werden kann.
Batteriestrom-Schnittstelle
Für den Batteriebetrieb verfügt das Board über einen PH 2.0 Anschluss, der für eine 3,7 V Batterie ausgelegt ist. Der Schutz vor Überladung und Tiefentladung wird durch einen HX6610S Schutz-IC gewährleistet.

Erweiterungsheader und Host-Kompatibilität
Oben am Board befindet sich ein 40-Pin Header, der mit der Raspberry Pi BUS-Schnittstelle kompatibel ist. Hier ist die Pinbelegung des Headers:

Beachte, dass die I2C (SDA, SCL) und SPI (MISO, MOSI, CS) Schnittstellen dort zugänglich sind. Das Bild unten zeigt die Pinbelegung der anderen Anschlüsse des Boards:

GPIO
Die folgende Tabelle listet die GPIO-Pins und deren interne Nutzung durch den eingebauten ESP32 auf. Nur die GPIO-Pins 45, 10, 48 und 39 stehen für Benutzeranwendungen zur Verfügung.
| ESP32S3 GPIO | Verbunden mit | Frei |
|---|---|---|
| 13 | 74HCT4094D CFG_DATA | ❌ |
| 12 | 74HCT4094D CFG_CLK | ❌ |
| 0 | 74HCT4094D CFG_STR | ❌ |
| 38 | E-paper CKV | ❌ |
| 40 | E-paper STH | ❌ |
| 41 | E-paper CKH | ❌ |
| 8 | E-paper D0 | ❌ |
| 1 | E-paper D1 | ❌ |
| 2 | E-paper D2 | ❌ |
| 3 | E-paper D3 | ❌ |
| 4 | E-paper D4 | ❌ |
| 5 | E-paper D5 | ❌ |
| 6 | E-paper D6 | ❌ |
| 7 | E-paper D7 | ❌ |
| 21 | Taste | ❌ |
| 14 | Batterie ADC | ❌ |
| 16 | SD MISO | ❌* |
| 15 | SD MOSI | ❌* |
| 11 | SD SCK | ❌* |
| 42 | SD CS | ❌* |
| 18 | SDA | ❌ |
| 17 | SCL | ❌ |
| 47 | TouchPanel IRQ | ❌ |
| 45 | Nicht verbunden | ✅ |
| 10 | Nicht verbunden | ✅ |
| 48 | Nicht verbunden | ✅ |
| 39 | Nicht verbunden | ✅ |
Technische Spezifikation
Die folgende Tabelle fasst die technischen Spezifikationen der Wetterstation mit LilyGO TTGO T5-4.7 E-Paper zusammen:
| MCU | ESP32-S3-WROOM-1-N16R8 |
| Drahtlose Konnektivität | Wi-Fi Bluetooth V5.0 |
| Flash | 16MB |
| PSRAM | 8MB |
| Unterstützt PCF8563 RTC | Batteriekapazitätserkennung |
| Treiber-IC | EDO47TC1 |
| Größe | 4,7 Zoll |
| Graustufen | 16 |
| Auflösung | 540 x 960 Pixel |
| Deep-Sleep Strom | ~170µA |
Die Schaltpläne für das Display-Board sind im github repo.
Versionen
Beachte, dass es mindestens drei verschiedene Versionen des LilyGO TTGO T5-4.7 E-Paper gibt. Es gibt eine frühe Version mit fünf Tasten und einem Halter für eine 18650 Batterie. Siehe das Foto unten:

Ich besitze diese Version nicht und kann daher nicht sagen, ob die Codebeispiele in diesem Tutorial für dieses Board funktionieren.
Ich habe jedoch die Boards der zwei neueren Versionen V2.3 vom 10.06.2021 und V2.4 vom 03.12.2024. Ich habe den Code für beide Boards getestet und er funktioniert. Beachte, dass diese Boards drei Tasten haben und keinen Batteriehalter. Das Foto unten zeigt die beiden Boards mit den sichtbaren Versionsnummern auf der Rückseite:

Installation des ESP32 Cores
Das LilyGO TTGO T5-4.7 verwendet einen ESP32 und wir müssen eine spezifische Version (2.017) des ESP32 Cores installieren. Öffne zunächst den Preferences-Dialog über „Preferences…“ im „File“-Menü. Es öffnet sich der unten gezeigte Preferences-Dialog.
Unter dem Reiter Settings findest du unten im Dialog ein Eingabefeld mit der Bezeichnung „Additional boards manager URLs“:

In dieses Eingabefeld kopiere die folgende URL:
https://espressif.github.io/arduino-esp32/package_esp32_dev_index.json
Damit weiß die Arduino IDE, wo sie die ESP32 Core Bibliotheken findet. Als nächstes installieren wir die ESP32 Boards über den Boards Manager.
Öffne den Boards Manager über „Tools -> Boards -> Board Manager“. Der Boards Manager erscheint in der linken Seitenleiste. Gib „ESP32“ in das Suchfeld oben ein und du solltest zwei Arten von ESP32 Boards sehen: die „Arduino ESP32 Boards“ und die „esp32 von Espressif“ Boards. Wir wollen die „esp32 libraries von Espressif“.
Wähle im Dropdown-Menü für esp32 die Version 2.0.17 und drücke dann den INSTALL Button. Nach erfolgreicher Installation solltest du das folgende Bild sehen:

Andere (ältere) Versionen des ESP32 Cores funktionieren wahrscheinlich auch, ich habe das aber nicht getestet. Neuere Versionen 3.x funktionieren derzeit nicht.
Installation der Bibliotheken
Als nächstes müssen wir spezifische Bibliotheken und Versionen installieren. Klicke zuerst auf diesen EPD47 Library Bibliothekslink und lade die Datei „EPD47-master.zip“ herunter.
Entpacke die ZIP-Datei, um deren Inhalt zu extrahieren. Du solltest die folgenden Dateien in einem entpackten Ordner namens „EPD47-master“ sehen:

Wir müssen den Ordner „EPD47-master“ in den „libraries“-Ordner der Arduino IDE kopieren. Unter Windows befindet sich der „libraries“-Ordner typischerweise unter:
C:\Users\<username>\OneDrive\Documents\Arduino\libraries
Da dieser Ordner bereits installierte Bibliotheken enthält, empfehle ich, ihn vorübergehend umzubenennen, z.B. in „_libraries“, und einen neuen Ordner namens „libraries“ anzulegen. So vermeidest du Konflikte mit bereits installierten Bibliotheken und verlierst sie nicht. Später kannst du die Änderung leicht rückgängig machen. Das Bild unten zeigt, wie dein „Arduino“-Ordner mit den Bibliotheken aussehen sollte:

Kopiere nun den Ordner „EPD47-master“ in den neuen „libraries“-Ordner, wie unten gezeigt:

Zuletzt müssen wir Version 6.19.0 der Arduinojson Bibliothek von Benoit Blanchon installieren. Öffne den LIBRARY MANAGER, gib „arduinojson“ in die Suchleiste ein und installiere die Bibliothek. Nach erfolgreicher Installation solltest du das folgende Bild sehen:

Wenn du dann erneut im libraries-Ordner nachsiehst, findest du jetzt die EPD47-master Bibliothek und die ArduinoJson Bibliothek:

ESP32-S3 Board und Einstellungen
Das LilyGO TTGO T5-4.7 E-Paper verwendet einen ESP32-S3, daher wählen wir das Board „ESP32S3 Dev Module“. Klicke dazu auf das Dropdown-Menü und dann auf „Select other board and port…“:

Es öffnet sich ein Dialog, in dem du „esp32s3 dev“ in die Suchleiste eingibst. Du siehst das Board „ESP32S3 Dev Module“ unter Boards. Klicke darauf, wähle den COM-Port aus, um es zu aktivieren, und bestätige mit OK:

Beachte, dass du das Board per USB-Kabel mit deinem Computer verbinden musst, bevor du einen COM-Port auswählen kannst.
Tool-Einstellungen
Bevor du das Board programmieren kannst, musst du die Einstellungen anpassen. Gehe zu „Tools“ und wähle die unten gezeigten Einstellungen:

Wichtig sind „USB CDC On Boot: Enable“, um die serielle Kommunikation mit dem Board zu erlauben, „Flash Size : 16MB(128Mb)“, „Partition Scheme: 16M Flash(3M APP/9.9MB FATFS)“ und „PSRAM: OPI PSRAM“ zur Speicher-Konfiguration. Die anderen Standardeinstellungen können so bleiben.
Upload
Normalerweise kannst du jetzt einfach Code über die Arduino IDE hochladen, und das Board wechselt automatisch in den Upload-Modus. Wenn das Board jedoch im Deep-Sleep ist oder in einer Crash-Schleife steckt, kannst du folgende Sequenz verwenden, um es in den Upload-Modus zu zwingen:
- Halte die BOOT(IO0) Taste gedrückt
- Während du die BOOT(IO0) Taste gedrückt hältst, drücke RST
- Lasse RST los
- Lasse die BOOT(IO0) Taste los

Codebeispiel: Taste
Im ersten Codebeispiel prüfen wir nur, ob wir das Board programmieren können, eine Tasteneingabe erkennen und die serielle Kommunikation funktioniert:
#define BTN 21
void setup() {
Serial.begin(112500);
pinMode(BTN, INPUT);
Serial.println("running...");
}
void loop() {
if (!digitalRead(BTN)) {
Serial.println("pressed");
delay(100);
}
}
Wir beginnen damit, den GPIO-Pin 21 für die Taste SENSOP_VN auf dem Board zu definieren.
#define BTN 21
Dies ist die einzige Taste, die wir für Benutzereingaben verwenden können. Es ist die Taste neben dem SD-Karten-Slot:

Im setup-Funktion initialisieren wir die serielle Kommunikation, deklarieren den Tasten-Pin als Eingang und geben „running…“ im seriellen Monitor aus. Die Taste ist intern mit einem Pullup-Widerstand verbunden, daher müssen wir beim Setzen des Pin-Modus keine Pullups aktivieren.
void setup() {
Serial.begin(112500);
pinMode(BTN, INPUT);
Serial.println("running...");
}
In der loop-Funktion lesen wir den aktuellen Status der Taste aus. Wenn der Rückgabewert false ist, wissen wir, dass die Taste gedrückt ist, und geben „pressed“ im seriellen Monitor aus.
void loop() {
if (!digitalRead(BTN)) {
Serial.println("pressed");
delay(100);
}
}
Du solltest diesen Code zuerst ausprobieren, um sicherzugehen, dass du das Board programmieren kannst und die serielle Ausgabe siehst. Falls Probleme auftreten, überprüfe die Tool-Einstellungen.
Codebeispiel: Display
Das zweite Codebeispiel zeigt, wie du das E-Paper Display steuerst. Wir zeichnen einen Kreis und geben den Text „Makerguides“ auf dem Display aus:

Schau dir zuerst den kompletten Code an, bevor wir ins Detail gehen:
#include "epd_driver.h"
#include "firasans.h"
uint8_t *framebuffer = NULL;
void create_framebuffer() {
size_t framesize = EPD_WIDTH * EPD_HEIGHT / 2;
framebuffer = (uint8_t *)ps_calloc(sizeof(uint8_t), framesize);
if (!framebuffer) {
Serial.println("alloc memory failed !!!");
return;
}
memset(framebuffer, 0xFF, framesize);
}
void init_display() {
create_framebuffer();
epd_init();
epd_poweron();
epd_clear();
}
void setup() {
Serial.begin(115200);
delay(1000);
init_display();
epd_draw_circle(EPD_WIDTH / 2, EPD_HEIGHT / 2, 150, 0, framebuffer);
const char *text= "Makerguides";
int cursor_x = 355;
int cursor_y = 270;
writeln((GFXfont *)&FiraSans, text, &cursor_x, &cursor_y, framebuffer);
epd_draw_grayscale_image(epd_full_screen(), framebuffer);
epd_poweroff_all();
}
void loop() {
}
Includes
Wir beginnen mit dem Einbinden zweier Header-Dateien, die die Display-Treiber-API und eine Schriftartdefinition bereitstellen. „epd_driver.h“ stellt Funktionen wie Initialisierung, Stromversorgung, Zeichenprimitive und das Übertragen eines Pixelpuffers auf das Panel bereit, während „firasans.h“ die Glyphendaten für die Textrendering-Routine liefert.
#include "epd_driver.h" #include "firasans.h"
Globaler Zustand
Als nächstes erstellen wir einen globalen Zeiger namens framebuffer, der die Adresse eines dynamisch allozierten Pixelpuffers im Speicher speichert. Die Display-Treiberfunktionen zeichnen in diesem Sketch zuerst in diesen Puffer, und erst später wird der gesamte Puffer an das E-Paper Panel gesendet.
uint8_t *framebuffer = NULL;
create_framebuffer
Die create_framebuffer()-Funktion ist verantwortlich für die RAM-Allokation für das Graustufenbild, das angezeigt wird. Die zentrale Idee ist, dass das E-Paper Panel eine gepackte Darstellung erwartet, und der Ausdruck EPD_WIDTH * EPD_HEIGHT / 2 zeigt, wie viele Bytes benötigt werden, wenn jeder Pixel 4 Bits (ein halbes Byte) verwendet. Bei 4-Bit Graustufen können zwei Pixel pro Byte gespeichert werden, daher wird die Gesamtpixelanzahl durch zwei geteilt.
Nach der Berechnung der Größe verwendet die Funktion ps_calloc, um den Speicher zu reservieren und zu nullen. Auf ESP32-Klassen-Zielen wird dieser Allokator typischerweise verwendet, um große Puffer in PSRAM zu platzieren, wenn verfügbar, was wichtig ist, da ein voller Graustufen-Puffer zu groß für den internen RAM sein kann. Wenn die Allokation fehlschlägt, gibt die Funktion eine Diagnosemeldung auf der seriellen Konsole aus und bricht ab.
Abschließend wird der Puffer mit 0xFF gefüllt. In vielen E-Paper Framebuffer-Formaten entspricht 0xFF „weiß“ oder dem hellsten Graustufenwert im gesamten Puffer, sodass dieser Schritt effektiv eine saubere weiße Leinwand vor dem Zeichnen erzeugt.
void create_framebuffer() {
size_t framesize = EPD_WIDTH * EPD_HEIGHT / 2;
framebuffer = (uint8_t *)ps_calloc(sizeof(uint8_t), framesize);
if (!framebuffer) {
Serial.println("alloc memory failed !!!");
return;
}
memset(framebuffer, 0xFF, framesize);
}
init_display
Die init_display()-Funktion zentralisiert die Initialisierungssequenz für die E-Paper-Hardware und stellt sicher, dass der Framebuffer existiert, bevor Zeichenfunktionen aufgerufen werden. Sie ruft zuerst create_framebuffer() auf, damit spätere Zeichenfunktionen ein gültiges Ziel haben.
Der Aufruf von epd_init() initialisiert typischerweise den Display-Controller, konfiguriert GPIO/SPI und bereitet den internen Treiberstatus vor.epd_poweron() aktiviert die Panel-Stromversorgungen und versetzt die Hardware in einen betriebsbereiten Zustand. Und epd_clear() löscht das Panel, was bei E-Paper wichtig ist, da alte Inhalte sonst bestehen bleiben können.
void init_display() {
create_framebuffer();
epd_init();
epd_poweron();
epd_clear();
}
setup
Die setup()-Funktion läuft einmal beim Start und führt alle Arbeiten in diesem Sketch aus, weshalb loop() leer ist. Wir starten mit der Initialisierung der seriellen Schnittstelle mit 115200 Baud für Debug-Ausgaben. Dann warten wir kurz, um eine stabile serielle Verbindung sicherzustellen. Danach rufen wir init_display() auf, um den Framebuffer zu reservieren, das Panel einzuschalten und zu löschen.
void setup() {
Serial.begin(115200);
delay(1000);
init_display();
Nach der Initialisierung zeichnen wir einen Kreis in den Framebuffer. Der Kreis ist zentriert auf dem Bildschirm, indem die halbe Displaybreite und -höhe verwendet wird. Der Radius ist 150, und der Farbwert 0 wird als Graustufenlevel übergeben. In typischen 4-Bit Graustufen-Konventionen vieler E-Paper Treiber entsprechen niedrigere Werte oft dunkleren Pixeln, daher wird 0 üblicherweise für Schwarz verwendet. Das letzte Argument ist framebuffer, was explizit macht, dass die Zeichenoperation den Speicherpuffer ändert und nicht sofort das Display aktualisiert.
epd_draw_circle(EPD_WIDTH / 2, EPD_HEIGHT / 2, 150, 0, framebuffer);
Als nächstes bereiten wir einen C-String vor, der gerendert wird, und setzen die Cursor-Koordinaten. Der Aufruf von writeln() zeichnet den String mit der FiraSans Schriftart in den Framebuffer an der angegebenen Startposition.
const char *text= "Makerguides"; int cursor_x = 355; int cursor_y = 270; writeln((GFXfont *)&FiraSans, text, &cursor_x, &cursor_y, framebuffer);
Sobald der Kreis und der Text im RAM gezeichnet sind, führt der Sketch das eigentliche Bildschirm-Update durch. Der Aufruf von epd_draw_grayscale_image() überträgt den Puffer auf das Display. Das erste Argument, epd_full_screen(), gibt an, dass die Aktualisierungsregion das gesamte Display ist und kein Teilbereich, was zur Vorbereitung eines Vollbild-Puffers passt. Schließlich schaltet epd_poweroff_all() die E-Paper-Stromversorgung ab, da das E-Paper das Bild nach der Aktualisierung auch ohne Strom halten kann.
epd_draw_grayscale_image(epd_full_screen(), framebuffer); epd_poweroff_all(); }
loop
Die loop()-Funktion ist leer, da der Sketch als Einmal-Render konzipiert ist. Das Gerät initialisiert, zeichnet in den Puffer, aktualisiert das Display einmal, schaltet das Panel aus und macht dann nichts weiter. Dieses Muster ist typisch für batteriebetriebene E-Paper-Projekte, die aufwachen, Inhalte aktualisieren und wieder in den Deep-Sleep-Modus gehen.
Weitere Beispiele
Für weitere Beispiele, z.B. wie man Linien, Rechtecke und Graustufenbilder zeichnet, siehe den Ordner unter Xinyuan-LilyGO/LilyGo-EPD47/tree/esp32s3/examples.
Codebeispiel: Wetterstation
Im letzten Beispiel lernst du, wie du eine Wetterstation auf dem LilyGO TTGO T5-4.7 E-Paper betreibst. Die Wetterdaten werden über das Internet vom OpenWeatherMap Dienst empfangen, der kostenlos ist, aber eine Anmeldung erfordert – mehr dazu später.
Der Originalcode, den ich hier verwende, stammt von David Bird aus 2021, und verschiedene Versionen dieses Codes sind z.B. bei Xinyuan-LilyGO/LilyGo-EPD47/tree/esp32s3, Xinyuan-LilyGO/LilyGo-EPD-4-7-OWM-Weather-Display und DzikuVx/LilyGo-EPD-4-7-OWM-Weather-Display zu finden. Allerdings funktionierten diese Beispiele auf meinem LilyGO TTGO T5-4.7 E-Paper nicht gut, weshalb ich einige Änderungen vorgenommen habe.
Änderungen
Zuerst habe ich einige Layout-Probleme bei der Anzeige der Wetterdaten behoben. Wenn du dir die folgende Anzeige des Originalcodes ansiehst, erkennst du, dass die Temperaturtexte nicht gut ausgerichtet sind:

Ich habe die Textelemente etwas verschoben, um das Layout zu verbessern:

Außerdem habe ich das Mondbild sowie die Symbole für Sonnenuntergang und Sonnenaufgang vom DzikuVx/LilyGo-EPD-4-7-OWM-Weather-Display in den Xinyuan-LilyGO/LilyGo-EPD-4-7-OWM-Weather-Display Code integriert.
Batterieladung
Dann fiel mir auf, dass das Display nicht funktioniert und das Batteriesymbol nicht angezeigt wird, wenn es mit Batterie betrieben wird. Das liegt daran, dass 1) der Originalcode blockiert, bis die serielle Kommunikation aufgebaut ist, was ohne USB-Verbindung zum Computer nicht passiert:
Serial.begin(115200);
while (!Serial) ;
Der while (!Serial) Code muss entfernt und durch eine kurze Verzögerung ersetzt werden, z.B. delay(1000).
2) Der Originalcode liest die Batteriespannung am Pin 36 aus, aber bei meinen Displays wird die Batteriespannung am Pin 14 gemessen:
float voltage = analogRead(14) / 4096.0 * 6.566 * (vref / 1000.0);
Mit diesen Änderungen kannst du dein LilyGO TTGO T5-4.7 E-Paper mit Batterie betreiben, und das Batteriesymbol zeigt den Ladestand an.
Standort der Stadt
Der Originalcode verwendet den Namen einer Stadt, um die Wetterinformationen für diesen Ort abzurufen. Der OpenWeatherMap-Dienst erlaubt jedoch auch, aktuelle Wetterdaten für einen Ort anhand von Breiten- und Längengrad abzurufen:
https://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={API key}
Das ist potenziell genauer und du musst nicht den spezifischen Stadtnamen verwenden, den OpenWeatherMap erkennt. Die Breiten- und Längengrade deines Standorts findest du einfach, indem du in Google Maps mit der rechten Maustaste klickst. Ein Popup zeigt oben die Koordinaten an. Siehe den folgenden Screenshot:

USB-Verbindung
Schließlich aktualisiert der Originalcode die Wetterdaten auf dem Display einmal pro Stunde und geht zwischen den Updates in den Deep-Sleep-Modus, um Batterie zu sparen. Das ist super, erschwert aber Codeänderungen, da die USB-Verbindung im Deep-Sleep verloren geht und du das Board nicht flashen kannst.
Du musst das Board zurücksetzen und den Zeitpunkt so wählen, dass das Flashen startet, während die USB-Verbindung direkt nach dem Reset noch aktiv ist. Siehe den Upload-Abschnitt oben. Da das schwierig ist, habe ich Code hinzugefügt, der verhindert, dass der Deep-Sleep-Modus aktiviert wird, wenn die benutzerprogrammierbare Taste SENSOP_VN gedrückt wird:
if(digitalRead(21)) { // SENSOP_VN button NOT pressed
BeginSleep();
}
Das bedeutet, wenn du neuen Code flashen willst, halte einfach SENSOP_VN während des Flashens gedrückt. Das Board geht nach dem Reset nicht in den Deep-Sleep und die USB-Verbindung bleibt aktiv. Nach dem Flashen kannst du einfach erneut RST drücken, um das Board mit aktiviertem Deep-Sleep neu zu starten.
OpenWeatherMap
Der Code verwendet den kostenlosen OpenWeatherMap Dienst, um Wetterdaten aus dem Internet zu empfangen. Bevor du jedoch eine der OpenWeather APIs nutzen kannst, benötigst du einen API-Schlüssel, wofür du ein Konto anlegen musst. Um ein kostenloses Konto zu erstellen, gehe auf die sign-up page und gib dort deine Daten ein.

Danach gehe zur api-key-Erstellungsseite und generiere einen API-Schlüssel. Der API-Schlüssel ist die lange Zeichenkette „sdfd87fakeby6apikeysf4z“, die du im Screenshot unten siehst. Dein Schlüssel wird anders aussehen.

Sobald du deinen API-Schlüssel (und die Breiten- und Längengrade deines Standorts) hast, kannst du ihn im Browser testen. Gib die folgende URL mit deinem API-Schlüssel in den Browser ein:
https://api.openweathermap.org/data/2.5/weather?lat=44.34&lon=10.99&appid={API key}
Beachte, dass der Chrome-Browser eine Pretty Print-Schaltfläche hat, mit der du die abgerufenen Wetterdaten als schön formatiertes JSON anzeigen lassen kannst:

So kannst du deinen API-Schlüssel und deine Koordinaten testen. Wenn du weitere Hilfe brauchst, schau dir unser Tutorial an: Simple ESP32 Internet Weather Station.
Code herunterladen und Parameter setzen
Nachdem du deinen API-Schlüssel überprüft hast, kannst du den Code für die Wetterstation als ZIP-Datei herunterladen: weather_lilygo_t5_epd.zip . Entpacke die Datei und öffne die Datei „weather_lilygo_t5_epd.ino“ im Ordner „weather_lilygo_t5_epd“ in deiner Arduino IDE.
Als letzten Schritt musst du die WLAN-Zugangsdaten und Wetterdaten-Parameter einstellen. Klicke auf den Tab „owm_credentials.h“ und trage deine SSID, Passwort, API-Schlüssel und Standortinformationen ein:

Je nach Standort möchtest du vielleicht auch die Parameter Sprache, Hemisphäre, Einheiten und Zeitzone anpassen.
Es gibt auch Beispielcode, wie man die Wetterstation über eine Weboberfläche konfiguriert: Xinyuan-LilyGO/LilyGo-EPD-4-7-OWM-Weather-Display/tree/web, falls du das der Hardcodierung vorziehst.
Nachdem du die Einstellungen angepasst hast, lade den Code auf dein LilyGO TTGO T5-4.7 Board und nach kurzem Flackern sollten die Wetterdaten auf dem Display erscheinen:

Anschluss der 18650 Batterie
Das LilyGO TTGO T5-4.7 E-Paper Board verfügt über einen Anschluss und eine Ladeschaltung für eine externe LiPo-Batterie. Ich habe eine 18650-Akkuzelle angeschlossen. Du kannst auch eine kleinere (flache) LiPo-Batterie verwenden, aber diese sind meist teurer oder haben weniger Kapazität. Das Foto unten zeigt, wie du die 18650 Batterie anschließt:

Laufzeit
Eine typische 18650 Batterie hat eine Kapazität von 2300 bis 3600mAh, und der Spitzenstrom, den der ESP32 beim Wi-Fi Betrieb zieht, kann bis zu 400mA betragen. Der Deep-Sleep-Strom des LilyGO TTGO T5-4.7 Boards liegt offenbar bei etwa 170µA, ich habe ihn aber nicht gemessen.
Wenn wir eine 18650 mit 3300mAh verwenden und das Wi-Fi einmal pro Stunde für eine Sekunde aktivieren, um die Wetterdaten herunterzuladen, erhalten wir eine geschätzte Laufzeit von über einem Jahr mit einer einzigen Ladung.
Hier die Berechnung: Mit einem durchschnittlichen Strom von 400mA × 1s / 3600s = 0,111mA für Wi-Fi und einem Deep-Sleep-Strom von 0,17mA ergibt sich ein Gesamtstrom von 0,111mA + 0,17mA = 0,281mA. Bei einer 3300mAh Batterie ergibt sich eine geschätzte Laufzeit von 3300mAh / 0,281mA ≈ 11744h ≈ 1,34 Jahre.
Fazit
In diesem Tutorial hast du gelernt, wie man eine Wetterstation mit dem LilyGO TTGO T5-4.7 E-Paper Display baut. Für weitere Informationen zum LilyGO TTGO T5 schau dir Wiki und die Codebeispiele bei Xinyuan-LilyGO/LilyGo-EPD47/tree/esp32s3/examples an.
Die Dokumentation weist darauf hin, dass der Bildschirm nicht über längere Zeit partiell aktualisiert werden sollte, da sonst irreversible Nachbilder entstehen. Sei also vorsichtig bei Anwendungen, die Partial Refresh verwenden.
Für weitere Beispiele zu E-Paper Displays schau dir unsere Weather Station on e-Paper Display, Simple ESP32 Internet Weather Station, Temperature Plotter on e-Paper Display, Monthly Calendar on E-Paper Display und die Digital Clock on e-Paper Display Tutorials an.
Wenn du Fragen hast, kannst du sie gerne im Kommentarbereich stellen.
Viel Spaß beim Tüfteln 😉

