Vorstellung des LilyGo T-Display-S3 mit Gehäuse und ST7789 LCD (ohne Touch)


Das LilyGo T-Display S3 Board ist ein ESP32-Board der neuen ESP32-Familie von Espressif, das ein Display im Breitformat bereits eingebaut hat. Es gibt es als Touch- und No-Touch-Ausführung mit und ohne Gehäuse. Ich habe mich für die No-Touch-Variante mit Gehäuse entschieden, die ich euch heute vorstellen möchte.

Warum habe ich mich für die No-Touch-Variante entschieden? Einmal wegen des Preises, der günstig ist. Und warum habe ich mich für die Gehäusevariante entschieden? Weil mir die Farbgebung in schwarz-orange gefällt und die zwei Knöpfe dabei auch gleich schön integriert sind und ich mir dann nicht die Mühe machen muss, selbst ein 3D-Gehäuse zu designen, weil das wird ja schon mitgeliefert. Und das in einer schönen Farbkombination. Ich habe mich für schwarz-orange entschieden. Es gibt aber auch grau-orange. In dieser Ausführung muss man nichts mehr löten. Es ist alles zusammengelötet und zusammengebaut.

Und dann gibt es noch Ausführungen mit einem Touchscreen. Der hat dann keine manuellen Buttons. Und es gibt eine Version nur mit dem nackten Board und die wiederum gibt es einmal zusammengelötet und einmal nicht zusammengelötet. Diese Varianten sind dann günstiger vom Preis her. Man hat also eine gewisse Auswahl.

Obendrauf gäbe es dann noch ein MIDI-Expansion-Board, auf das man dann das nackte Board aufstecken muss. Dann hat man auch Audio-Eigenschaften. Dann wird alles natürlich größer und es gibt kein Gehäuse dafür.

Aber wie gesagt, habe ich mich für die No-Touch-Variante mit Gehäuse entschieden, die für mich den besten Nutzwert und das beste Preis- / Leistungsverhältnis bietet. Die weiteren Varianten kann man auf der T-Display S3 Produktseite bei LilyGo studieren.

Eckdaten des LilyGo T-Display-S3


Kurz abgerissen hat das LilyGo T-Display S3 folgende Eigenschaften:

Technische Daten und Pinout

Die Beschaltung der Platine sieht wie folgt aus:



Auf der Platine kann man oben eine kleine Print-Antenne für den 2.4 GHz Funk erkennen. Daneben gibt es aber auch eine kleine U.FL-Antennenbuchse für den Anschluss einer externen Antenne.

Und wie man links sieht, ist das LCD mit einer Breite von 8 Bit angeschlossen, von LCD_D0 (Pin 39) bis LCD_D7 (Pin 48). Insgesamt braucht das LCD stolze 15 GPIO-Pins. Mit einer solchen Anbindung sollte es recht flott sein.

Die Buttons sind an GPIO 0 (auch Boot) und GPIO 14 angeschlossen.

Die restlichen 13 noch freien GPIO-Pins sind über Header-Leisten für den eigenen Gebrauch herausgeführt.

Der auf dem PCB verbaute Kommunikationsport hat die Pins Ground, 3.3 Volt, GPIO43 und GPIO44. Leider liegt hier kein passendes Kabel bei. Man muss sich das entsprechende 4-polige Qwiic JST-SH 1.0mm Kabel selbst besorgen, möchte man hier etwas anschließen.

Außerdem gibt es noch einen Anschluss für Lithium-Ionen-Batterien, bei dem man über den Pin 04 die Spannung und damit den Ladezustand der Batterie ermitteln kann. Ein Kabel für den Batterieanschluss (JST 1.25mm 2-polig) liegt erfreulicherweise bei. Genauso wie Header-Pins, wobei diese ja bereits angelötet sind in der Gehäuseversion. Man muss also nichts löten.

In der Gehäuseversion sind die Pins auf die Unterseite herausgeführt in Female 2.54mm Headers. Hier kann man also ganz einfach seine Male DuPont-Kabel einstecken oder man kann ein Male-to-Male Header-Adapter (beidseitig lange Pins) einstecken, wobei ich den mitgelieferten Standard-Header (eine Seite lang, eine Seite kurz) nicht dafür empfehlen würde, weil dann die herausstehenden Pins etwas kurz sind und man da schlecht Female-DuPont-Kabel aufstecken kann. Damit lässt es sich zum Beispiel auch auf einem Breadboard betreiben.

