Statusdisplay mit ESP Easy, DLCD und FHEM

Jeder der in seiner Freizeit ab und zu mit dem Arduino oder Raspberry programmiert, ist früher oder später auf eines der beliebten LCDs gestoßen.

Es gibt sie in unterschiedlichen Ausführungen. Sei es mit 16 Zeichen und zwei Zeilen oder die große Ausführung mit 20 Zeichen und vier Zeilen. Auch im Bezug der Hintergrundbeleuchtung und Schriftfarbe gibt es unterschiedliche Ausführung. Unter anderem grüne Hintergrundbeleuchtung mit schwarzer Schrift oder blaue Hintergrundbeleuchtung mit weißer Schrift. Für jeden Geschmack etwas dabei.

Auch ich habe bereits damals mit diesen LCDs herumgespielt. Dank vorhandenen Treiber und Bibliotheken ist das Programmieren auch für Anfänger sehr leicht und garantiert schnelle Erfolgserlebnisse. Mir kam deswegen schon früh die Idee das Display auch in FHEM einzubinden und ein paar Informationen auf diesem anzuzeigen. Leider haben immer wieder andere Projekte dieses Vorhaben nach hinten gedrängt - bis jetzt. In diesem Beitrag möchte ich euch deswegen mein Vorgehen schildern und euch zum Nachmachen animieren. 

Welches LCD mit welcher Hardware?​

Bevor ich mich ans Programmieren und Definieren gemacht habe, habe ich mich zunächst auf die Suche nach einem passenden Display und der passenden Hardware gemacht. ​

Wie der Titel schon verrät, habe ich mich für die Software ESP Easy entschieden und der regelmäßige Blogleser unter euch wird es schon erahnt haben, ein WeMos-Baustein als Hardware.  

Damit das Display nun problemlos am WeMos-Baustein angeschlossen werden kann und später von ESP Easy unterstützt wird, bedarf es ein weiteres Stück Hardware. Eine I2C-Schnittstelle wird die Verbindung zwischen WeMos-Baustein und Display herstellen. Dieser I2C-Baustein kann einzeln bestellt werden.

Letzte Aktualisierung am 20.09.2017 / Affiliate Links / Bilder von der Amazon Product Advertising API

Ich empfehle euch jedoch ein Display zu kaufen, welches bereits eine I2C-Schnittstelle integriert hat bzw. diesen Baustein bereits besitzt. 

Letzte Aktualisierung am 20.09.2017 / Affiliate Links / Bilder von der Amazon Product Advertising API

Ich persönlich finde eine blaue Hintergrundbeleuchtung etwas moderner, weswegen ich mich für ein Display mit vier Zeilen und 20 Zeichen mit weißer Schrift auf blauer Hintergrundbeleuchtung entschieden habe. Natürlich mit bereits angelöteter I2C-Schnittstelle (rote Platine).

Der Aufbau

Dank der I2C-Schnittstelle ist der Aufbau relativ simpel. Ihr müsst einfach die vier Anschlüsse mit dem WeMos-Baustein verbinden. 

LCD - I2c

WeMos-Baustein

GND

GND

VCC

VCC

SDA

ein freier GPIO - in meinem Fall: D7

SCL

ein freier GPIO - in meinem Fall: D6

Der Jumper auf der linken Seite (siehe Bild) dient der Stromversorgung der Hintergrundbeleuchtung. Ist der Jumper gesetzt, so wird die Hintergrundbeleuchtung durch den Controller gesteuert und kann über ESP-Easy entweder aus- oder auf 100% angeschaltet werden.

optionale Helligkeitssteuerung

Möchtet ihr die Helligkeit regeln​, könnt ihr dies über ein Potentiometer realisieren oder ihr benutzt einen weiteren freien GPIO des WeMos-Boards und könnt die Helligkeit dann auch über FHEM regeln.

Da die GPIOs des WeMos-Boards leider nur mit 3,3V arbeiten, kann man zwar nicht die gleiche Helligkeit erreichen, wie mit 5V, aber für meine Bedürfnisse noch ausreichend. Wer es jedoch heller möchte, kann natürlich mit einem Level-Shifter oder mit einem Transistor arbeiten. 

