Hallo,
ich komme bei meinem Projekt nicht weiter, ein 240x320px TFT Display (ILI9341) mit einem ESP32C3 Dev Module (eines "T-Keyboards") anzusprechen. Ich nutze die Arduino IDE 2.1.0 und bekomme den ESP zum Laufen, was ich daran sehe, dass ich Ausgaben von meinem Programm über den seriellen Monitor bekomme.
Der ESP des T-Keyboards ist auf eine Platine gelötet, auf der auch ein kleines 40x160px TFT Display verlötet ist, welches ein 8 pin expansion interface hat (da steht 7pin, aber es ist ein 8pin Stecker, der 8. PIN der expansion Buchse liegt neben GND und ist mit LED gelabelt).
Aus der Doku fürs Originaldisplay erkenne ich die Verschaltung mit dem ESP:
PIN
TFT_MISO |-1
TFT_MOSI | 10
TFT_SCLK | 20
TFT_CS | -1
TFT_DC | 2
TFT_RST | -1
TFT_BL | 8
Ich verstehe das so, dass
- TFT_MOSI an ESP PIN 10
- TFT_SCLK an ESP PIN 20
- TFT_DC an ESP PIN 2
- TFT_BL an ESP PIN 8
liegt und die anderen TFT PINS nicht vom ESP gesteuert werden, weil "-1".
Kann ich mit den wenigen PINs überhaupt das 240x320px TFT Display (ILI9341) betreiben?
Ich versuche es mit der Adafruit ILI9341 Arduino Library und dem Samplecode graphicstest.ino, in dem es heißt
// For the Adafruit shield, these are the default.
#define TFT_DC 9
#define TFT_CS 10
// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// If using the breakout, change pins as desired
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
Das verstehe ich leider nicht. Ich habe etwas rumprobiert, aber das meiste was ich geschafft habe, ist, dass das Display bei den einzelnen Schritten an und aus geht (alle/keine Pixel leuchten), aber es wird nichts dargestellt.
Was ich versucht habe:
// For the Adafruit shield, these are the default.
//#define TFT_DC 9
//#define TFT_CS 10
// die PIN config für das Adafruit shield habe ich auskommentiert und dafür
// die PIN config vom T-Keyboard übernommen:
#define TFT_MISO -1
#define TFT_MOSI 10//21
#define TFT_SCLK 20//22
#define TFT_CS -1//18 // Chip select control pin
#define TFT_DC 2 // Data Command control pin
#define TFT_RST -1//27
#define TFT_BL 8//4
// so passiert gar nix:
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST, TFT_MISO);
// so blinkt es zumindest:
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_MOSI, TFT_SCLK, TFT_DC, TFT_BL);
// so blinkt es auch nur:
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_DC, TFT_MOSI, TFT_SCLK, TFT_BL);
// fürht zu "Compilation error: cannot allocate an object of abstract type 'Adafruit_SPITFT'":
// Adafruit_SPITFT tft = Adafruit_ILI9341(TFT_MOSI, TFT_SCLK, TFT_DC, TFT_BL);
// so leuchtet es nur durchgängig:
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_BL);
// so passiert wieder gar nix:
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK);
Kann mir evtl. jemand weiterhelfen zu verstehen, was da genau passiert, wenn man die Instanz vom Display erstellt? Ich habe auch versucht etwas aus der class zu verstehen (da kam der Versuch mit dem compilation error her):
class Adafruit_ILI9341 : public Adafruit_SPITFT {
public:
Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _MOSI, int8_t _SCLK,
int8_t _RST = -1, int8_t _MISO = -1);
Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _RST = -1);
#if !defined(ESP8266)
Adafruit_ILI9341(SPIClass *spiClass, int8_t dc, int8_t cs = -1,
int8_t rst = -1);
#endif // end !ESP8266
Adafruit_ILI9341(tftBusWidth busWidth, int8_t d0, int8_t wr, int8_t dc,
int8_t cs = -1, int8_t rst = -1, int8_t rd = -1);
aber hier verstehe ich leider die ganze Syntax überhaupt nicht. Bedeutet das, dass nur CS, DC, MOSI, SCLK zwingend erforderlich sind und RST, MISO nicht (weil "-1")? Ich habe CS und RESET aktuell gar nicht verkabelt mit der Annahme, dass die (PIN = -1) gar nicht angesteuert werden. Stimmt das, oder liege ich da vlt schon völlig falsch?
In der Library des T-Displays habe ich neben der class noch gefunden:
#define SPI_FREQUENCY 40000000
#define DC_C digitalWrite(TFT_DC, LOW)
#define DC_D digitalWrite(TFT_DC, HIGH)
#if (TFT_CS==-1)
#define CS_L ;//digitalWrite(TFT_CS, LOW)
#define CS_H ;//digitalWrite(TFT_CS, HIGH)
#else
#define CS_L digitalWrite(TFT_CS, LOW)
#define CS_H digitalWrite(TFT_CS, HIGH)
#endif
#if (TFT_RST==-1)
#define RST_L ;//digitalWrite(TFT_RST, LOW)
#define RST_H ;//digitalWrite(TFT_RST, HIGH)
#else
#define RST_L digitalWrite(TFT_RST, LOW)
#define RST_H digitalWrite(TFT_RST, HIGH)
#endif
und mich gefragt, ob ich das auch übernehmen muss…
Ich wäre sehr dankbar, wenn mir jemand einen nützlichen Tipp geben könnte