Bei AliExpress habe ich ein sehr interessantes Mikrocontroller-Board auf Basis des ESP32 S3 mit integriertem Display entdeckt. Es ist interessant, da es zum Zeitpunkt meines Kaufes nur 9,26 Euro gekostet hat und das Display mit 320 * 170 Pixeln scheinbar das Gleiche ist, wie beim neuen LilyGo T-Display. Wer mein Blog kennt, weiß, das ich schon seit Jahren einige Programme für das alte TTGO T-Display entwickelt habe. Mit dieser Erfahrung im Hintergrund betrachte ich das neue LilyGo T-Display als Ablösung dafür und werde vermutlich in Zukunft eher dafür entwickeln. Wenn dann allerdings ein ganz ähnliches Board für wesentlich weniger Geld zu bekommen ist, könnte es sein, dass ich eher dieses verwende. Darum habe ich mir eines bestellt und ausprobiert.
Programmierung
Wie immer habe ich gleich versucht es zu programmieren und wie fast immer, gab es dabei ein paar Probleme zu überwinden. Da ich mittlerweile einige Programme für den ESP32 entwickelt habe, die zur Anzeige von Informationen auf dem Display die ‚TFT_eSPI‘-Bibliothek von Bodmer verwenden, habe ich versucht meine für diese Bibliothek angepasste Tetris-Version auf dem Mikrocontroller zum Laufen zu bringen. In einem ersten Versuch habe ich einfach das für die LilyGo Version entwickelte Tetris auf das neue Board losgelassen. Was selbstverständlich fehl schlug. Also habe ich den auf der Angebotsseite befindlichen Link angeklickt und nach Eingabe eines ebenfalls auf der Angebotsseite befindlichen Passwortes, sowie der üblichen Roboterabwehr, erhältliche Entwicklerpaket heruntergeladen und darin gestöbert. Dabei ist mir aufgefallen, dass der Hersteller wohl den Einsatz der LVGL-Bibliothek favorisiert und es darum nicht viel zur TFT_eSPI-Bibliothek zu finden gibt.
In vielen ähnlichen Fällen reicht es aber die zur Ansteuerung des Displays verwendeten PINs heraus zu finden und diese in einer der von TFT_eSPI mitgelieferten ‚User_Setups‘ zu verwenden. Tatsächlich fand ich im Arduino-Programm ‚PDQgraphicstest.ino‘ die entsprechenden Informationen, aber scheinbar gibt es noch deutlich mehr Unterschiede.
Die PINs fand ich ab Zeile 23:
#define TFT_BL 14
Arduino_DataBus *bus = new Arduino_ESP32SPI(11 /* DC */, 10 /* CS */, 12 /* SCK */, 13 /* MOSI */, GFX_NOT_DEFINED /* MISO */);
Nachdem ich in der aktuellen Version von TFT_eSPI über die Datei ‚User_Setup_Select.h‘ verschiedene Setups ausprobiert hatte, wobei ich natürlich jedes Mal die zugehörige Datei im Ordner ‚User_Setups‘ entsprechend anpasste, sich aber auf dem Display einfach keine farbigen Blöcke zeigten, wollte ich schon fast aufgeben. Weitere Recherchen im Internet und im umfangreichen Entwicklungspaket brachten mich dann aber dazu einen allerletzten Versuch mit der zufällig in der Library-Liste der Arduino IDE entdeckten ‚TFT_eSPI_ESP32Lab‘-Bibliothek von Bodmer zu machen! Als ich diese über den Library Manager versuchte zu installieren, wurde mir angeboten auch abhängige Bibliotheken wie ‚ESP32Lab‘ zu installieren, welches ich auch annahm. Bei einem zweiten Versuch lies ich die ESP32Lab Bibliothek weg und mein Programm lies sich auch ohne kompilieren.
In der Datei ‚User_Setup-Select.h‘ kommentierte ich die Zeile 30
//#include <User_Setup.h>
aus und die Zeile 102
#include <User_Setups/Setup72_ESP32_ST7789_172x320.h>
ein.
Die Datei ‚Setup72_ESP32_ST7789_172x320.h‘ änderte ich wie nachfolgend gezeigt ab:
// Support for 1.47" 320x172 Round Rectangle Color IPS TFT Display
#define USER_SETUP_ID 71
#define ST7789_DRIVER // Full configuration option, define additional parameters below for this display
#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
#define TFT_WIDTH 172 // ST7789 172 x 320
#define TFT_HEIGHT 320 // ST7789 240 x 320
#define TFT_BL 14 // LED back-light control pin
#define TFT_BACKLIGHT_ON HIGH // Level to turn ON back-light (HIGH or LOW)
#define TFT_MOSI 13
#define TFT_SCLK 12
#define TFT_CS 10 // Chip select control pin
#define TFT_DC 11 // Data Command control pin
#define TFT_RST 1 // Reset pin (could connect to RST pin)
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
#define SPI_FREQUENCY 27000000
Genauer:
- TFT_BL 14 // LED back-light control pin
- TFT_MOSI 13
- TFT_SCLK 12
- TFT_CS 10 // Chip select control pin
- TFT_DC 11 // Data Command control pin
- TFT_RST 1 // Reset pin (could connect to RST pin)
Mit diesen Änderungen konnte ich mein Tetris zum Laufen bringen! Auch der in meinem Artikel zum TTGO T-Display S3 gezeigte Code läuft mit diesen Änderungen auf dem AliExpress Board:
#include <TFT_eSPI.h> #define SCREENWIDTH 170 #define SCREENHEIGHT 320 TFT_eSPI tft = TFT_eSPI(); void setup() { tft.init(); tft.setRotation(3); setBacklight(255); tft.setTextSize(2); tft.setTextColor(TFT_WHITE); tft.fillScreen(TFT_BLACK); tft.drawString("Hello World!", 100, 75); delay(2000); } void loop() { uint32_t color; switch (random(6)) { case 0: color = TFT_RED; break; case 1: color = TFT_GREEN; break; case 2: color = TFT_BLUE; break; case 3: color = TFT_YELLOW; break; case 4: color = TFT_NAVY; break; case 5: color = TFT_ORANGE; break; } tft.fillRoundRect(random(SCREENHEIGHT), random(SCREENWIDTH), 50, 50, 4, color); delay(100); } void setBacklight(int brightness) { ledcSetup(0, 10000, 8); // PWM channel 1, 1000Hz, 8 bit ledcAttachPin(TFT_BL, 0); // attach to TFT backlight ledcWrite(0, brightness); // set backlight }
Was mir noch aufgefallen ist
Auf dem Board befinden sich ganz ähnlich wie beim alten TTGO T-Display und auch dem neuen TTGO T-Display S3 unterhalb des Displays 2 Taster. Beschriftet sind sie mit ‚Reset‘ und ‚Boot‘. Bis jetzt habe ich nur den Boot-Taster in meinen Programmen nutzen können. Der Reset-Taster scheint nicht in eigenen Programmen verwendbar zu sein, was das Board für einige meiner Programme unbrauchbar macht. Und leider ist das Board auch nicht so schön gelb, wie es auf der Seite von AliExpress präsentiert wird.
Beim ersten Versuch über die Arduino IDE ein kompiliertes Programm auf das Board upzuloaden, kann es helfen die beiden Taster zusammen kurz zu drücken! Nach einem ersten erfolgreichen Upload ist das aber nicht mehr notwendig.
Im Titel befindet sich das Kürzel ‚HMI‘ und anfangs wusste ich nicht was damit gemeint war, später fand ich heraus das es mit ESP-HMI vermutlich eine direkt von Espressiv unterstützte Möglichkeit zur Interaktion mit dem Mikrocontroller gemeint ist. Im Entwickler-Paket finden sich ein paar Beispiele dazu auf LVGL Basis. Aber so ganz klar ist mir das noch nicht und ich habe auch nicht vor das weiter zu erforschen. Zumindest im Moment nicht.
Das Board ist relativ flach, gerade im Vergleich mit dem LilyGo-Board, welches ja einen dicken Kunststoffrahmen besitzt, in dem das Display eingebettet ist. Flach ist hier aber positiv gemeint. Dafür ist die Platine deutlich breiter. Ein weiterer Nachteil ist das Fehlen des 1.25 mm JST-Anschlusses samt dem zugehörigen Ladecontroller für einen LiPo-Akku, den die LilyGo Boards haben.
Serial.println ()
Bei den Programmierversuchen ist mir irgendwann aufgefallen, dass keine über ‚Serial.println()‘ durchgeführten Meldungen im Ausgabefenster ‚Serial Monitor‘ erschienen sind. Das hat mich noch einmal einiges Recherche und Herumprobieren gekostet, bis ich auf des Rätsels Lösung kam: Obwohl an verschiedenen Stellen im Internet anders beschrieben, ist es erforderlich in der Arduini IDE unter den Menüpunkt ‚Tools->USB CDC On Boot‘ auf ‚Disabled‘ zu stellen. Wenn ich dann einmal neu kompiliere und hochlade, klappt es wieder mit der seriellen Schnittstelle.
Fazit
In der Summe wirkt es nicht so hochwertig wie das LilyGo-Board, welches mit seinem Displayrahmen, dem LiPo-Anschluss und den verwendbaren Tastern doch einiges mehr bietet. Gerade die fehlende Akku Unterstützung und der eine fehlende Taster machen es letztlich schwächer, als das alte TTGO T-Display. Wer aber nur eine schicke Anzeige benötigt, kann mit dem Board glücklich werden. Im Moment ist es sehr günstig und damit von mir ein Geheimtipp für Euch.