Aber man könnte an diese Headerleisten auch etwas löten, zum Beispiel eigene Sensoren. Und da es diese Header für schmales Geld gibt und jeder wahrscheinlich welche zu Hause herumliegen hat, könnte man so seine unterschiedlichen Schaltungen an mehrere Headerleisten löten und müsste dann nicht immer etliche Dupont-Kabel umstecken, sondern steckt dann halt komplett die entsprechende Headerleiste, an die man die Peripherie angelötet hat, ein.

Die mitgelieferte Firmware zum Laufen bekommen


Leider ist einem das schnelle Erfolgserlebnis nicht beschieden. Statt einer sofort startenden Demo bekommt man bei der installierten und mitgelieferten Firmware nur eine Meldung:
Connecting to LilyGo-AABB....................
Connection timed out, start smartconfig
wait for smartconfig....
Please use ESPTouch Apps to connect to
the distribution network.

Ich dachte erst, ich müsste jetzt einen WLAN-Access-Point namens LilyGo-AABB suchen und mich mit dem verbinden, aber es stellte sich heraus, dass hier eine andere Methode benutzt wird: EspTouch.

Was ist smartconfig / EspTouch?

Ich kannte EspTouch bisher noch nicht. Es ist vielleicht auch inzwischen schon ein wenig in die Jahre gekommen. Aber es ist eine WLAN-Einrichtungs-/Provisioning-Funktion, die bei ESP32-basierten Boards genutzt wird, um diese Geräte einfach mit einem Wi-Fi-Netzwerk zu verbinden, ohne dass SSID und Passwort fest im Code eingetragen werden müssen und ohne dass man eine manuelle Eingabe über ein Display/Tastatur tätigen muss. Das erledigt man bei SmartConfig bequemer über eine Smartphone-App.

Bei dieser "Kopplungs"-Methode geht das ESP32-Gerät in den SmartConfig-Modus und "schreit" dann sozusagen ins Netzwerk: "Gib mir einer mal die WLAN-Credentials". Die Smartphone App hört diese Rufe und antwortet entsprechend mit dem WLAN-Passwort, dass man in der App eingegeben hat. Mit diesem WLAN-Passwort kann das ESP32-Gerät dann in das lokal WLAN und seine höheren Firmware-Funktionen ausführen. Außerdem kann der ESP32 die SSID und das WLAN-Passwort speichern, so dass er nicht bei jedem Neustart neu nachfragen muss.

Das Smartphone mit seiner App und das ESP32-Gerät müssen sich natürlich hören können. Das der ESP32 normalerweise nur auf 2.4 GHz im WLAN funkt, muss sich das Smartphone natürlich auch in einem 2.4 GHz WLAN-Netzwerk befinden, damit es den ESP32 hören kann. Das ist ein wohl ein beliebter Stolperstein, denn heutzutage können WLAN-Router und Smartphone 5 GHz und benutzen das bevorzugt.


Die App "SmartConfig ESP for ESP32/8266" von Truong Hai Dang (vereinfachte Schreibweise ohne Sonderzeichen) hat bei mir sehr gut funktioniert.

Zuerst wird man nach WLAN-Netzwerk und WLAN-Passwort gefragt und dann scannt die Smartphone-App nach ESP-Geräten. Irgendwann werden die Rufe des ESP-Gerätes durch die Smartphone-App erhört und erwidert und schon macht das ESP-Gerät weiter im Text.

Die WLAN-Credentials speichert sich die ESP SmartConfig-App für das nächste mal für das nächste Gerät, oder wenn man die Firmware auf ein ESP-Gerät neu geflasht hat.

Ich weiß nicht, wie sicher diese Kopplungs-Methode ist. Rate aber dringend dazu, die ESP SmartConfig-App sofort zu beenden, wenn das eigene Gerät mit den WLAN-Daten versorgt ist. Nicht, dass ein Hacker auf den Idee kommt, mal auf gut Glück in der Nachbarschaft rumzuhorchen, um sich unberechtigt Zugang zu WLANs zu erschleichen.

Funktionen der mitgelieferte Firmware


In der Auslieferungs-Firmware dient der oberen Knopf (wenn links liegend) der Ausschaltung bzw. dem Versetzen in den Deep Sleep Modus, bei dem das Display dann keinen Strom mehr verbraucht. Ein Druck auf den unteren Knopf schaltet durch die einzelnen Teile der Demo.