Bevor ich jedoch mit der Anpassung begonnen habe, habe ich gemessen, wie viel Strom die Hintergrundbeleuchtung benötigt. Dazu habe ich einfach den Jumper entfernt und ein Strommessgerät zwischen geschaltet.

Bei einem 20x4 LCD mit blauer Hintergrundbeleuchtung sind es ca. 30 mA. Für die WeMos-GPIOs also noch im grünen Bereich. Andere LCDs können natürlich andere Werte haben, aber sollten sich alle so im Bereich 30-40 mA befinden. 

Da mir persönlich die Helligkeit bei 3,3 V ausreicht, habe ich einfach den Jumper entfernt und einen freien GPIO-Pin vom WeMos-Board (D3) verwendet und diesen mit dem oberen PIN der Jumperleiste verbunden.

Voraussetzung ist natürlich, dass dieser PIN direkt mit dem "Kathoden-Anschluss" des Displays verbunden ist (zweiter PIN von links, beschriftet mit K). Somit lässt sich die Helligkeit direkt über diesen Anschluss steuern. Sollte dies nicht der Fall ist, könnt ihr natürlich direkt an den Kathoden-Anschluss gehen und die Leiterbahn entsprechend unterbrechen.

Die Konfiguration der Helligkeitssteuerung auf der Softwareseite wird später beim entsprechenden Device in FHEM vorgenommen.

​Installation ESP Easy 

Wie am Anfang schon erwähnt, wird die Software ESP Easy verwendet. Bevor man nun also mit der Konfiguration fortfährt, muss die aktuellste Version auf den WeMos-Board geflasht werden. Wie dies geht, könnt ihr auf meinem Blogbeitrag zum Thema erfahren. Für die LCD-Steuerung wurde die ESP Easy Version 147 verwendet. 

Konfiguration ESP Easy

Bevor mit der Definition in FHEM begonnen werden kann, müssen erstmal ein paar Einstellungen auf der Konfigurationsseite von ESP Easy vorgenommen werden.

Zum Einen solltet ihr im Reiter "Config" dem WeMos-Board einen eindeutigen Namen vergeben. Ich habe "WeMos-LCD" verwendet.​

​Wichtig ist nun, dass unter dem Reiter "Hardware" die verwendeten PINs für die I2C-Schnittstelle angegeben werden. In meinem Fall GPIO13 (D7) für SDA und GPIO12 für SCL.

Nachdem Bestätigen durch Klicken auf "Submit" muss das Board neu gestartet werden. Dazu einfach den Reset-Button des Boards drücken oder kurz die Stromversorgung trennen.

Sobald das Board neu gestartet wurde, kann unter dem Reiter "Tools" und dann auf "I2C Scan" überprüft werden, ob das Display erkannt wird.

Das LCD wurde unter der Adresse 0x27 erkannt. Mit dieser Adresse kann man unter dem Reiter "Devices" das LCD einrichten. Dazu einfach auf "Edit" und dann als Device "Display - LCD2004" auswählen. Hier lassen sich nun die entsprechenden Einstellungen des Displays eingeben. 

Wichtig ist hier nun die IC2-Adresse. Diese muss auf die ermittelte Adresse gesetzt werden. Des Weiteren kann über "Display Size" die Größe des Display angegeben werden. Zum Test kann nun noch der Inhalt der Zeilen befüllt werden, welche beim Start des Display angezeigt werden sollen (INFO: Die Zeilen nach dem erfolgreichem Test wieder leer lasse, da es sonst zu Komplikationen mit den gesendeten Textzeilen von FHEM kommen kann).

Mit Submit könnt ihr eure Eingaben bestätigen. Da das Display aber selber keine Daten sendet, ist es nun sinnvoll ein weiteres Device anzulegen, welches Daten sendet. Dies erleichtert das spätere Einrichten unter FHEM. Zum Einsatz kann nun ein System-Wert kommen, welcher kontinuierlich an  FHEM gesendet wird. 

Dazu einfach unter FHEM ein neues Device einrichten. Siehe Bild.​

Nachdem ihr durch "Submit" die Eingaben bestätigt habt, könnt ihr zum Testen das Board erneut neustarten. Es sollten nun die ebene eingegebenen Zeilen auf dem Display erscheinen. 

