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

58 Kommentare

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

Kommentar hinterlassen

Alle Kommentare werden von einem Moderator vor der Veröffentlichung überprüft

Empfohlene Blogbeiträge

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery