Wetterstation mit E-Paper Display und WLAN-Anbindung - AZ-Delivery

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:

Schaltbild

 

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

Sketch Download

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:

3D-Entwurf

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.

fertiges Display

fertiges Display 2

Download 3D-Druck-Dateien

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)

 

DisplaysEsp-32Projekte für anfängerSmart home

66 commenti

Dieter Möller

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

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

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

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

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

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

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

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

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

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

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

Juergen

Ich habe die genannte Datei in der Zwischenzeit gefunden.
Hinweis in der Datei: platformio.ini.
MfG
Juergen

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

Michael Obe

Hallo,

bei mir reklamiert das Programm die und

Eine Idee, was ich übersehen habe?

Danke

Stefan

Stefan

Cooles Projekt! Schaut klasse aus! Warum gibts denn im Shop keine e-Paper Displays?

Tom

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

Lascia un commento

Tutti i commenti vengono moderati prima della pubblicazione