Das LCD ist nun in ESP Easy fertig eingerichtet. Damit dies später auch in FHEM gesteuert werden kann, kann man unter dem Reiter "Config" die Verbindung zu FHEM aufbauen. Mehr dazu in meinem Blog-Beitrag.

Einrichtung unter FHEM

Habt ihr den kleinen Trick mit den Systeminfos gemacht, sollte das WeMos-Board nun automatisch in FHEM eingerichtet sein.

Der automatisch vergebene Name kann nun geändert werden.

rename ESPEasy_WeMos_LCD_rssi WeMos_LCD

Wurden keine sendenden Devices eingerichtet, kann das Board natürlich auch manuell eingerichtet werden. Dazu einfache folgenden Befehl in FHEM eingeben.

define WeMos_LCD 192.168.2.144 80 espBridge WeMos-LCD_LCD​

Die Syntax lautet dabei wie folgt:

​define <name> ESPEasy <ip|fqdn> <port> <IODev> <identifier>

Der <name> kann frei gewählt werden. Wichtig ist, dass ihr die IP-Adresse des WeMos-Boards angibt und als Port 80 nimmt. Der Identifier muss folgenden Aufbau haben: <esp name>_<esp device name>. In meinem Fall also WeMos-LCD_LCD.

Da das LCD selber keine Daten sendet, wird es unter FHEM als "absent" angezeigt. Aber keine Sorge, Befehle von FHEM empfängt das Board trotzdem.

Steuern des Displays

Das eingerichtete Device stellt nun ein paar Befehle zur Verfügung um das LCD zu steuern.

Text ans LCD senden

Das Display lässt sich nun über das eingerichtete Device mit Text befüllen. Der Befehl dazu hat folgende Syntax:

set WeMos_LCD <Reihe> <Zeichen> <Text>​

Zum Beispiel das Wort "Hallo" in der ersten Zeile beginnend beim ersten Zeichen:

set WeMos_LCD 1 1 Hallo​

LCD löschen

Das LCD bzw. den Text löschen, kann man mit folgendem Befehl:

set WeMos_LCD lcdcmd clear​

LCD an- / ausschalten

Das LCD bzw. die Hintergrundbeleuchtung lässt sich wie folgt an- bzw. ausschalten:

set WeMos_LCD lcdcmd on
set WeMos_LCD lcdcmd off

Displayhelligkeit

Habt ihr, wie oben beschrieben, die kleine Hardwareanpassung vorgenommen, so könnt ihr nun über das DLCD-Device die Helligkeit der Hintergrundbeleuchtung regeln. Dies geschieht über ein PWM-Befehl.

set WeMos_LCD pwm <GPIO> <level>​

In meinem Fall habe ich den D3 verwendet. Dies entspricht GPIO0. Über den obigen Befehl kann man nun die Helligkeit regeln. Das Helligkeitslevel kann dabei theoretisch Werte von 0 bis 4095 haben. In meinem Fall gab es jedoch schon ab ca. 1000 keine Helligkeitssteigerung mehr. 

set WeMos_LCD pwm 0 400

Vor- und Nachteile

Die Einrichtung des ESP-Easy-Devices erleichtert das Steuern des Displays schon enorm. Es lässt sich durch einfache set-Befehle das LCD bedienen. Der Nachteil ist jedoch, dass sich leider keine ganzen Sätze an das Display senden lassen. Selbst der Einsatz von Klammern oder Anführungszeichen hat nicht geholfen.

set WeMos-LCD 1 1 "Hallo du da im Radio"​
set WeMos-LCD 1 1 'Hallo du da im Radio'
set WeMos-LCD 1 1 (Hallo du da)

Es wird immer nur das letzte Wort mit dem entsprechenden Sonderzeichen an das Display gesendet. Schade.

Ich habe mir also ein paar Gedanken gemacht, um dieses Problem zu beheben. Aber dazu später mehr.

DLCD - Der Helfer für LCDs

Damit das Steuern von LCDs noch einfacher klappt, hat der FHEM-Forum-User "epsrw1" das Modul "DLCD" programmiert und der FHEM-Community zur Verfügung gestellt.

Mit Hilfe des Moduls lassen sich die Reihen eines Displays als Readings anzeigen und durch Attribute mit Inhalt füllen.​ Durch diverse weitere Attribute lassen sich LCDs auch direkt vom DLCD-Device steuern.

Aktuell (April 2017) steht das Modul jedoch noch nicht über das offiziellen FHEM-Update bereit, sondern muss manuell aus dem Forum heruntergeladen werden. Ihr erhaltet die Modul-Datei als Anhang im ersten Forums-Post (Info: Ihr müsst registriert sein, um die Datei herunterladen zu können) 

Die Datei "39_DLCD.pm" müsst ihr dann in euren FHEM-Installationsordner in den Ordner FHEM kopieren und FHEM anschließend neu starten. 

Anschließend könnt ihr in FHEM ein entsprechendes Device vom Type DLCD definieren:

define FL_LCD DLCD​

Anschließend müssen nun noch ein paar benötigte Attribute gesetzt werden.

attr FL_LCD dlcdPhysicalRows 4;
attr FL_LCD dlcdRows 8;

Zum Einen muss dem Device mitgeteilt werden, wie viele physikalische Reihen das Display besitzt. In meinem Fall vier. Des Weiteren kann man nun sagen, wie viele Reihen man mit Text befüllen möchte. Ich habe mich für acht Reihen entschieden. Da dies mehr Reihen sind, als das Device anzeigen kann, kann man sich für ein automatisches durchscrollen entscheiden. Dies kann mit folgendem Attribut aktiviert werden:

attr FL_LCD dlcdScrolling​ 1

Anschließend könnt ihr durch das Setzen von drei Attributen jede der definierten Textzeilen mit Leben füllen.

Attribut

Erklärung

Beispiel

dlcdLine<NR>

Inhalt der Textzeile, %NR% gibt dabei das Reading an, welches mit dem Attribut dlcdVal<NR> definiert wird.

Wohnzimmer: %1%

dlcdVal<NR>

Definition evtl. gewünschter Readings

WZ_Temperatur:state

dlcdVal<NR>formatnum

Formatierung des Readings: <Gesamtanzahl der Ziffern>+<Nachkommastellen>

2+1

dlcdVal<NR>formatstring

Formatierung des Reading mit sprintf-Syntax, setzt dlcdVal<NR>formatnum außer Kraft.

%03f

Mehr Infos im FHEM-Wiki. Ich habe die Attribute wie folgt gesetzt:

Die durch die Attribute gesetzten Textzeilen erscheinen nun nach kurzer Zeit als Reading. Für jede Zeile ein extra Reading. Hier kann man dann direkt kontrollieren, ob die Attribute alle wie gewünscht gesetzt wurden.

Die Linien-Readings werden nun bei jeder Wertänderung automatisch aktualisiert. 

Solltet ihr das Srollen aktiviert haben, ändert sich nun das Reading "scrollingState" im regelmäßigem Abstand. Jede Zahl steht dabei für ein unterschiedliches Fenster an Zeilen (in meinem Fall vier Zeilen). Bei acht eingerichteten Zeilen gibt es demnach acht unterschiedliche Fenster: 1234 - 2345 - 3456 - 4567 - 5678 - 6781 - 7812 - 8123. Diese "Sichtfenster" werden nun im zehn Sekundentakt durchgescrollt. 

Die Hauptaufgabe des DLCD-Moduls liegt darin, die Textzeilen ansprechend darzustellen und somit einfacher steuern zu können. Damit die gesetzten Textzeilen jedoch auch an ein wirkliches LCD weitergeleitet werden, ist ein weiteres Attribut notwendig. Mit dem Attribut "dlcdTriggerCmd" lässt sich der Befehl festlegen, welcher bei einem Event (also eine Zeilenänderung) abgesetzt werden soll.​ Dabei kann der Platzhalter %L% für die aktuelle Textzeilennummer und %T% für den aktuellen Text verwendet werden. 

Für das oben eingerichteten ESP Easy Device (WeMos_LCD) kann das Attribut demnach wie folgt lautet:

attr FL_LCD dlcdTriggerCmd set WeMos_LCD lcd %L% 1 %T% ​

Nun wird bei jeder Textänderung dieser Befehl abgesetzt und somit das LCD mit dem gewünschten Text befüllt. Doch genau hier macht uns nun der oben beschriebene Nachteil einen Strich durch die Rechnung. Geht man davon aus, dass die erste Zeile nun an das LCD geschickt werden soll, dann wird aufgrund des Attributs "dlcdTriggerCmd", folgender Befehl gesendet:

set WeMos_LCD lcd 1 1 Wohnzimmer: 21.9​

Wie oben schon erwähnt, kommt nur das letzte Wort beim LCD an, in diesem Fall also nur der Wert 21.9. Um diese Eigenheit zu umgehen, habe ich mir eine kleine Routine zusammengebastelt. 

Hilfs-Routine zum Senden ganzer Sätze mit DLCD​

Um ganze Sätze über DLCD an das Display zu senden, habe ich mir zwei kleine Routinen geschrieben. Diese wird einfach in die Datei "99_myUtils.pm" geschrieben.

Eine Routine erlaubt das einfache Senden eines Satzes an eine bestimmte Zeile auf dem Display. Damit bei langen Sätzen kein Umbruch auf die nächste Zeile erfolgt, habe ich ein Schutzmechanismus eingebaut.

sub sendLCDSatz($$$){
my ($reihe, $zeichen, $sendText) = @_;
my @array;
my @laenge;

# Nachricht in Wörter aufsplitten
@array=split(/ /,$sendText);

# Erstes Wort senden und Länge ermitteln
fhem("set WeMos_LCD lcd $reihe $zeichen $array[0]");

$laenge[0] = length($array[0]);

# Länge der Wörter ermitteln und restlichen Satz schicken
for (my $i = 1; $i < @array; $i++) {
$laenge[$i] = length($array[$i]);
$zeichen = $zeichen + $laenge[$i-1] + 1;
if($zeichen > 20) {return 0};
fhem("set WeMos_LCD lcd $reihe $zeichen $array[$i]");
}

return NULL;}

Der Subroutine übergibt man die gewünschte Zeile ($reihe), gewünschte Startposition ($zeichen) und den zu sendenden Text ($sendText). Zusätzlich zu diesen drei Variablen ist ein Array definiert, welches die einzelnen Wörter des Satzes speichern soll und eine Variable für die Länge eines Wortes, damit die richtigen Postionen berechnet werden können. 

Damit die Wörter einzeln an das LCD gesendet werden können, wird der Satz in seinen einzelnen Wörter gesplittet.

Zu Beginn wird das erste Worte direkt an das LCD gesendet und dessen Länge abgespeichert.​ Anschließend wird in einer for-Schleife die Länge der anderen Wörte abgespeichert. Die aktuelle Position auf dem Display wird dann aktualisiert, in dem die Länge der vorigen Wortes plus eins für das Leerzeichen und die Wörter nach und nach entsprechend ihrer Länger verschoben an das LCD gesendet.

Die zweite Routine ist extra dafür da, die Zeilen aus dem DLCD-Device an das Display zu senden. Diese Sätze bestehen immer aus zwei Wörtern, der Name und das Reading selbst.

Zum Beispiel "Wohnzimmer: 21.9". Das erste Wort wäre dann "Wohnzimmer:" und das zweite Wort "21.9". Die Routine beschränkt sich also auf das Senden von zwei Wörtern. 

Bevor ich jedoch beginne die Routine zu erklären, werde ich etwas auf die Funktionsweise vom DLCD-Modul eingehen. Dadurch, dass das automatische Scrollen aktiviert ist, muss bei jeder Änderung des "Sichtfensters" alle Zeilen neu geschrieben werden. Das Modul ruft also bei einem vierzeiligen Display vier mal den Schreibbefehl auf, welcher mit dem Attribut "dlcdTriggerCmd" gesetzt wurde.

sub sendLCDInfo($$){
my ($reihe, $sendText) = @_;
my @array;

# Nachricht in Wörter aufsplitten
@array=split(/ /,$sendText);

# Name des Reading senden
fhem("set WeMos_LCD lcd $reihe 1 $array[0]");

# Wert des Readings
fhem("set WeMos_LCD lcd $reihe 16 $array[1]");

return NULL;}

Der Subroutine "sendLCDInfo" müssen zwei Argumente übergeben werden. Zum Einen die zu beschreibende Textzeile ($reihe) und zum Anderen den Inhalt ($sendText). Zuerst wird wieder die zu sendende Nachricht aufgesplittet. 

Anschließend wird das erste Wort an das LCD gesendet und danach das zweite Wort etwas versetzt. In meinem Fall an die 16. Stelle. Dies habe ich gemacht, damit die Readings alle untereinander stehen. Solltet ihr ein kleineres Display haben, so müsst die Stelle natürlich anpassen.

Subroutine für DLCD verwenden

Nachdem es nun durch die beiden Subroutinen möglicht ist ganze Sätze an das Display senden zu können, kann man diese Subroutine nun auch im DLCD-Device verwenden. Dazu einfach den Aufrufe-Befehl der Routine als "dlcdTriggerCmd" setzen.

Da zwei Subroutinen erstellt wurden, könnt ihr euch nun entscheiden, welche Subroutine ihr verwenden wollt. Die Subroutine "sendLCDSatz" sendet die Zeilen unformatiert an das Display. Die Subroutine "sendLCDInfo" führt vor dem Senden eine kleine Formatierung durch, indem die Werte der Readings untereinander geschrieben werden.

set FL_LCD dlcdTriggerCmd {sendLCDSatz(%L%, 1, "%T%")}​
set FL_LCD dlcdTriggerCmd {sendLCDInfo(%L%, "%T%")}​

Damit das Scrollen nun reibungslos funktioniert, muss dem DLCD-Device noch der Befehl zum Löschen des Displays mitgeteilt werden. Dies geschieht über das Attribut "dlcdClearAllCmd".

attr FL_LCD dlcdClearAllCmd ​set WeMos_LCD lcdcmd clear

Damit euch nun das LogFile nicht voll geschrieben wird, könnt ihr dies durch folgendes Attribut verhindern:

attr WeMos_LCD verbose 0​

Mein Alltagseinsatz

Ich persönlich verwende TabletUI um Messwerte visuell darzustellen. Das Anzeigen auf dem LCD ist für mich also zur Zeit nur eine kleine Spielerei. Dennoch denke ich, dass ich dem LCD in Verbindung mit DLCD und FHEM Potential steckt. Zum Beispiel ein kleiner Tischwecker mit Uhr und kleines Info-Display. Ich denke ich werde in der Zukunft noch einiges mit LCDs anstellten und dies natürlich mit euch teilen.

​Bis dahin hoffe ich jedoch, euch die Benutzung eines LCDs mit FHEM interessant erklärt zu haben und bin natürlich auf interessante Ideen eurerseits gespannt. 

Hinterlasse einen Kommentar

7 Kommentare auf "Statusdisplay mit ESP Easy, DLCD und FHEM"

Benachrichtige mich zu:
avatar
Fotos und Bilder
 
 
 
sonstiges Dateiformat
 
 
 
Sortiert nach:   neuste | älteste | beste Bewertung
Michael Feske
Gast
Michael Feske

Sehr interessant gemacht 🙂 Ich verstehe aber die Sache mit dem WeMos-Baustein nicht. Welcher wird eingesetzt und wie genau wird dieser eingebunden (an den Raspi angeschlossen) ?

Marko
Gast
Marko

Hallo Daniel,
das ist ein guter Ansatz mit dem LCD. Ich möchte trotzdem hier mal das Nextion Display empfehlen. Es kann nicht nur zur Anzeige sondern ggf. auch zum Steuern über virtuelle Buttons.

Info´s

https://forum.fhem.de/index.php/topic,51267.345.html
https://www.letscontrolit.com/forum/viewtopic.php?f=6&t=1469&start=80

Viele Grüße und weiter so mit den tollen FHEM Tut´s

Rudi
Gast

Hi,

in der V2.0 der EasyESP Software scheint es ein paar Anpassungen gegeben zu haben.

Um Text zu schicken braucht man jetzt das Schlüsselwort lcd – damit gehen dann auch ganze Sätze.

Beispiel:

set ESPEasy_esp4_LCD lcd 1 1 Hallo Welt

Gruß RUDI

wpDiscuz