Der folgende Beitrag wurde uns von dem Gastautor Niklas Heinzel zur Verfügung gestellt.
Nach einiger Zeit war es nun mal wieder soweit: Ein neues Projekt stand an und die Wahl fiel auf ein Projekt, welches am Ende eine fertige Wetterstation mit WLAN-Anbindung werden sollte.
In Foren, YouTube-Videos oder Blogs wie diesen hier, entschied man sich zumeist für eine Variante aus TFT-Display (touch/non-touch), OLED-Display, Monochrom-Display oder anderen populären Displaytechnologien.
In diesem Projekt soll es aber vielmehr um den Einsatz eines E-Paper-Displays gehen. Genauer gesagt das 4.2“ 400×300 ePaper Display Modul mit SPI Interface von Waveshare in Kombination mit dem ESP32 aus dem AZ-Delivery Shop.
Zunächst machte ich mich natürlich an die Verkabelung der beiden Komponenten, sehr komfortabel, wenn man keine weitere Peripherie anschließen muss, wie Sensoren, Spannungswandler usw.
Hierzu einmal das Verbindungsdiagram, welches bei allen Displaygrößen gleich bleibt durch die standardisierte SPI-Kommunikation:
Quellcode
Nachdem alle Verbindungen erfolgreich hergestellt sind (Beim Verlöten der Jumper-Kabel mit dem Display nicht wundern, dies kann etwas Zeit in Anspruch nehmen, da das Display auf der Rückseite eine Kupferschicht hat, welche die Wärme des Lötkolbens sehr gut ableitet und den Kolben kühlt), können wir uns nun an die Programmierung des ESP32 machen.
Hierzu benutze ich die hervorragende Bibliothek namens „ESP32-e-Paper-Weather-Display“ von David Bird, einem hervorragenden Maker aus Großbritannien. Er hat mir dabei geholfen die Bibliothek anzupassen, wodurch es nun möglich ist, alles angepasst auf die DACH-Region korrekt anzeigen zu lassen. Am Ende des Blogs werde ich hierzu den Code und die Ergänzungsdateien zum “Main-Code“ als Download bereitstellen.
Hier ein Link zu seinem Github-Repository:
https://github.com/G6EJD/ESP32-e-Paper-Weather-Display
Dabei ist es nur noch nötig wenige Zeilen Code anzupassen für den individuellen Einsatzzweck/Standort. Diese gehen wir nun im Folgenden durch:
Zunächst schauen wir uns die owm_credentials.h Datei an.
// Change to your WiFi credentials const char* ssid = "WLAN-SSID"; const char* password = "WLAN-PASSWORT"; // Use your own API key by signing up for a free developer account at https://openweathermap.org/ String apikey = "hier den API-KEY eintragen!"; // See: https://openweathermap.org/ const char server[] = "api.openweathermap.org"; //http://api.openweathermap.org/data/2.5/forecast?q=Melksham,UK&APPID=your_OWM_API_key&mode=json&units=metric&cnt=40 //http://api.openweathermap.org/data/2.5/weather?q=Melksham,UK&APPID=your_OWM_API_key&mode=json&units=metric&cnt=1 //Set your location according to OWM locations String City = "NAME DES HEIMATORTES"; // Your home city See: http://bulk.openweathermap.org/sample/ String Country = "DE"; // Your _ISO-3166-1_two-letter_country_code country code, on OWM find your nearest city and the country code is displayed // https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes String Language = "DE"; // NOTE: Only the weather description is translated by OWM // Examples: Arabic (AR) Czech (CZ) English (EN) Greek (EL) Persian(Farsi) (FA) Galician (GL) Hungarian (HU) Japanese (JA) // Korean (KR) Latvian (LA) Lithuanian (LT) Macedonian (MK) Slovak (SK) Slovenian (SL) Vietnamese (VI) String Hemisphere = "north"; // or "south" String Units = "M"; // Use 'M' for Metric or I for Imperial const char* Timezone = "CET-1CEST,M3.5.0,M10.5.0/3"; // Choose your time zone from: https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv // See below for examples const char* ntpServer = "0.europe.pool.ntp.org"; // Or, choose a time server close to you, but in most cases it's best to use pool.ntp.org to find an NTP server // then the NTP system decides e.g. 0.pool.ntp.org, 1.pool.ntp.org as the NTP syem tries to find the closest available servers // EU "0.europe.pool.ntp.org" // US "0.north-america.pool.ntp.org" // See: https://www.ntppool.org/en/ int gmtOffset_sec = 0; // UK normal time is GMT, so GMT Offset is 0, for US (-5Hrs) is typically -18000, AU is typically (+8hrs) 28800 int daylightOffset_sec = 3600; // In the UK DST is +1hr or 3600-secs, other countries may use 2hrs 7200 or 30-mins 1800 or 5.5hrs 19800 Ahead of GMT use + offset behind - offset // Example time zones //const char* Timezone = "MET-1METDST,M3.5.0/01,M10.5.0/02"; // Most of Europe //const char* Timezone = "CET-1CEST,M3.5.0,M10.5.0/3"; // Central Europe //const char* Timezone = "EST-2METDST,M3.5.0/01,M10.5.0/02"; // Most of Europe //const char* Timezone = "EST5EDT,M3.2.0,M11.1.0"; // EST USA //const char* Timezone = "CST6CDT,M3.2.0,M11.1.0"; // CST USA //const char* Timezone = "MST7MDT,M4.1.0,M10.5.0"; // MST USA //const char* Timezone = "NZST-12NZDT,M9.5.0,M4.1.0/3"; // Auckland //const char* Timezone = "EET-2EEST,M3.5.5/0,M10.5.5/0"; // Asia //const char* Timezone = "ACST-9:30ACDT,M10.1.0,M4.1.0/3": // Australia
Durch diese ausgelagerten Zeilen Code lassen sich fast alle Einstellungen, die für den erfolgreichen Betrieb von Nöten sind. Alle wichtigen Parameter habe ich voreingestellt. Die gelb hinterlegten Spezifizierungen müssen von Ihnen getroffen werden. Zunächst müssen die WLAN SSID und das Passwort eingetragen werden. Danach den API Key Ihres http://www.openweathermap.org Accounts eingeben, wodurch Sie berechtigt sind, Wetterdaten abzurufen über die frei zugängliche API. Anschließend gilt es nur noch den Namen Ihrer Stadt/Ihres Ortes zu definieren und in Großbuchstaben einzutragen.
Mithilfe dieser ausgelagerten Informationen ist es dem ESP32 nun möglich, über Ihr WLAN auf die API von OpenWeatherMap zuzugreifen und so die benötigten Wetterdaten zu erlangen.
Wenden wir uns nun dem Arduino-Code zu, bei dem in den meisten Fällen kaum Änderungen nötig sein werden. Der Code benötigt neben den vorinstallierten Libraries und den eingebundenen Dateien owm_credentials.h und lang_gr.h (von mir angepasste Sprachenbibliothek) nur die Libraries U8g2_for_Adafruit_GFX, Adafruit_GFX und GxEPD2, die Sie über die Bibliotheksverwaltung installieren können.
(Bitte beachten, dass je nach Version unterschiedliche Definitionen im Code notwendig sind. Der hier gezeigte Code baut auf den neuesten Versionen zum Zeitpunkt der Veröffentlichung auf.)
#include "owm_credentials.h" // See 'owm_credentials' tab and enter your OWM API key and set the Wifi SSID and PASSWORD #include <ArduinoJson.h> // https://github.com/bblanchon/ArduinoJson #include <WiFi.h> // Built-in #include "time.h" // Built-in #include <SPI.h> // Built-in #define ENABLE_GxEPD2_display 0 #include <GxEPD2_BW.h> #include <GxEPD2_3C.h> #include <U8g2_for_Adafruit_GFX.h> #include "epaper_fonts.h" #include "forecast_record.h" //#include "lang.h" //#include "lang_cz.h" // Localisation (Czech) //#include "lang_fr.h" // Localisation (French) #include "lang_gr.h" // Localisation (German) //#include "lang_it.h" // Localisation (Italian) //#include "lang_nl.h" // Localisation (Dutch) //#include "lang_pl.h" // Localisation (Polish) #define SCREEN_WIDTH 400.0 // Set for landscape mode, don't remove the decimal place! #define SCREEN_HEIGHT 300.0
Falls Sie dem Verbindungsdiagramm nicht gefolgt sein sollten, gibt es auch die Möglichkeit, in der .ino-Datei die Anschlüsse vom Display zum ESP32 zu verändern.
// Connections for e.g. LOLIN D32 static const uint8_t EPD_BUSY = 4; // to EPD BUSY static const uint8_t EPD_CS = 5; // to EPD CS static const uint8_t EPD_RST = 16; // to EPD RST static const uint8_t EPD_DC = 17; // to EPD DC static const uint8_t EPD_SCK = 18; // to EPD CLK static const uint8_t EPD_MISO = 19; // Master-In Slave-Out not used, as no data from display static const uint8_t EPD_MOSI = 23; // to EPD DIN
Gehäuse aus dem 3D-Drucker
Damit wären alle Voraussetzungen für den erfolgreichen Start des Displays geschaffen! Alle Diagramme, Beschriftungen und Routinen sind vorprogrammiert und müssen nicht verändert werden.
Es besteht auch die Möglichkeit, an den ADC des ESP32 einen Akku anzuschließen. Der Akkustand wird dann oben rechts auf dem Display angezeigt. Durch den Deep-Sleep-Mode des ESP32 und der Aktualisierungsrate von 30 Minuten, ist der Akkubetrieb sehr empfehlenswert, da dadurch das Gerät mehrere Wochen mit schon kleineren Akkukapazitäten (<1000mAh) auskommt.
In meinem Fall habe ich mich für den Betrieb mit einem kleinen 5V Netzteil entschieden, da standorttechnisch ein Akkubetrieb wenig sinnhaft direkt neben einer Steckdose wäre.
Um dem Projekt eine schöne Behausung zu geben, habe ich mich mit Autodesk Fusion 360 an das Design eines 3D-Druck-Gehäuses gemacht und folgendes Design ist dabei entstanden:
Es setzt sich zusammen aus einer Art “Bilderrahmen“ für das E-Paper-Display inkl. Aussparungen für das Herausführen der Kabel und einer daran anliegenden Box für den ESP32. Das Gehäuse ist angeschrägt, sodass es nicht vertikal auf dem Tisch oder ähnlichem steht. In dem Vorderteil sind Löcher für threaded inserts integriert, sodass die beiden Teile einfach verschraubt werden können.
Nach dem Druck der Teile habe ich nun die Komponenten zusammengefügt und schon ist alles fertig. Leider konnte ich aus Zeitgründen nur den 3D-Drucker bei meinem Betrieb verwenden, dieser hat jedoch mit starkem Warping zu kämpfen, weshalb ich die verbogenen Gehäuseteile entschuldige.
Und schon haben wir eine fertige E-Paper-Wetterstation mit ESP32, die zu jeder Tages- und Nachtzeit geeichte Wetterdaten anschaulich präsentiert. Ich hoffe, Sie werden mit dem Projekt Spaß haben und freue mich über die Kommentare und potenzielle Adaptionen. :D
Viele Grüße
Niklas Heinzel
Anmerkung:
schauen Sie auch in die Blogreihe zum Thema E-Paper Display (Teil 1, Teil 2)
66 Kommentare
Dieter Möller
Besten Dank für das wirklich tolle Programm. Leider bleibt bei mir das Display dunkel, trotz aller -hier beschrieben Tips. Ich benutze einen ESP32 WROOM von AZ-Delivery und ein 4.2 epaper Display von W…. Welche PIN Belegung muss ich denn beim ESP32 WROOM anwenden? In den Post`s hier habe ich gelesen, dass es schon jemand geschafft hat, also muss es doch gehen!
Viele Grüsse
Andreas Wolter
@Wolfgang Rohne: das jeweilige Display wird mit dieser Zeile initialisiert:
GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/CS=D8/ EPD_CS, /DC=D3/ EPD_DC, /RST=D4/ EPD_RST, /BUSY=D2/ EPD_BUSY));
Das entspricht dem 420er Display in zwei Farben (BW; Black/White). Für das dreifarbige Display müsste es ungefähr so aussehen:
GxEPD2_3C<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/CS=D8/ EPD_CS, /DC=D3/ EPD_DC, /RST=D4/ EPD_RST, /BUSY=D2/ EPD_BUSY));
3C steht für 3-Color.
die 3C Bibliothek wird in dem Sketch auch schon inkludiert: #include
Um das vorher zu testen, empfehle ich die Beispiel-Sketches der GxEPD2 Bibliothek. Sie müssen dort in der Display Selection nach dem Block mit ESP32 und den 3C Displays suchen. Die jeweilige Zeile können Sie dann in den Wetterstations-Sketch kopieren und die Pinnummern austauschen.
Um dann Farben zu verwenden, schauen Sie in dem Beispiel nach dieser Zeile:
display.setTextColor(display.epd2.hasColor ? GxEPD_RED : GxEPD_BLACK);
GxEPD_RED nutzt statt Schwarz die rote Farbe z.B.
Probieren Sie es aus und lassen uns bitte wissen, ob es funktioniert hat.
Grüße,
Andreas Wolter
AZ-Delivery Blog
Sven
Hallo zusammen,
ja, auch ich habe es geschafft :-).
Danke an Tom – mein Waveshare Display erwachte ebenfalls erst nach der Änderung von display.init(115200, true, 2, false); in display.init();
Zuvor hatte ich ein paar dunkle Momente ob der Vielfalt an ESP32-Boards mit der Anpassung der GPIO´s – also PIN Belegung. Eine Nacht drüber geschlafen, läuft nun auf meinem ESP32 WROOM von AZ-Delivery
Herzlichen Dank an Niklas für die Bereitstellung von Sketch/Anleitung/3D Druck Dateien. Die 3D Druck Dateien musste ich auch an das Display anpassen, Waveshare scheint hier auch immer mal wieder am Design zu basteln.
Wolfgang Rohne
Hallo und Moin,
würde dieses Projekt auch mit einem 3-Farb 4,2 Display der bekannten Firma W*****funktionieren ?
Oder sind dafür Änderungen am Code notwendig und wenn ja, gibt es Tipps wie und wo ?
Danke und bleibt auf Deck
Wolle
Wolfgang Menzel
Oh, Daaannnke!!! Nach den installieren der .zip und display.init(0) funktioniert es. Ich verwende ein Joyit ESP32 mit dem 4.2inch e-Paper. Falls jemand Interesse hat und dieses Display bei AZ noch nicht verfügbar ist, ich habe es über BERRYBASE gekauft.
Danke nochmals und viel Erfolg weiterhin!
Andreas Wolter
@Wolfgang Menzel
Das sind Programmteile der ESP32 E-Paper Bibliothek. Stellen Sie sicher, dass Sie den aktuellen ESP32 Arduino Core installiert und den ESP32 ausgewählt haben. Außerdem brauchen Sie die angegebenen Bibliotheken inklusive dieser hier:
https://github.com/G6EJD/ESP32-e-Paper-Weather-Display
Die können Sie als ZIP herunterladen und in der Arduino IDE als ZIP hinzufügen.
Grüße,
Andreas Wolter
Wolfgang Menzel
Hallo,
ich habe versucht, das Projekt zu kompilieren. Leider kommen einige Fehlermeldungen wegen fehlender .h Dateien. Diese habe ich dann vom Originalprojekt heruntergeleden, so dass dieses jetzt funktioniert. Allerdings kommen weitere Fehler, wie zB:
undefined reference to `hPa_to_inHg(float)’
undefined reference to `mm_to_inches(float)’
undefined reference to `mm_to_inches(float)’
undefined reference to `NormalizedMoonPhase(int, int, int)’
DrawMainWeatherSection(int, int)‘:
undefined reference to `TitleCase(String)’
Kann da jemand was dazu sagen?
Gruß
Wolfgang
Andreas Wolter
ich habe den Link zum Display ergänzt. Leider gibt es aktuell keine E-Paper Display im AZ-Shop. Das soll sich aber in Zukunft ändern.
Grüße,
Andreas Wolter
Jürgen
Hi,
wiedermal ein tolles Tutorial von Dir! Vielen Dank dafür!
Da ich schon einige Zeit ein 4,2 400×300 ePaper Display Modul zu liegen hatte, habe ich mich mal mit einem ESP-WROOM-32 an die Umsetzung gemacht und die GPIO’s entsprechend verändert. Das kompilieren ist allerdings immer bei #include hängen geblieben (file not found!?). Nach der Änderung (trial and error ,-) ) in #include “common.h” hat’s dann geklappt.
Vom Display selbst bin ich ein wenig enttäuscht. Mein 1,54inch-Display lässt sich um einiges besser ablesen. Eine Idee woran das liegen könnte?
Ingo
Hallo Andreas, vielen Dank für den interessanten Artikel! Kannst Du mir sagen welches Display es genau ist, dass hier verwendet wird oder gibt es ggf. Alternativen?
Danke und Gruß
Ingo
Juergen
Bei der Wetterstation.ino erhalte ich folgende Fehlermeldung: ‘obtain_wx_data’ was not declared in this scope. Zeile if (RxForecast == false) …. in void setup().
Ich verwende die Arduino IDE 1.8.16.
MfG
Juergen
Juergen
Ich habe die genannte Datei in der Zwischenzeit gefunden.
Hinweis in der Datei: platformio.ini.
MfG
Juergen
Juergen
Wo kann ich denn die Datei “M5CoreInk.h” finden ?
Diese Datei wird z.B. für die Beispieldatei "M5_CoreInk.ino benötigt.
Verwendet habe ich: ESP-e-Paper_Weather-Display-master.zip.
MfG
Juergen
Michael Obe
Hallo,
bei mir reklamiert das Programm die und
Eine Idee, was ich übersehen habe?
Danke
Stefan
Cooles Projekt! Schaut klasse aus! Warum gibts denn im Shop keine e-Paper Displays?
Tom
Hallo,
ich musste lt Pkt. 4 in der README.md auf GitHub die Zeile:
display.init(115200, true, 2, false); durch display.init(); ersetzen.
Erst dann erwachte mein 4,2 Zoll Waveshare Display.
Vielleicht hilft dies ja auch jemanden.
Gruß Tom