Im ersten Teil der Demo-Firmware zeigt das Display eine Uhr an und zwar im Wecker-Design mit Flip-Klappzahlen, so wie sie auch auf der Verpackung abgebildet ist.

Leider zeigt die Uhr nur die Zeit für Shenzhen oder Hongkong (UTC+08) an und nicht die lokale Zeit. Die Uhr ist gegenüber Deutschland also sechs oder sieben Stunden im Voraus, je nachdem, ob hier gerade Sommer- oder Winterzeit herrscht. Das ist ein wenig schade. Man kann seine Zeitzone auch nicht einstellen, so dass man das Display mit der mitgelieferte Firmware nicht einfach so als Uhrzeitanzeige benutzen kann. Auch gibt es keine Schattierungen oder gar eine Flip-Animation. Nur der Doppelpunkte zwischen Stunden und Minuten blinkt, das ist alles.


Der zweite Teil der Demo besteht darin, ein LILIGO-Schriftzug zu zeichnen, und zwar so, als ob man den mit einem Stift per Hand zeichnen würde.


Der dritte Teil ist noch ein wenig nüchterner und zeigt einfach nur den verbauten ESP32S3-Chip an, wie viel PSRAM und wie viel Flash verbaut ist und außerdem eine Voltanzeige, von der ich mir nicht ganz sicher bin, auf was sie sich genau bezieht.

Das war es auch schon mit der mitgelieferten Firmware. Wer mehr will, kann sich die anderen Firmwares von der GitHub-Seite anschauen.

Weitere Firmwares auf der LilyGo GitHub-Seite

Auf der GitHub-Seite zum Projekt finden sich im Verzeichnis firmware noch ein paar weitere fertige Firmwares.

"Fertige Firmware" heißt in diesem Fall, dass man diese einfach mit dem Espressif-Windows-Programm ESP32 Download Tool auf den am USB-Port am PC angeschlossenen ESP32 aufspielen kann. Zu finden ist das Tool unter https://www.espressif.com/en/support/download/other-tools.

Wie es zu bedienen ist, habe ich bereits ein ander mal erklärt, als ich meine Odroid-ESP32-Spielekonsole mit neuer Firmware bestückt habe. Das funktioniert heute immer noch so und ich erspare es mir, dass hier noch einmal zu wiederholen. Einfach im verlinkten Artikel nachlesen.

Damit können wir uns die folgenden Firmwares installieren:

firmware_no_touch.bin habe ich oben schon vorgestellt. firmware_touch.bin ist die Version für das T-Display S3 mit Touch-Display.


ScreenDetection.bin: Ausgabe eines bunten LILYGO-Logos mit Blattwerk und Zeichensätzen auf dem Display sowie Debug-Daten zum Display über den seriellen Port. Hello T-Display-S3 33395 PWR:15 - should be 15 DC:7 - should be 7 RST:5 - should be 5 CS:6 - should be 6 RD:9 - should be 9 WR:8 - should be 8 DRIVER:7789 - should be 0x7789 WIDTH:170 - should be 170 HEIGHT:320 - should be 320 D0:39 - should be 39 D1:40 - should be 40 D2:41 - should be 41 D3:42 - should be 42 D4:45 - should be 45 D5:46 - should be 46 D6:47 - should be 47 D7:48 - should be 48 BL:38 - should be 38 TFT_BACKLIGHT_ON:1 - should be 1

Weitere Projekte auf der LilyGo GitHub-Seite mit Arduino IDE

Im Verzeichnis Examples auf der GitHub-Seite finden wir dann noch weitere Projekte, die scheinbar mit der Arduino IDE erstellt wurden, wie man an den .ino-Endungen erkennt, und im Source-Code vorliegen.

Von der Arduino IDE bin ich persönlich inzwischen weggekommen. Die V 1.8 war schon nicht sonderlich komfortabel mit "jedes mal Board einstellen", "keine Syntax-Vervollständigung", "nur eine Library für alle Projekte" etc. und die V 2.0 hat das Ruder auch nicht mehr rumgerissen.

Ich bin auf Studio Code mit Platform IO gewechselt und habe es keinen Tag bereut. Alles ist viel professioneller und wenn man sich erst einmal ein wenig auskennt, bequemer und einfacher. Siehe auch mein Artikel Taugt Visual Studio Code mit Platform IO als Ersatz für die die Arduino IDE?.

