TTGO T-Display – Hello World!

Auf Banggood haben sie schon wieder ein neues ESP32-Board vorgestellt. Es gefällt mir sehr gut. Es ist sehr kompakt, hat ein Farb-Display mit 135 x 240 Pixeln, 2 Taster und – (!) – einen USB-C Anschluss! Ich habe mir gleich einmal 2 Stück für je 7,16 Euro bestellt. Diese Woche sind sie angekommen und das erste was ich üblicherweise mit neuen ESP32-Boards mache, ist ein Stück Code zum Laufen zu bringen, das alle, oder zumindest die entscheidenden, Features anspricht.

Ergänzung vom 26.02.2024:

Mittlerweile ist es ganz einfach: Sucht Euch die Datei ‘User_Setup_Select.h’ im Verzeichnis der TFT_eSPI Library:

C:\Users\USER\Documents\Arduino\libraries\TFT_eSPI

Kommentiert Zeile 27 (//#include <User_Setup.h>) aus. Entfernt in Zeile 58 (#include <User_Setups/Setup25_TTGO_T_Display.h) die beiden Kommentarstriche (//) und startet die IDE neu. Danach könnt Ihr mit der Library arbeiten.

TTGO T-Display

Das ist oft gar nicht so schwer, weil die Hersteller natürlich daran interessiert sind, dass einem das nicht sonderlich schwer fällt. Denn sonst würde das Board ja niemand mehr kaufen. Aber manchmal, vor allem wenn man schon mehrere Jahre eine Arduino-Installation hat und in der Zwischenzeit unzählige Boards getestet, zahllose Bibliotheken installiert, Experimente gemacht und Programme gecodet hat, gibt es unvorhergesehene Probleme.

Heute schreibe ich Euch einfach einmal, wie das beim TTGO T-Display war.

Oft geben die Hersteller auf der Banggood Seite mit dem Produkt einen Verweis an, der direkt auf ein passendes GitHub Projekt führt. Beim TTGO T-Display war das leider nicht der Fall. Also einfach einmal ‘TTGO T-Display’ in Google eingegeben und schon der zweite Eintrag führt zum GitHub Projekt direkt zur Datei ‘TTGO-T-Display.ino’. 🙂

https://github.com/Xinyuan-LilyGO/TTGO-T-Display

Jetzt noch schnell oben auf den Projektnamen geklickt und man kommt zur Hauptseite des Projekts. Dort hole ich mir mit einem Klick auf den grünen Button ‘Clone or download’ und anschließendem Klick auf ‘Download ZIP’ das komplette Projekt als ZIP-Datei auf meinen Rechner.

Dieses entpacke ich und kopiere den Inhalt in mein Projekt-Verzeichnis für ESP32 Projekte. Dabei muss darauf geachtet werden, dass das ‘-master’ im Projektnamen des Projektverzeichnisses entfernt wird!

Anschließend öffnete ich die ‘ino’-Datei im Projekt mit der Arduino IDE und versuchte das Projekt zu kompilieren. Klappte natürlich nicht, da eine Bibliothek gefehlt hat.

TTGO-T-Display:5:21: error: Button2.h: No such file or directory

Ich versuchte ‘Button2’ direkt über ‘Sketch->Bibliotheken einbinden->Bibliotheken verwalten…’ zu installieren. Was leider misslang, da es dort im Dialog über die Suchfunktion nicht möglich war, die Bibliothek ausfindig zu machen.

Also gab ich ‘Arduino Button2’ in Google ein und schon der erste Eintrag führte direkt zum gesuchten Projekt von Lennart Hennings!

https://github.com/LennartHennigs/Button2

Downgeloadet, entpackt und nach ‘C:\Users\USER\Documents\Arduino\libraries’ kopiert. Die Arduino IDE beendet, gleich wieder gestartet und noch einmal kompiliert. Diesmal klappte es und der kompilierte Code wurde auch gleich auf das Board hochgeladen und gestartet. Das Ergebnis? Nichts, ein schwarzes Display!

Hhmm, jetzt sah ich mir einzeln über die Bibliotheksverwaltung die Bibliotheken an. Die ‘TFT_eSPI’-Bibliothek hatte ich schon von einem früheren Projekt installiert gehabt. Allerdings war es die Version 1.3.6 und mittlerweile gab es schon die Version 1.4.16! Also einfach einmal die aktuelle Version installiert und noch einmal kompiliert.

Immer noch schwarz!

Also die Bibliothek war es wohl nicht. Jetzt begann ich wieder im Internet zu stöbern und auch die README.MD genauer zu lesen, das hatte ich vorher nämlich nicht gemacht. Dort fand ich zwei entscheidende Sätze:

  • Move or copy User_Setups/TTGO_T_Display.h to TFT_eSPI/User_Setups/
  • Add #include <User_Setups/TTGO_T_Display.h> to TFT_eSPI/User_Setup_Select.h

Danach sah die Sache schon wesentlich besser aus! Das Display wurde angesprochen, bunte Rechtecke und etwas Text erschien, aber irgendwie sah das alles ein bisschen zerstückelt aus und nicht so, wie es ausgesehen hatte, als ich das Board zum ersten Mal eingeschaltet und noch der Hersteller-Code darauf lief.

Übrigens erklären diese beide Zeilen auch, wie man generell mit verschiedenen Displays, die von der Bibliothek ‘TFT_eSPI’ unterstützt werden, umgehen muss! Existiert bei einem Projekt eine Datei für die Bibliothek, so muss sie nach ‘User_Setups’ kopiert und in der TFT_eSPI Datei ‘User_Setup_Select.h’ inkludiert werden!

Da der Code aber problemlos kompiliert, auf das Board geladen wurde und auch schon nahezu funktioniert hatte, tippte ich als nächstes auf einen Fehler im Sourcecode.

Ich änderte die Auflösung in der Zeile:

TFT_eSPI tft = TFT_eSPI(135, 240); // Invoke custom library

Ich probierte Werte von 0 bis 3 in den beiden Zeilen mit:

tft.setRotation(1);

Aber nichts half. Also wieder zurück zu Google. Dort fand ich ein Video:

Das Video zeigte mir nichts Neues, dafür aber der Text darunter:

IMPORTANT NOTE: Comment this line of code #define ILI9341_DRIVER in /User_Setup.h

Überraschenderweise führte dies zu noch viel mehr Fehlern. Hier ein kleiner Ausschnitt davon:

C:\Users\Thomas Ell\Documents\Arduino\libraries\TFT_eSPI\TFT_eSPI.cpp: In member function 'void TFT_eSPI::init(uint8_t)':

C:\Users\Thomas Ell\Documents\Arduino\libraries\TFT_eSPI\TFT_eSPI.cpp:369:21: error: 'TFT_SWRST' was not declared in this scope

else writecommand(TFT_SWRST); // Software reset

Was war das nun wieder? Nun begann ich selbst ein bisschen nachzudenken. Muss man nicht vielleicht für das Auskommentieren eines Treibers für einen bestimmten Display-Typ einen anderen hinein nehmen? Auf der Produktseite steht, dass das Display vom Typ IPS ST7789V ist. Also einfach einmal in der Datei ‘User_Setup.h’ nach ‘ST7789’ gesucht! Und auch prompt fündig geworden. Es gibt eine auskommentierte Zeile:

//#define ST7789_DRIVER

Flugs die beiden ‘//’ am Anfang entfernt, gespeichert und noch einmal kompiliert.

Hurra! Alles funktioniert wie es soll! Das ‘Hello World’ ist fertig und ich kann daran gehen, individuelle Programme für das neue Board zu entwickeln!

Hab gerade gesehen, dass es das Board scheinbar auch bei Amazon gibt:

15 Kommentare

  1. Danke für den Beitrag. Heute kam das Modul und am Wochenende will ich mich damit etwas einarbeiten.
    Das hier spart mir viel Zeit. Danke noch einmal.

    Bleib gesund !

  2. Hallo Uwe
    ich hänge hier irgendwie fest. Ichwill den Colout_Test auf dem Board zum laufen bringen, um dann igendwie damit weiter zu entwickeln. Ich muss aberauch sagen das ich bis jetzt noch nie mit Pixel-Displays zu tun hatte.
    Also habe ich deinen Artikel gelesen und finde die information auch sehr hilfreich. Habe in der User_Setup.h auch die betreffende Zeile die Kommentarzeichen entfernt.
    Leider hat mir das nichts gebracht, das display ist immer noch Schwarz
    Ich hänge dir mal den Quellcode in der hoffnung das du mir mal einen tipp geben kannst was ich da falsch mache
    vielen dank im vorraus
    Henry

    // Diagnostic test for the displayed colour order
    //
    // Writen by Bodmer 17/2/19 for the TFT_eSPI library:
    // https://github.com/Bodmer/TFT_eSPI

    /*
    Different hardware manufacturers use different colour order
    configurations at the hardware level. This may result in
    incorrect colours being displayed.

    Incorrectly displayed colours could also be the result of
    using the wrong display driver in the library setup file.

    Typically displays have a control register (MADCTL) that can
    be used to set the Red Green Blue (RGB) colour order to RGB
    or BRG so that red and blue are swapped on the display.

    This control register is also used to manage the display
    rotation and coordinate mirroring. The control register
    typically has 8 bits, for the ILI9341 these are:

    Bit Function
    7 Mirror Y coordinate (row address order)
    6 Mirror X coordinate (column address order)
    5 Row/column exchange (for rotation)
    4 Refresh direction (top to bottom or bottom to top in portrait orientation)
    3 RGB order (swaps red and blue)
    2 Refresh direction (top to bottom or bottom to top in landscape orientation)
    1 Not used
    0 Not used

    The control register bits can be written with this example command sequence:

    tft.writecommand(TFT_MADCTL);
    tft.writedata(0x48); // Bits 6 and 3 set

    0x48 is the default value for ILI9341 (0xA8 for ESP32 M5STACK)
    in rotation 0 orientation.

    Another control register can be used to “invert” colours,
    this swaps black and white as well as other colours (e.g.
    green to magenta, red to cyan, blue to yellow).

    To invert colours insert this line after tft.init() or tft.begin():

    tft.invertDisplay( invert ); // Where invert is true or false

    */

    #include

    #include // Hardware-specific library

    TFT_eSPI tft = TFT_eSPI(); // Invoke custom library

    void setup(void) {
    tft.init();

    tft.fillScreen(TFT_BLACK);

    // Set “cursor” at top left corner of display (0,0) and select font 4
    tft.setCursor(0, 0, 4);

    // Set the font colour to be white with a black background
    tft.setTextColor(TFT_WHITE, TFT_BLACK);

    // We can now plot text on screen using the “print” class
    tft.println(“Intialised default\n”);
    tft.println(“White text”);

    tft.setTextColor(TFT_RED, TFT_BLACK);
    tft.println(“Red text”);

    tft.setTextColor(TFT_GREEN, TFT_BLACK);
    tft.println(“Green text”);

    tft.setTextColor(TFT_BLUE, TFT_BLACK);
    tft.println(“Blue text”);

    delay(5000);

    }

    void loop() {

    tft.invertDisplay( false ); // Where i is true or false

    tft.fillScreen(TFT_BLACK);

    tft.setCursor(0, 0, 4);

    tft.setTextColor(TFT_WHITE, TFT_BLACK);
    tft.println(“Invert OFF\n”);

    tft.println(“White text”);

    tft.setTextColor(TFT_RED, TFT_BLACK);
    tft.println(“Red text”);

    tft.setTextColor(TFT_GREEN, TFT_BLACK);
    tft.println(“Green text”);

    tft.setTextColor(TFT_BLUE, TFT_BLACK);
    tft.println(“Blue text”);

    delay(5000);

    // Binary inversion of colours
    tft.invertDisplay( true ); // Where i is true or false

    tft.fillScreen(TFT_BLACK);

    tft.setCursor(0, 0, 4);

    tft.setTextColor(TFT_WHITE, TFT_BLACK);
    tft.println(“Invert ON\n”);

    tft.println(“White text”);

    tft.setTextColor(TFT_RED, TFT_BLACK);
    tft.println(“Red text”);

    tft.setTextColor(TFT_GREEN, TFT_BLACK);
    tft.println(“Green text”);

    tft.setTextColor(TFT_BLUE, TFT_BLACK);
    tft.println(“Blue text”);

    delay(5000);
    }

  3. Hi Henry,
    in Deinem Code fehlt bei ‘include’ die Angabe von TFT_eSPI.h in spitzen Klammern. Es kann aber auch sein, dass WordPress das beim Einsetzen hier in den Kommentar entfernt hat. Bei mir läuft der Code jedenfalls mit der Änderung.

    Entferne die beiden Zeilen mit ‘include’ in Deinem Code und füge folgende Zeile ein:

    #include <TFT_eSPI.h>

    Dann sollte es klappen.

  4. Warum so kompliziert?

    Als Board ESP32 Dev Module auswählen.
    Die User_Setup.h lesen und verstehen – folgendes auskommentieren:
    #define ST7789_DRIVER
    #define TFT_WIDTH 135
    #define TFT_HEIGHT 240 // ST7789 240 x 240

    in der User_Setup.h auch noch die richtigen Pin Defines einstellen:
    // ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ######
    Hier für das TTGO Board:
    #define TFT_MOSI 19
    #define TFT_SCLK 18
    #define TFT_CS 5
    #define TFT_DC 16
    #define TFT_RST 23
    #define TFT_BL 4 // Display backlight control pin

    #define ADC_EN 14 //ADC_EN is the ADC detection enable port
    #define ADC_PIN 34
    #define BUTTON_1 35
    #define BUTTON_2 0

    Dann die Datei User_Setup_Select.h lesen und verstehen – folgendes auskommentieren:
    #include // Setup file for ESP32 and TTGO T-Display ST7789V SPI bus TFT

    Mit diesen Einstellungen funktionieren dann auch alle anderen TTGO Demo sketches ohne Änderungen.

    1. Hallo Henry,
      vielen Dank für Deinen Hinweis! Das ist ja nun ein älterer Erfahrungsbericht von mir. Mittlerweile habe ich für alle verschiedenen Displays eigene Konfigurationsdateien, die ich, wie von Dir beschrieben, ganz nach Bedarf inkludiere.
      Thomas

  5. Hi Tinkerpete,
    thx für diesen Beitrag.
    Hab lange selber rumgedoktort und das Teil einfach nicht zum Laufen gebracht.
    Bei mir wars das Problem, dass ich die Boards nicht im Boardverwalter integriert hatte.
    Da ist zwar standardmässig ein “ESP32 DEV Module” drin, aber mit dem hats nicht funktioniert.

    BTW: Hast du oder jemand anders das Teil auch schon unter ‘platformio’ zum Laufen gebracht?
    Ich programmiere nämlich lieber unter dieser IDE.

    1. Hi Johann,
      Hab das Board mit platformio am laufen.
      Ich hab die Einstellungen für das Board direkt in der platformio.ini drinnen (keine Änderung an der Lib TFT_eSPI erforderlich).
      plaftormio.ini:
      [env:esp32dev]
      platform = espressif32
      board = esp32dev
      framework = arduino
      lib_deps =
      bodmer/TFT_eSPI # for TTGO display
      build_flags =
      -DUSER_SETUP_LOADED
      -DST7789_DRIVER
      -DTFT_WIDTH=135
      -DTFT_HEIGHT=240
      -DCGRAM_OFFSET
      -DTFT_MOSI=19
      -DTFT_SCLK=18
      -DTFT_CS=5
      -DTFT_DC=16
      -DTFT_RST=23
      -DTFT_BL=4
      -DTFT_BACKLIGHT_ON=HIGH
      -DLOAD_GLCD
      -DLOAD_FONT2
      -DLOAD_FONT4
      -DLOAD_FONT6
      -DLOAD_FONT7
      -DLOAD_FONT8
      -DLOAD_GFXFF
      -DSMOOTH_FONT
      -DSPI_FREQUENCY=40000000
      -DSPI_READ_FREQUENCY=6000000

  6. Hallo,
    ich versuche mich auch gerade an den ESP Modulen und auch dem T-Display.
    Vorher hatte ich mit anderen Sachen gearbeitet, PIC-Microcontroller in Assembler und auch mit Bascom programmiert.
    Also irgendwie alles neu.
    Ich finde das aber fürchterlich, das zu solchen Modulen, speziell das mit dem T-Display nicht mal ein passender Link mit ein paar Codes und den Libs dabei ist.
    Gut das ich schon etwas damit gemacht hatte, und mich mit dem Grundprinzip und den Fehlern auskenne. Trotzdem ist das eine Qual in meinem Alter.
    Bei Freenove sind wenigstens verständliche Beispiele dabei (download)
    Wenn etwas funktioniert, kann man es auch leichter verstehen lernen.
    Ich werde das oben geschriebene nun auseinader klabüstern müssen, um auch das hin zu bekommen.
    Vielen Dank für alle Kommentare!! Auch mir hilft das weiter.
    Gruß Mario

  7. I have this exact board. it has been difficult finding info on it and it is not specifically listed in the arduino ide. I can get it to work but not with the display. I always get a compiling error when I load any sketch that involves TFT. I Tried making the changes to the user_setup files and the user_setup_select files per Henry’s recommendations, but I still get compiling errors whenever TFTfunctions are called. what else should I check. I have burnt hours trying to get this to work because it is so versatile and dirt cheap. Any suggestions?

Schreibe einen Kommentar zu Tinkerpete Antworten abbrechen

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