• Hallo Zusammen, Aufgrund der aktuellen Situation setzten wir die Möglichkeit aus, sich mit Gmail zu registrieren. Wir bitten um Verständnis Das RCMP Team

Praxisbericht WEMOS D1 mini mit 240x320 2,4" TFT Display RGB

BAXL

Admin
Mitarbeiter
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 :rolleyes:. 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
Pin-Definition:
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.

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);
}
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.
 
Zuletzt bearbeitet:

BAXL

Admin
Mitarbeiter
Never give up, never surrender ist mein Motto, also habe ich noch einen zweiten WEMOS aus der Teilekiste geholt und einen NRF24 daran angeschlossen. Leider sind da wieder die typischen Probleme. Man findet zwar sehr viele Beiträge dazu im Netz, aber alle machen das wieder unterschiedlich. Das beginnt schon bei der Bezeichnung der Signalpins, die sehr uneinheitlich sind und oftmals mehrere Abkürzungen für ein und den selben Signalpin existieren. Entweder man weiß das, oder man macht sich eine Tabelle darüber. Weiterhin sind die Infos bezüglich der tatsächlichen Funktion sehr spährlich.

Der NRF24 ist zwar angeschlossen und scheint irgenwie zu arbeiten, ich bekomme aber keine sinnvollen Datentelegramme rein.



Das sind die Anschlüsse vom NRF24 an den WEMOS



Das sind die Anschlüsse des TFT Displays an den WEMOS



Als nächstes ist zu lösen, wie zwei SPI-Devices parallel an dem WEMOS ans laufen zu bringen sind. Ich weiß nicht, welche der Anschlüsse tatsächlich zusammengeschaltet werden können und wo ich zusätzliche Datenports (evtl. CS - Chip Select oder so) benötige. Die beispielprogramme nutzen immer Librarys die von Standardanschlüssen ausgehen und immer nur ein Device bedienen. Kommt ein zweites Device hinzu, kann es u.U. nötig sein, andere WEMOS-Pins als den Standard zu verwenden. Das muß natürlich bei der Initialisierung bekannt gemacht werden. Dazu wird es unumgänglich sein, die Quellcodes der Libs auseinanderzunehmen. Also mal eben anschließen und ein paar Codezeilen zusammenkopieren funktioniert nicht mehr, wenn es umfangreicher wird. Der WEMOS hat zudem auch nur vergleichsweise wenig Anschlüsse. Von D0 bis D8 und einen analogen Eingang, dann ist Sabbat.

Das Display belegt auf dem ersten WEMOS D3 D4 D5 und D7. Am zweiten WEMOS liegt das NRF24 auf D2 D4 D5 D& und D7.

Beide haben auf D5 CLK / SCK und D7 MOSI. Was mir etwas Kopfschmerzen macht ist beim NRF24 die Anschlüsse CE und CSN. Da weiß ich nicht, wie diese Bezeichnungen mit den Anschlüssen des TFT Displays korrespondieren. Das TFT hat DC (Data /Command) und CS (Chip Select). Sind das ähnliche Anschlüsse wie beim NRF24 CSN (Chip Select No) und CE (Chip Enable)?

Kann ich nun CLK und MOSI von beiden Divices parallel zusammenschalten?
Ist Chip Select (CS), die gleiche Funktionalität wie Chip Enable (CE), sodass dafür ein separater WEMOS Port genommen werden muß?
Welche Rolle spielt dann noch CSN - Chip Select Not (bei dem Pin ist die Ansteuerlogik zu CS eigentlich nur negiert)?

Bislang mußte ich sehr häufig mit trial and error arbeiten, also schlicht fummeln und dann probieren ob es klappt. Beim Display war das nicht anders. Da hat auch nur Rumprobieren und immer wieder neu das Programm ändern und starten zum Erfolg geführt. Die Erklärungen auf den diversen Seiten hören immer dann auf, wenn es etwas ins Eingemachte geht und zusätzliche Informationen Erhellung geben könnten.
Mir sieht das immer so aus, als würde man jeweils nur ein Divice anschließen, den Beispielcode aus der Lib nehmen und ggf. etwas herumprobieren bis es klappt. Warum das dann klappt bzw. warum er vorher nicht ging, darüber schweigt man sich aus. Wahrscheinlich deshalb, weil man froh ist dass es nun läuft und keine Lust mehr hat zu ergründen was die Ursache war. Da trennt sich dann die Spreu vom weizen, also extrovertierte Selbstdarsteller, die sich im Netz produzieren und Leute, die strukturiert ein Problem angehen und nachher auch verstehen was los war. Die Leute die verstehen, teilen das leider nicht mehr offen mit, wie und warum etwas geht. Also werde ich wieder einmal Detektiv spielen müssen und probieren. :rolleyes:

Ich wiederhole es noch einmal, man kommt bei all dem nicht darum herum, auch mal einen tieferen Blick in die Librarys zu werfen. Die Lösungen springen dann aber nicht automatisch in die Augen, da ist dann unglücklicherweise die Erfahrung und das Bauchgefühl gefragt.
 
Zuletzt bearbeitet:
Top Bottom