Ich kann euch nur anraten, diesen Schritt auch zu tun. Es lohnt sich. Aus verständlichen Gründe erkläre ich (ausführlicher im Video unten) alles aus PlatformIO-Sicht und nicht aus Arduino IDE-Sicht.

Die vorhandenen Arduino-Projekte können wir mittels PlatformIO importieren und somit für uns schnell nutzbar machen:



Erfreuerlicherweise gibt es bereits einen Board-Eintrag "LilyGo T-Display-S3", also genau das Board, was wir verwenden. Was könnte bequemer sein? Kein Board-URLs eingeben wie früher unter der Arduino-IDE. Dann wählen wir das Verzeichnis mit dem Source-Code, der uns interessiert und importieren ihn. Ich habe mir gleich das ganze GitHub-Archiv als .zip lokal heruntergeladen und entpackt und kann jetzt einen Projekt-Ordner lokal auswählen.

Die Projekte, die TFT_eSPI benutzen, zum Laufen bekommen

Die meisten Projekte setzen auf die TFT_eSPI-Library (mehr zu dieser Library in meinem Artikel ESP32-2432S028 mit 2.8" Touchscreen (Cheap Yellow Display) Programmierung des Displays mit der TFT_eSPI-Library) zur Ansprache des ST7789V-Displays. Also muss die eingebunden werden. Einige Projekte benutzen auch die OneButton-Library, um die beiden Buttons zu benutzen. Die platformio.ini sieht dann so aus:
[env:lilygo-t-display-s3] platform = espressif32 board = lilygo-t-display-s3 framework = arduino lib_deps = bodmer/TFT_eSPI @ 2.5.43 mathertel/OneButton @ 2.6.1

Damit ist Library-mäßig alles eingebunden. VS Code lädt sich die Libraries automatisch aus dem Internet und gleicht den Code dann darauf ab. Ein paar Compiler-Fehler verschwinden damit.

Das schöne an VS Code ist, dass es für jedes Projekt eine eigene Kopie der Library in genau der richtigen Version speichert. Diese Library-Daten können wir dann auch editieren - für jedes Projekt einzeln.

Und das müssen wir auch, möchten wir den Fehler Error! Please make sure <User_Setups/Setup206_LilyGo_T_Display_S3.h> is selected in <TFT_eSPI/User_Setup_Select.h> korrigieren.

Die TFT_eSPI-Library kennt nämlich zig von Displays. Sie ist das erste Mal zwar vielleicht ein wenig schwierig zu konfigurieren und man muss wissen, wo man was einstellen muss, aber man lernt sie schnell lieben. Denn sie unterstützt so viele Display-Typen und hat so viele Features, dass man fast immer auf sie zurückgreifen kann - was heißt, nicht jedes Mal eine andere Library-Sprache benutzten zu müssen und seinen Code wiederverwenden zu können, über fast alle Displays.

Wir tun also, wie uns gesagt: wir öffnen TFT_eSPI/User_Setup_Select.h per Doppelklick und kommentieren erstmal folgende Zeile aus, die ein 320x240px-Standard-Display definiert, das nicht unseres ist: //#include <User_Setup.h> // Default setup is root library folder Dann suchen wir die richtige Zeile für unser 320x170px ST7789V-Display, dass im T-Display-S3 verbaut ist. Netterweise sagt uns die Fehlermeldung gleich, dass es Eintrag Nummer 206 ist: #include <User_Setups/Setup206_LilyGo_T_Display_S3.h> // For the LilyGo T-Display S3 based ESP32S3 with ST7789 170 x 320 TFT Damit sollten alle Compiler-Fehler beseitigt sein und das Projekt fehlerfrei kompilieren und mit CTRL+ALT+U hochladbar sein. Evtl. vorher die Reset-Boot-Tastenkombination am ESP32 ausführen. Es geht aber meist ohne.

Sucht nach der Zeile tft.setRotation(3); und editiert sie, je nachdem, wo ihr die orangen Knöpfe haben wollt. Tragt eine 1 (steht meistens schon drin) für rechts and eine 3 für links ein. Sonst steht eure Ausgabe auf dem Kopf.

Die einzelnen Example-Projekte


TFT-Rainbow

Mit den obigen Tipps bekommen wir das Projekt schnell zum Laufen und können danach die Farbenfracht des Displays bewundern.

Der Hintergrund wird mit Regenbogenfarben gefüllt und dann werden ein paar Texte in unterschiedlichen Fonts angezeigt.


PCB-Clock

Eine nerdige Uhr, die dann doch mal die Uhrzeit für unsere Zeitzone korrekt anzeigt und zudem Datum und Wochentag. Der Rest der angezeigten Elemente macht auf nerdigen Hacker-Style im Platinen-Layout. Hat keine weitere Funktion, sieht aber cool und nerdig aus ;)


