Seit Wochen liegt nun schon ein 2,4" TFT Display (RGB) mit einer Auflösung von 240 x 320 Pixeln bei mir. Das sollte in einem Projekt der Ersatz für ein OLED Display 128x64 1,3" mit I2C Ansteuerung sein.
Leider läuft das Projekt mit einem Arduino Nano, womit wir schon bei meinem ersten Problem wären, nämlich die Betriebsspannung.
Während ich das OLED mit 5V betreiben und direkt an die digitalen Ports des Nanos anschließen darf, muß das RGB TFT mit 3,3V betrieben und angesteuert werden. Weil ich keinen Pegelwandler da hatte und auch keine Spannungsteiler mit Widerstände bauen wollte, kam mir mein WEMOS D1 mini in den Sinn. Sollte ja kein so großes Problem sein - dachte ich mal wieder . Man findet ja alles im Netz, oder etwa nicht?
Die Dokumentation vom Lieferanten ist alles andere als rosig, man findet lediglich dieses hier:
1: GND (Leistungsmasse)
2: VCC (Stromversorgung ist 3,3 V)
3: CLK (Taktzeile)
4: MOSI (Dateneingabe)
5: RES (Reset-Zeile)
6: DC (Daten- / Befehlsauswahlzeile)
7: BLK (Hintergrundbeleuchtung)
8: MISO (Datenausgabe)
Also war wieder Detektivarbeit angesagt. Vor ein paar Wochen habe ich nach einem erfolglosen Wochenende aufgegeben.
Heute hat mich der Ehrgeiz gepackt und ich wollte den Stier bei den Hörnern packen. Aber nun hübsch der Reihe nach. Die ganze Suchrei und Fehlversuche erspare ich euch.
Was haben wir?
Einen WEMOS D1 mini und ein DollaTek 2.4 Zoll TFT SPI LCD-Modul ILI9341 Farbdisplay mit 8-poligem PCB-Bildschirm
Wir haben es bei dem Display mit einer SPI Schnittstelle und einem ILI9341 Treiber zu tun. Dafür gibt es passende Librarys. Einige habe ich erfolglos ausprobiert und bin schließlich beim Adafruit_ILI9341-master gelandet.
Eine andere Lib, die angeblich für die ESP-Plattform gedacht sein soll, lief nicht.
Mit der Library ist es aber nicht alleine getan, das Display muß auch richtig angeschlossen werden. Dummerweise werden häufig unterschiedliche Abkürzungen für denselben Anschluß verwendet. also muß man wieder rumsuchen.
Mein Display hat die Bezeichnungen CLK, MOSI, RES, DC, BLK, MISO.
Diese Anschlüsse werden alternativ auch (in Klammern) bezeichnet. CLK (SCK), MOSI (DIN, SDI), RES (RST, Reset), BLK (BL, Betriebsspannung Beleuchtung), MISO (SDO).
Angeschlossen werden die am WEMOS wie folgt:
CLK - D5; MOSI - D7; RES - D3; DC - D4; BLK - 3,3V; MISO - nicht angeschlossen.
Andere Display-Boards könnten auch so angeschlossen sein:
CS pin is connected to D2 (ESP8266EX GPIO4),
RST pin is connected to D3 (ESP8266EX GPIO0),
D/C pin is connected to D4 (ESP8266EX GPIO2),
MOSI pin is connected to D7 (ESP8266EX GPIO13),
SCK pin is connected to D5 (ESP8266EX GPIO14),
VCC and BL are connected to pin 3V3,
GND is connected to pin GND of the NodeMCU board.
Fehlt nur noch das passende Programm. Aus den Beispielen habe ich mir das Programm graphicstest.ino herausgefischt und geladen.
Vorsicht Falle! das Teil läuft so nicht und muß modifiziert werden. Diese Info ist mir bei meiner Sucherei auf der Seite https://simple-circuit.com/esp8266-nodemcu-ili9341-tft-display/
untergekommen. Die Modifikationen sind gleich ganz oben im Programm. Der Einfacheit halber stelle ich die Teile nur gegeneinander.
Original Adafruit (läuft aber so nicht am D1 mini !!!)
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
// 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);
Und hier die modifizierte version, die am D1 mini funktioniert!!
#include <Adafruit_GFX.h> // include Adafruit graphics library
#include <Adafruit_ILI9341.h> // include Adafruit ILI9341 TFT library
#define TFT_CS D2 // TFT CS pin is connected to NodeMCU pin D2
#define TFT_RST D3 // TFT RST / RES pin is connected to NodeMCU pin D3
#define TFT_DC D4 // TFT DC pin is connected to NodeMCU pin D4
// initialize ILI9341 TFT library with hardware SPI module
//SCK (CLK) ---> NodeMCU pin D5 (GPIO14)
//MOSI(DIN) ---> NodeMCU pin D7 (GPIO13)
// BLK an 3,3V VCC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
Mir kommt es hauptsächlich wieder auf die Ausgabe von Text an, darum habe ich mir eine komplett abgespeckte Programmversion ohne Grafikgezappel zusammengestrickt, bzw. das Überfrachtete graphicstest.ino ausgemistet.
Weil ich das Display aber lieber im Querformat nutzen möchte, brauchte es am Anfang noch eines kleinen Befehls, der da im Programm lautet:
tft.setRotation(1);
D.h., dass die Anzeige um 90° im Uhrzeigersinn gedreht wird und ich nun ein 320 x 240 Display habe.
Nun aber noch ein paar hilfreiche Fakten für das Display:
Es können 3 Textgrößen dargestellt werden.
Bei Textgröße 1 haben im Hochformat (240x320) 40 Zeichen in einer Reihe Platz.
Bei Textgröße 2 sind das 20 Zeichen, bei einer Zeichengröße von 14x10 Pixel
Textgröße 3 kommt gerade auf 13 Zeichen in einer Zeile
Textgröße 1 und 3 sind entweder zu klein (kaum lesbar) oder viel zu groß. Textgröße 2 scheint mir optimal.
Gibt man Text mit einem einfachen println Befehl aus, erzeugt das Display zwischen jeder Zeile einen Abstand von zwei Pixeln.
Das geht zwar, ist aber nicht so schön lesbar. Darum positioniere ich den Curser jeweils direkt in die gewünschte Zeile und zwar so, dass zwischen den zeilen Abstände von 4 Pixeln entstehen.
Die Zeilenposition wäre dann: 0, 18, 36, 54, 72, 90...usw. Pixel, allerdings passen dann im Querformat statt 15 Zeilen nur noch 13 Zeilen auf das Display.
Der Spaltenabstand passt schon, da bekommt man dann 25 zeichen in eine Reihe. Summa Sumarum hätte ich mit meiner Einstellung ein gut ablesbares 25 x 13 Display.
Das Sahnehäubchen ist die farbliche Darstellung. Im Prinzip wären ca. 65000 Farben möglich. Das gilt für den Hintergrund und den Vordergrund.
Allerdings ist nicht jede Farbkombi aus Hintergrund und Zeichenfarbe gut lesbar und somit zweckmäßig. Außerdem wird am rechten Rand (Querformat) eine klein Schwäche sichtbar. So scheint der Rand nicht richtig ausgeleuchtet und die Buchstaben stecken in so einer flauen matschigen Farbe. Bei meinen versuchen hat sich aber Schwarz und Blau als Hintergrundfarbe bewährt.
Es ist auch möglich, den Hintergrund mit einer Farbe zu Füllen, z.B. Rot, dann aber eine Zeichenfarbe mit einem eigenen Hintergrund einzustellen.
Der Befehl für setTextColor sieht dann im Programm z.B. so aus:
tft.setTextColor(ILI9341_ORANGE, ILI9341_BLUE); // Farbe der Schrift einstellen
Und so sah der Testaufbau aus. Die Farben der Zeichen werden auf dem Foto nicht richtig dargestellt.
Der nächste Schritt ist es nun, ein 2,4 GHz NRF24l01 Sendemodul am WEMOS D1 mini zum Laufen zu bekommen.
Leider läuft das Projekt mit einem Arduino Nano, womit wir schon bei meinem ersten Problem wären, nämlich die Betriebsspannung.
Während ich das OLED mit 5V betreiben und direkt an die digitalen Ports des Nanos anschließen darf, muß das RGB TFT mit 3,3V betrieben und angesteuert werden. Weil ich keinen Pegelwandler da hatte und auch keine Spannungsteiler mit Widerstände bauen wollte, kam mir mein WEMOS D1 mini in den Sinn. Sollte ja kein so großes Problem sein - dachte ich mal wieder . Man findet ja alles im Netz, oder etwa nicht?
Die Dokumentation vom Lieferanten ist alles andere als rosig, man findet lediglich dieses hier:
- Größe: 2.4 Zoll
- Treiber-IC: ILI9341
- Berührungsart: keine Berührung
- Auflösung: 240 x 320
- Kommunikationsschnittstelle: SPI
1: GND (Leistungsmasse)
2: VCC (Stromversorgung ist 3,3 V)
3: CLK (Taktzeile)
4: MOSI (Dateneingabe)
5: RES (Reset-Zeile)
6: DC (Daten- / Befehlsauswahlzeile)
7: BLK (Hintergrundbeleuchtung)
8: MISO (Datenausgabe)
Also war wieder Detektivarbeit angesagt. Vor ein paar Wochen habe ich nach einem erfolglosen Wochenende aufgegeben.
Heute hat mich der Ehrgeiz gepackt und ich wollte den Stier bei den Hörnern packen. Aber nun hübsch der Reihe nach. Die ganze Suchrei und Fehlversuche erspare ich euch.
Was haben wir?
Einen WEMOS D1 mini und ein DollaTek 2.4 Zoll TFT SPI LCD-Modul ILI9341 Farbdisplay mit 8-poligem PCB-Bildschirm
Wir haben es bei dem Display mit einer SPI Schnittstelle und einem ILI9341 Treiber zu tun. Dafür gibt es passende Librarys. Einige habe ich erfolglos ausprobiert und bin schließlich beim Adafruit_ILI9341-master gelandet.
GitHub - adafruit/Adafruit_ILI9341: Library for Adafruit ILI9341 displays
Library for Adafruit ILI9341 displays. Contribute to adafruit/Adafruit_ILI9341 development by creating an account on GitHub.
github.com
Mit der Library ist es aber nicht alleine getan, das Display muß auch richtig angeschlossen werden. Dummerweise werden häufig unterschiedliche Abkürzungen für denselben Anschluß verwendet. also muß man wieder rumsuchen.
Mein Display hat die Bezeichnungen CLK, MOSI, RES, DC, BLK, MISO.
Diese Anschlüsse werden alternativ auch (in Klammern) bezeichnet. CLK (SCK), MOSI (DIN, SDI), RES (RST, Reset), BLK (BL, Betriebsspannung Beleuchtung), MISO (SDO).
Angeschlossen werden die am WEMOS wie folgt:
CLK - D5; MOSI - D7; RES - D3; DC - D4; BLK - 3,3V; MISO - nicht angeschlossen.
Andere Display-Boards könnten auch so angeschlossen sein:
CS pin is connected to D2 (ESP8266EX GPIO4),
RST pin is connected to D3 (ESP8266EX GPIO0),
D/C pin is connected to D4 (ESP8266EX GPIO2),
MOSI pin is connected to D7 (ESP8266EX GPIO13),
SCK pin is connected to D5 (ESP8266EX GPIO14),
VCC and BL are connected to pin 3V3,
GND is connected to pin GND of the NodeMCU board.
Fehlt nur noch das passende Programm. Aus den Beispielen habe ich mir das Programm graphicstest.ino herausgefischt und geladen.
Vorsicht Falle! das Teil läuft so nicht und muß modifiziert werden. Diese Info ist mir bei meiner Sucherei auf der Seite https://simple-circuit.com/esp8266-nodemcu-ili9341-tft-display/
untergekommen. Die Modifikationen sind gleich ganz oben im Programm. Der Einfacheit halber stelle ich die Teile nur gegeneinander.
Original Adafruit (läuft aber so nicht am D1 mini !!!)
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
// 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);
Und hier die modifizierte version, die am D1 mini funktioniert!!
#include <Adafruit_GFX.h> // include Adafruit graphics library
#include <Adafruit_ILI9341.h> // include Adafruit ILI9341 TFT library
#define TFT_CS D2 // TFT CS pin is connected to NodeMCU pin D2
#define TFT_RST D3 // TFT RST / RES pin is connected to NodeMCU pin D3
#define TFT_DC D4 // TFT DC pin is connected to NodeMCU pin D4
// initialize ILI9341 TFT library with hardware SPI module
//SCK (CLK) ---> NodeMCU pin D5 (GPIO14)
//MOSI(DIN) ---> NodeMCU pin D7 (GPIO13)
// BLK an 3,3V VCC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
Mir kommt es hauptsächlich wieder auf die Ausgabe von Text an, darum habe ich mir eine komplett abgespeckte Programmversion ohne Grafikgezappel zusammengestrickt, bzw. das Überfrachtete graphicstest.ino ausgemistet.
C++:
/**********************************************************************
Interfacing ESP8266 NodeMCU with ILI9341 TFT display (240x320 pixel).
This is a free software with NO WARRANTY.
https://simple-circuit.com/
/**********************************************************************
/**********************************************************************
This is our GFX example for the Adafruit ILI9341 Breakout and Shield
----> http://www.adafruit.com/products/1651
Check out the links above for our tutorials and wiring diagrams
These displays use SPI to communicate, 4 or 5 pins are required to
interface (RST is optional)
**********************************************************************/
#include <Adafruit_GFX.h> // include Adafruit graphics library
#include <Adafruit_ILI9341.h> // include Adafruit ILI9341 TFT library
#define TFT_CS D2 // TFT CS pin is connected to NodeMCU pin D2
#define TFT_RST D3 // TFT RST / RES pin is connected to NodeMCU pin D3
#define TFT_DC D4 // TFT DC pin is connected to NodeMCU pin D4
// initialize ILI9341 TFT library with hardware SPI module
//SCK (CLK) ---> NodeMCU pin D5 (GPIO14)
//MOSI(DIN) ---> NodeMCU pin D7 (GPIO13)
// BLK an 3,3V VCC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
void setup() {
Serial.begin(9600);
Serial.println("ILI9341 Test!");
tft.begin();
}
void loop(void) {
Serial.println("Neues Schleife");
tft.setRotation(1);
tft.fillScreen(ILI9341_BLUE); // Bildschirm blau hinterlegen
tft.setTextSize(2); // Schriftgröße einstellen 1 - 40 Zeichen pro Zeile, 2 - 20 Zeichen pro zeile, 3 - 13 zeichen pro Zeile
// Schriftgroße 2 hat Hoehe x Breite = 14 x 10 Pixel
tft.setCursor(0, 0); // Cursor auf oben links setzen Spalte, Zeile in Pixel
tft.setTextColor(ILI9341_YELLOW); // Farbe der Schrift einstellen
//tft.println("1. Zeile #");
tft.println("01234567890123456789012345");
tft.setCursor(0, 18);
tft.println("Groesse 2 Gelb/ X");
tft.setTextColor(ILI9341_RED); // Farbe der Schrift einstellen
tft.setCursor(0, 36);
tft.println("Groesse 2 Rot/#");
tft.setTextColor(ILI9341_GREEN); // Farbe der Schrift einstellen
tft.setCursor(0, 54);
tft.println("Groesse 2 Gruen/");
tft.setTextColor(ILI9341_WHITE); // Farbe der Schrift einstellen
tft.setCursor(0, 72);
tft.println("Groesse 2 Weiss");
// tft.fillScreen(ILI9341_WHITE); // Bildschirm blau hinterlegen
tft.setTextColor(ILI9341_GREENYELLOW); // Farbe der Schrift einstellen
tft.setCursor(0, 90);
tft.println("XXXXXXXXXXXXXXXXXXXX");
tft.println("YXYXYXYXYXYXYXYXYXYX");
tft.println("ZFZFZFZFZFZFZFZFZFZF");
tft.println("===$$$%%%???**'++<>^");
delay(20000);
tft.fillScreen(ILI9341_BLACK); // Bildschirm schwarz hinterlegen
tft.setCursor(0, 0); // Cursor auf oben links setzen
tft.setTextColor(ILI9341_ORANGE); // Farbe der Schrift einstellen
for (byte i = 1; i<21; i++){
tft.print("Zeile: "); tft.println(i);
}
delay(1000);
}
tft.setRotation(1);
D.h., dass die Anzeige um 90° im Uhrzeigersinn gedreht wird und ich nun ein 320 x 240 Display habe.
Nun aber noch ein paar hilfreiche Fakten für das Display:
Es können 3 Textgrößen dargestellt werden.
Bei Textgröße 1 haben im Hochformat (240x320) 40 Zeichen in einer Reihe Platz.
Bei Textgröße 2 sind das 20 Zeichen, bei einer Zeichengröße von 14x10 Pixel
Textgröße 3 kommt gerade auf 13 Zeichen in einer Zeile
Textgröße 1 und 3 sind entweder zu klein (kaum lesbar) oder viel zu groß. Textgröße 2 scheint mir optimal.
Gibt man Text mit einem einfachen println Befehl aus, erzeugt das Display zwischen jeder Zeile einen Abstand von zwei Pixeln.
Das geht zwar, ist aber nicht so schön lesbar. Darum positioniere ich den Curser jeweils direkt in die gewünschte Zeile und zwar so, dass zwischen den zeilen Abstände von 4 Pixeln entstehen.
Die Zeilenposition wäre dann: 0, 18, 36, 54, 72, 90...usw. Pixel, allerdings passen dann im Querformat statt 15 Zeilen nur noch 13 Zeilen auf das Display.
Der Spaltenabstand passt schon, da bekommt man dann 25 zeichen in eine Reihe. Summa Sumarum hätte ich mit meiner Einstellung ein gut ablesbares 25 x 13 Display.
Das Sahnehäubchen ist die farbliche Darstellung. Im Prinzip wären ca. 65000 Farben möglich. Das gilt für den Hintergrund und den Vordergrund.
Allerdings ist nicht jede Farbkombi aus Hintergrund und Zeichenfarbe gut lesbar und somit zweckmäßig. Außerdem wird am rechten Rand (Querformat) eine klein Schwäche sichtbar. So scheint der Rand nicht richtig ausgeleuchtet und die Buchstaben stecken in so einer flauen matschigen Farbe. Bei meinen versuchen hat sich aber Schwarz und Blau als Hintergrundfarbe bewährt.
Es ist auch möglich, den Hintergrund mit einer Farbe zu Füllen, z.B. Rot, dann aber eine Zeichenfarbe mit einem eigenen Hintergrund einzustellen.
Der Befehl für setTextColor sieht dann im Programm z.B. so aus:
tft.setTextColor(ILI9341_ORANGE, ILI9341_BLUE); // Farbe der Schrift einstellen
Und so sah der Testaufbau aus. Die Farben der Zeichen werden auf dem Foto nicht richtig dargestellt.
Der nächste Schritt ist es nun, ein 2,4 GHz NRF24l01 Sendemodul am WEMOS D1 mini zum Laufen zu bekommen.
Zuletzt bearbeitet: