martinsuniverse

Tasmota Display (ST7789)

Intension für diesen Artikel ist, das ich mit einem ESP32 und Tasmota ein Display mit einem ST7789 Controllen betreiben wollte aber ich erst nach längerem Probieren und Suchen im Internet etwas auf dem Display ausgeben könnte. Für diesen Artikel habe ich mir den Quellcode von GitHub herrunter geladen und zwar den "development"-Branch in der Version 13.1.0.1.

git clone https://github.com/arendst/Tasmota.git

Das Kompilieren mache ich mit Visual Studio Code und PlatformIO. Tutorials dazu gibt es viele im Internet. Deswegen gehe ich hier nicht weiter auf die Bedienung davon ein.

Für die ESP-Mikrocontroller stehen einige vorgefertigte Firmwareversionen zur verfügung aber ich möchte meine eigene Konfiguration verwenden. Zum steuern des Kompiliervorgangs stehen mehere Dateien zur Verfügung in denen man dem Kompiler mitteilt welche Programmteile kompiliert werden sollen und welche nicht. Es sollten aber für eigene Konfigurationen nicht die Dateien geändert werden, die auch im github-Remote-Repository liegen. Diese Dateien könnten überschrieben werden, wenn die Dateien neu vom github-Remote-Repository heruntergeladen werden. Zu diesem Zweck erstellt man sich Kopien von Beispiel-Konfigurationsdateien und ändert nur diese ab. Diese Kopien werden nicht überschrieben wenn die Dateien neu von github herunter geladen werden. Unter Linux ist dies in einem Terminal schnell erledigt. Dazu wechselt man in das Tasmota Verzeichnis unt führt folgende Kopierkommandos aus :

cp platformio_override_sample.ini platformio_override.ini
cp platformio_tasmota_cenv_sample.ini platformio_tasmota_cenv.ini
cp tasmota/user_config_override_sample.h tasmota/user_config_override.h

Was in welcher Datei zu ändern ist schreibe ich unten. Bitte beachtet auch die Hinweise in diesen Dateien. Ich gehe bei allen Varianten vom "env:tasmota32" Environment aus.

Visual Studio Code - Statuszeile
Visual Studio Code - Statuszeile

Nach dem Flashen des ESP32 muss immer erst das WLAN-eingerichtet werden damit ihr auf ihn über  das Web-GUI zugreifen könnt. Wie das geht ist in der Tasmota Dokumentation zu finden. Das erwähne ich im Weiteren des Artikels nicht mehr extra.

Ausgangslage ist also Display (zum Beispiel von Waveshare) mit ST7789 Controller und einer Auflösung von 170x320 Pixel, welches per SPI-Schnittstelle an den ESP32 angeschlossen ist.

  • MOSI - GPIO13
  • SCLK - GPIO14
  • DC - GPIO12
  • CS - GPIO5
  • RESET - GPIO4

Es könnte auch noch die Hintergrundbeleuchtung mit einem Pin gesteuert werden aber dieses Beispiel soll einfach gehalten werden.

Es gibt mehrere Varianten etwas mit Tasmota auf dem Display auszugeben.

Arduino_ST7789-gemu Treiber

Diese Variante gilt als veraltet, es sollte die Variante mit dem Universal Display Driver bevorzugt werden. Das Problem mit dem alten Treiber und diesem Display wird sich recht schnell zeigen, dazu später mehr. Zuerst soll überhapt etwas auf dem Display passieren.

Konfigurieren und Kompilieren

Der Datei "user_config_override.h" sind folgende Zeilen hinzuzufügen :

// -- SPI sensors ---------------------------------
#define USE_DISPLAY
#define USE_SPI

#ifndef USE_DISPLAY_ST7789
#define USE_DISPLAY_ST7789 // [DisplayModel 12] Enable ST7789 module
#endif

Alle anderen Dateien müssen nicht geändert werden. Anschließend Tasmota kompilieren, in den ESP32 flashen, Tasmota Access Point suchen, WiFi im WebGUI konfigurieren und nun per Heim-WLAN verbinden und das WebGUI aufrufen.

Es kann jetzt ersteinmal überprüft werden, ob überhaupt die Display-Option mit kopiliert wurde. Dazu im WebGUI "Consoles -> Console" aufrufen und im Kommando-Feld das Kommando "display" eingeben.

CMD: display
RSL: RESULT = {"Display":{"Model":0,"Type":0,"Width":0,"Height":0,"Mode":0,"Dimmer":50,"Size":1,"Font":1,"Rotate":0,"Invert":0,"Refresh":2,"Cols":[16,8],"Rows":2}}

Es sollte eine Ausgabe wie diese zu sehen sein. Ist etwas von "Command unknown" zu lesen, ist die Display-Option nicht kompiliert. Hier ist zu sehen, dass das DisplayModel auf "0" gesetzt ist dies muss für den ST7789 Controller auf DisplayModel 12 gesetzt werden, nur geht dies zu diesem Zeitpunkt noch nicht, da erst die GPIOs zugewiesen werden müssen.

GPIOs zuweisen

Im WebGUI unter "Configuration -> Configure Template" die GPIO wie folgt zuweisen :

Tasmota - Template - GPIOs
Tasmota - Template - GPIOs

Steht ST7789_CS und ST7789_DC bei der Auswahl nicht zur Verfügung feht die Definition von "#define USE_DISPLAY_ST7789" in der Datei "user_config_override.h". Hier ist mein GPIO-Tamplate :

{"NAME":"ESP32-DevKit","GPIO":[1,1,1,1,1024,6592,1,1,6624,864,896,1,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1}

Displayauflösung einstellen

Nach dem Neustart geht es weiter in der Konsole. Das "display"-Kommando sollte nun automatisch Model 12 ausgeben. Hier in der Konsole nun noch "DisplayWidth 170" und "DisplayHeight 320" eingeben - Achtung, Tasmota startet nach jedem der beiden Kommandos neu. Es ist nun alles bereit um mit Tasmota und dem Kommando "DisplayText <text>" etwas auf dem Display auszugeben. Gibt man dieses Kommando ein, erscheit aber nichts auf dem Display. Das Display muss nämlich vorher erst eingeschltet werden. Dazu gibt man dem "DisplayText"-Kommando in eckigen Klammern eine Display-Kommando mit auf den weg.

Display einschalten :

DisplayText [O]

Bild mit Farbe füllen :

DisplayText [Bi3z]
DisplayText [x0y0Ci0f2]Tasmota

Aber was ist das, es wird nicht das komplette Bild mit der Farbe gefüllt und der Text ist auch nicht komplett zu sehen.

Display Foto

Der Treiber für das Display unterstützt das Display mit dieser Auflösung nicht (Stand Aug. 2023). Der Nullpunkt ist nicht in der Ecke des Displays. Im Treiber ist das nur für Displays mit der Auflösung 240 x 240 und 135 x240 hinterlegt. Also ran und den Treiber erweitern. Ich habe dies schon getan und hier sind die beiden Dateien :

  • /lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.h
  • /lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp

Noch einen Hinweis Sollte das Display nicht in der Farbe wie in der Tasmota-Doku gefüllt werden also in meinem Beispiel oben "DisplayText [Bi3z]" mit Grün, muss die Invertierung mit "DisplayInvert 1" eingeschaltet werden.

uDisplay - universal display driver

Das Problem mit der nicht unterstützten Auflösung umgeht der uDisplay-Treiber. Bei ihm wird eine Konfigurationsdatei in der Datenpartition des ESP32 abgelegt, in der unter Anderem die GPIOs und auch der Nullpunkt hinterlegt ist.

Konfigurieren und Kompilieren

Am Anfang steht wieder das Kompilieren. Der Datei "user_config_override.h" sind folgende Zeilen hinzuzufügen :

// -- SPI sensors ---------------------------------
#define USE_DISPLAY
#define USE_SPI

#ifndef USE_UNIVERSAL_DISPLAY
#define USE_UNIVERSAL_DISPLAY // New universal display driver for both I2C and SPI
#endif

Alle anderen Dateien müssen nicht geändert werden. Anschließend Tasmota kompilieren, in den ESP32 flashen, Tasmota Access Point suchen, WiFi im WebGUI konfigurieren und nun per Heim-WLAN verbinden und das WebGUI aufrufen.

Display Konfigurieren

Wie oben schon geschrieben, muss bei dieser Variante eine Konfigurationsdatei in der Datenpartition abgelegt werden. Dies kann schon automatisch beim kompilieren erfolgen aber vorerst ist es einfacher im Tasmota WebGUI "Consoles -> Manage File system" aufzurufen und dort mit "Create and edit new file" die Datei "display.ini" mit folgende Inhalt anzulegen :

:H,ST7789,170,320,16,SPI,1,5,14,13,12,*,4,*,40
:S,2,1,3,0,80,30
:I
01,A0
11,A0
3A,81,55
36,81,00
21,80
13,80
29,A0
:o,28
:O,29
:A,2A,2B,2C
:R,36
:0,C0,23,00,00
:1,A0,00,23,01
:2,00,23,00,02
:3,60,00,23,03
:i,20,21
:r,1
:B,30,5
#

Für andere Displays gibt es ein paar vorgefertigte ini-Datein im "tasmota/displaydesc"-Verzeichnis.

Die Zuweisung der GPIOs geschiet auch in dieser Datei aber trotzdem muss bei "Configuration -> Configure Template" noch die "Option A3" bei einem freien GPIO aktiviert werden und die anderen GPIOs die vom Display verwendet werden müssen auf "None" stehen.

Tasmota - Option A3
Tasmota - Option A3

Tasmota startet nun neu. Sollte das nicht automatisch geschehen, muss dies manuell durchgeführt werden.

Test und Anwendung

Jetzt geht es wieder in die Konsole und mit dem Kommando "display" kann überprüft werden ob der Treiber und die Konfiguration für das Display geladen wurde. Die Ausgabe sollte nun so aussehen :

CMD: display
RSL: RESULT = {"Display":{"Model":17,"Type":0,"Width":320,"Height":170,"Mode":0,"Dimmer":50,"Size":1,"Font":1,"Rotate":0,"Invert":1,"Refresh":2,"Cols":[16,8],"Rows":2}}

Das Model 17 steht für den universellen Treiber. Außerdem ist die Auflösung zu sehen. Der rest ist identisch mit dem Arduino Treiber bis auf den richtigen Nullpunkt. Zum Test kann das folgende Kommando eingegeben werde.

displaytext [OBi1z][x0y0Ci3h10][x0y0Ci3v10][x319y169Ci3h-10][x319y169Ci3v-10][x3y3Ci3f2]Tasmota

Mit diesem Kommando wird das Display eingeschaltet "[O]", dir Hintergrund mit einer Farbe gefüllt "[Bi1z]", in der Ecke links/oben zwei Linien gezeichnet "[x0y0Ci3h10][x0y0Ci3v10]", in der Ecke rechts/unten zwei Linien gezeichnet "[x319y169Ci3h-10][x319y169Ci3v-10]" und der Text an Position 3:3 "[x3y3Ci3f2]Tasmota" ausgegeben.

Berry script

Nun geht es in der "Berry Scripting console" weiter. Es sollte weiterhin der universal Treiber aktiv sein.

Damit das Display überhaupt verwendet werden kann muss in der Berry Konsole zuerst das "display"-Modul importiert werden (Zum bestätigen des Kommandos Enter doppelt drücken):

import display

und anschließend kann der Treiber überpruft werden :

display.driver_name()

Daraufhin wird der Display ausgegeben, bei mir also "ST7789".

Tasmota - Berry Konsole
Tasmota - Berry Konsole

 

Mit folgendem Kommando kann etwas auf dem Display ausgegeben werden :

tasmota.cmd("DisplayText [x5y5Ci8f2]Berryscript")

Berry script ohne display.ini

Der uDisplay Treiber kann auch durch ein Berry Kommando initialisiert werden. In diesem Fall ist die "display.ini"-Datei nicht nötig. Der Inhalt dieser Datei wird dem "display.start(displayini:string)"-Kommando als Parameter übergeben :

display.start(":H,ST7789,170,320,16,SPI,1,5,14,13,12,*,4,*,40 :S,2,1,3,0,80,30 :I 01,A0,11,A0,3A,81,55,36,81,00,21,80,13,80,29,A0 :o,28 :O,29 :A,2A,2B,2C :R,36 :0,C0,23,00,00 :1,A0,00,23,01 :2,00,23,00,02 :3,60,00,23,03 :i,20,21 :r,1 :B,30,5 #")

Vorher muss natürlich das "display" Modul importiert werden. Das Kommando "display.driver_name()" sollte nun auch ST7789 liefern.

Diese Kommandos können auch in das "autoexec.be" Script gepackt werden, dann werden sie beim Start von Tasmota automatisch ausgeführt.

import display
display.start(":H,ST7789,170,320,16,SPI,1,5,14,13,12,*,4,*,40 :S,2,1,3,0,80,30 :I 01,A0,11,A0,3A,81,55,36,81,00,21,80,13,80,29,A0 :o,28 :O,29 :A,2A,2B,2C :R,36 :0,C0,23,00,00 :1,A0,00,23,01 :2,00,23,00,02 :3,60,00,23,03 :i,20,21 :r,1 :B,30,5 #")
tasmota.cmd("DisplayText [OBi1zx5y5Ci8f2] Autostart")

 

Letzte Bearbeitung: 17.08.2023, 21:59
nach oben