S3-Poker

Ja, ist es denn zu fassen? Da hat einer einen kleinen Pokerautomaten für das T-Display S3 programmiert. Es ist zwar winzig klein, aber spielbar.

Kleine Anleitung: Oben einmal klicken ist Karte wechseln. Oben zweimal klicken ist Karte festsetzen. Unten klicken ist geben. Außerdem kann ich mit der oberen Taste meinen Einsatz verdoppeln. Las Vegas für die Hosentasche.


Image Scroll

Diese kleine Demo lädt zunächst ein großes Bild, viel größer als der Bildschirm selbst, in den Speicher und scrollt es dann im Zickzack-Modus über den Bildschirm, sodass immer jeweils ein Teil zu sehen ist. Insgesamt bekommt man so das gesamte Bild zu sehen.

Voreingestellt ist eine Karte des deutschen Autobahnnetzes von ganz Deutschland. Alternativ kann man im Sourcecode auch noch eine Weltkarte aktivieren, die dann die unterschiedlichen Zeitzonen zeigt.

Video

In dem nachfolgenden Video auf YouTube könnt ihr das LilyGo T-Display S3 Board live in Aktion sehen. Ich zeige das SmartConfig-Tool, die einzelnen Firmwares und wie ihr sie heraus lädt. Und zudem, wenn ihr die Projekte in Visual Studio Code mit PlatformIO öffnet, kompiliert (Compiler-Fehler beseitigt) und ausführt.



Weitere, ausgewählte Firmwares


WeatherStation von VolosR

VolosR hat auf GitHub das Projekt tDisplayS3WeatherStation samt Source-Code bereitgestellt. Dabei handelt es sich um Wetter-Station, die ihre Daten über openweathermap.org bezieht. Einen API-Key kann man dort bekommen und ihn dann in den Source-Code einbinden. Bis 1000 Aufrufe täglich sollte dieser kostenlos sein. Das dürfte für den Privatgebrauch mehr als genug sein und reicht für eine Abfrage alle 2 Minuten aus.

Man kann seine Heimatstadt im Source hinterlegen und es werden dann dafür Temperatur, Uhrzeit, Luftfeuchte, Luftdruck und Windgeschwindigkeit sowie eine kurze Wetterbeschreibung auf englisch angezeigt. Als Besonderheit gibt es eine Verlaufs-Anzeige der Temperatur über die letzten 12 Stunden als Balkendiagramm.


Da ich die Stunden-Balken-Grafik nicht so sonderlich interessant fand, habe ich mir wichtigeren Daten Vorrang gegeben, die ebenfalls mit der Wetter-API übertragen werden: Bewölkung (Cloudiness) und die lokalen Sonnenaufgangs sowie Sonnenuntergangs- Zeiten. Die gefühlte Temperatur (Felt) hat noch oben links Platz gefunden.

Und die Schrift des Scrollers war mir zu winzig, also habe ich den ein wenig größer gemacht und das Ganze neu arrangiert. Außerdem bekommt die Temperatur noch eine Farbe: blau für kalt und rot für heiß, plus die entsprechenden Abstufungen. Jetzt gefällt es mir. So kann es bleiben.

Weiterlesen

Dieses und andere Boards, die auf den neuen ESP-Varianten ESP-Sx, ESP-Cx, ESP-Px basieren findet ihr in dieser Auflistung gegenübergestellt.

Einen Vergleich der Eckdaten der neuen Espressif ESP-Varianten wie ESP32-S2, ESP-S3 oder ESP32-C3 und ESP32-C6 findet ihr unter diesem Link.

Und eine Auflistung der auf den neuen ESP-Varianten ESP-Sx, ESP-Cx, ESP-Px basierenden Boards sind hier zu finden.



Quellen, Literaturverweise und weiterführende Links