Infodisplay mittels ESP32

Der ESP32 von Espressif ist leistungsfähiger als sein Vorgängermodell ESP8266, integriert WLAN und Bluetooth. Als Arduino-kompatibler Baustein lässt er sich auch genauso programmieren, ist aber um einiges leistungsfähiger als viele Arduino-Boards.

Außerdem haben mich seine Stromspar-Eigenschaften interessiert, und so sollte eine batterieversorgte Anzeige entstehen, welche einige wichtige Werte aus dem Wohnbereich anzeigt. Dazu wurde auch ein eInk-Display verbaut, das im Ruhezustand den Anzeigeinhalt auf dem Display beibehält und dabei keinen Strom aufnimmt.

Unsere anzuzeigenden Werte (Temperatur, Luftfeuchte) sollen von den Sensoren geliefert werden, welche schon in unsere Smarthome-Lösung eingebunden sind.

Dort läuft auf einem Raspberry Pi ein FHEM-Hausautomationsserver, mehrere Räume werden überwacht. Diese Konfiguration ergibt die Möglichkeit, mit MQTT – „Message Queue Telemetrie Transport“ zu arbeiten, um diverse Werte aus FHEM auf den ESP32 zu transportieren.

Dazu muss zuerst ein MQTT-Broker auf dem Raspberry Pi installiert werden. Unter Raspbian gibt es „mosquitto“:

$ sudo apt-get update
$ sudo apt-get install mosquitto mosquitto-clients libmodule-pluggable-perl

Jetzt kann man kontrollieren, ob der mosquitto-Service läuft:

$ sudo service –status-all 2>&1 | grep mosquitto

Oder ausführlichere Statusinformationen anzeigen lassen:

$ sudo service mosquitto status

Stoppen und Starten des Service geschieht folgendermaßen:

$ sudo service mosquitto stop
$ sudo service mosquitto start

Nun muss noch FHEM für MQTT vorbereitet werden. Dazu muss man zuerst die Perl MQTT-Module installieren (/user/local/man! vorher löschen):

$ sudo cpan install Net::MQTT:Simple
$ sudo cpan install Net::MQTT:Constants

Jetzt kann man ein entsprechendes Device in FHEM anlegen:

define esp32001 MQTT_DEVICE
attr esp32001 IODev myBroker
attr esp32001 room MQTT

# Werte nach esp32001 (topic fhemhome/flur/statxx) senden (alle 1.5min)

define sendmval at +*00:01:30 {\
my $rv01 = ReadingsVal(‚Wandthermostat_WZ_Weather‘,’temperature‘,“);;\
my $rv02 = ReadingsVal(‚Wandthermostat_Bad_Weather‘,’measured-temp‘,“);;\
my $rv03 = ReadingsVal(‚Thermostat_Kueche‘,’measured-temp‘,“);;\
my $rv04 = ReadingsVal(‚Thermostat_SZ‘,’measured-temp‘,“);;\
fhem(„set myBroker publish fhemhome/flur/stat01 $rv01“);;\
fhem(„set myBroker publish fhemhome/flur/stat02 $rv02“);;\
fhem(„set myBroker publish fhemhome/flur/stat03 $rv03“);;\
fhem(„set myBroker publish fhemhome/flur/stat04 $rv04“);;\
}

Entwickelt haben wir wieder mit der Platformio-IDE. In unserem Setup ist der ESP32 innerhalb 2min Wachzeit bereit, Werte zu empfangen. Der Broker auf dem Pi übermittelt alle 1.5min, neue Werte liegen im Wachzeitfenster damit sicher an. Danach gibt es einen Tiefschlaf für 8min, was 10min-Zykluszeit ergibt.

Im Quelltext werden diese 480 Sekunden nochmal mit 1.000.000 multipliziert, da die SleepTime in Mikrosekunden übergeben wird.

if (sleep_enabled == true) {

long SleepTime = 480;
esp_sleep_enable_timer_wakeup(SleepTime * 1000000);
Serial.println(„Gehe in Tiefschlaf…“);
esp_deep_sleep_start();
}

Vor dem Einbau wurden alle Hardware-Komponenten inklusive LiPo-Akku auf dem Breadboard gesteckt und verkabelt und auch diverse Strommessungen vorgenommen.

Auf dem ESP32 läuft unsere Firmware, welche insgesamt 10 Werte empfangen soll. Für den ersten Test beschränken wir uns auf nur einen Raum, auch die Testnachricht wird später nicht mehr angezeigt. Stattdessen wurde ein Zeitstempel eingeführt. So kann man auf dem Display gleich erkennen, wann die Anzeige das letzte Mal aktualisiert wurde.

Daneben wird auf dem eInk-Display über zwei Kürzel „M“ und „W“ signalisiert, ob eine Verbindung zum MQTT-Broker und ins WLAN etabliert ist. Das Display ist über I2C an den ESP angebunden.

Zu Testzwecken kann man auch ein Monitoring der übertragenen Meldungen im Terminal auf dem Pi bzw. per ssh auf einem Netzwerkrechner vornehmen. Alle Nachrichten sieht man mittels:

$ mosquitto_sub -v -h -p 1883 -t ‚#‘

Um eine Nachricht zu publizieren (hier an das sogenannte Topic „fhemhome/flur/stat“, Anzeigedevice im Flur), gibt man folgendes ein:

$ mosquitto_pub -h -t fhemhome/flur/stat -m „Ich bin ein Test!“

Senden kann man auch von der FHEM-Befehlszeile oder aus der Standard-GUI, in dem man mittels Broker eine Message an das MQTT-Device sendet:

set myBroker publish fhemhome/flur/stat Ich bin ein Test!

Dabei wird der Message-String “Ich bin ein Test!” gerade nicht in Anführungszeichen gesetzt.

Untergebracht ist das Ganze in einem Fertiggehäuse aus dem Elektronikhandel. Um Platz zu sparen, wurde nur eine Stiftleiste und in liegender Anordnung angelötet. Der Konnektor für den Akku ist nicht genutzt und hat eine Verkabelung nach innen bekommen. Der USB-Anschluss der Platine wiederum zeigt über eine Gehäuseöffnung direkt nach außen.

Die ständig grün leuchtende Power-LED unseres Dev-Boards haben wir entfernt. Dafür lassen wir die Board-LED an Pin2 bei Verbindungsaufnahme ins WLAN kurz aufleuchten. Somit kriegt man einen „Lebendig“-Status kurz nach dem Einschalten mit dem seitlichen Kippschalter. Danach kann man das Gerät abstellen.

Über dem ESP32 findet das Display Platz, über kurze Kabel mit der Steckleiste des ESP verbunden.

Im Fuß der Lipo-Akku und die Ladeelektronik. Die ist verantwortlich dafür, dass man mittels USB-Kabel an einem 5V-Netzteil oder PC-Anschluss laden kann.

Die Frontplatte spart in der Mitte das eInk-Display aus. Das wird nur für die variablen Daten benötigt und kann deshalb relativ klein ausfallen.

Alles zusammengebaut, ist unser „Anzeiger“ für das Smarthome nun fertig. Tests über die letzten Wochen haben ergeben, dass nach einigen Tagen nachgeladen werden muss. Da kann man die Parameter für Aktualisierung und Bereitschaft ändern, je nachdem wie aktuell man seine Anzeige braucht, oder alternativ den Betrieb über USB-Kabel und kleinem Netzteil machen.

Nicht zuletzt hat bei diesem Projekt auch die Optik für uns eine Rolle gespielt, damit das Ganze in die Wohnung passt und gut vorzeigbar ist. Da heißt es, sich bei der Konstruktion entsprechend Mühe zu geben.

Alles in allem bin ich mit dem ESP32 als Baustein für solcherlei Aufgaben aber zufrieden und deshalb ist geplant, ihn auch noch in weiteren Vorhaben einzusetzen…

Swen Hopfe

4 Replies to “Infodisplay mittels ESP32”

  1. Hallo Swen,
    sehr interessant und anscheinend „einfach“.
    Könntest Du bitte die Listings (für den ESP32) bereitstellen?
    (und vielleicht auch, welchen genauen Typ Display Du da verwendet hast?

  2. Hallo Heinz,
    das ePaper ist ein 1.54-Zoll-Modul von WaveShare. In deren Wiki findest Du alle Angaben und ziemlich detailliert. Hier ist der Link:
    https://www.waveshare.com/wiki/1.54inch_e-Paper_Module
    Das komplette Listing für den MQTT-Client auf dem ESP32 hab‘ ich leider nirgends veröffentlicht. da fehlt mir noch der Github-Eintrag. Da muss ich auf https://github.com/swenae
    noch Einiges ergänzen. Vielleicht nützt Dir aber die Modul-Angabe schonmal. Sorry für meine späte Antwort und schöne Woche noch!
    Gruß
    Swen

    1. Hallo Swen,
      danke für die Infos…
      Ich habe mittlerweile mit die entsprechenden Teile bestellt (habe ein 2.9 e-ink von Waveshare genommen) und mir auch die MQTT-Teile für den ESP32 aus anderen Quellen zusammengesucht.
      Und es funktioniert 🙂
      Allerdings habe ich ein Problem mit den „Stromverbrauch“ – der meine „PowerBank“ innerhalb von ein paar Tagen leersaugt.
      So liegt mein „deep sleep“ Stromverbrauch bei einen Node32S oder einen Lolin D32 Board bei 4-8mA (!)
      Dazu möchte ich meine Werte alle Minute aktualisiert haben (außer Nachts – da reichts alle Stunde)- d.h. tagsüber nur knapp 55 Sekunden Schlaf dann ca. 4-15 Sekunden Wachzeit (ich schicke alle 30 Sekunden die Werte vom Broker (FHEM MQTT2) mit den „Retain“-Bit gesetzt, so dass sobald eine WLAN/MQTT-Verbindung besteht, die Werte sofort an den ESP32 übertragen werden – das spart etwas „Wachzeit“ ein auch wenn die Werte dann schon maximal 29 Sekunden „alt“ sind).

      So … die Frage wäre nun an Dich:
      Auf welche „deep sleep“ Stromaufnahme kommst Du mit Deinen Board (welches hast Du?).

      Experimente mit den FireBeetle ESP32 board von DF-Robots waren leider auch nicht von Erfolg gekrönt. Zwar liegt dort der Stromverbrauch im DeepSleep tatsächlich im µA-Bereich (und nicht im mA-Bereich wie bei den anderen Boards) dafür funktioniert der „partial Refresh /Update“ beim Waveshare2.9 e-ink Display nicht (die überschriebenen Bereiche „verwischen“ und sind dann unleserlich – während der selbe Code bei den „normalen“ Boards tadellos läuft).
      Danke!

      1. Entschuldige für diese späte Antwort. Ja, mit dem Stromverbrauch hatte ich auch Probleme. Denke, bei meinem Board damals lag der geringer als bei Dir. Mittlerweile ist die Anordnung bei mir aber nicht mehr in Betrieb, da MQTT bei mir eine Ausnahme geblieben ist, habe ich den Exot (leider) entfernt. Mein Board war auch ein Lolin. Bei mir tut nun nur noch der Server mit eigenem Display und natürlich an fester Stromversorgung angebunden, die Anzeigefunktionen übernehmen. Gruß Swen

Schreibe einen Kommentar zu Swen Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert