• 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

Anleitung Arduino Nano mit DollaTek 2,4" TFT SPI LCD-Farb-Modul ILI9341

BAXL

Admin
Mitarbeiter
Das DollaTek 2,4” Display ist ein Farb-LCD-Display, das per SPI-Schnittstelle angesteuert wird. Als Treiber-IC werkelt das ILI9341 darin. Die Auflösung beträgt 240x320 Pixel. Die Betriebsspannung ist 3,3V! Damit kann man es z.B. an ESP8266 Module direkt anschließen, für Arduinos, wie den UNO, Mega und Nano benötigt man für die Signalleitungen einen Pegelwandler. Der Pegelwandler sollte schnell genug arbeiten, sonst funktioniert es nicht. Für meine Schaltung verwende ich ein Modul mit einem TXS0108E. Ich habe das im Dreierpack für rund 6,00€ bei AZ-Delivery (über Amazon) gekauft, das Stück also ca. 2€. Bestellt man direkt bei AZ-Delivery kosten das Dreierpack 6,80€! zuzügl. Versand. Wer also bei Amazon Prime hat, sollte das da bestellen und es kommt auch schneller.

Das Display hat eine Besonderheit. Normalerweise hat der SPI-Bus außer der üblichen Signalleitungen MISO, MOSI, CLK usw. noch einen CS (Chip Select) Anschluß, dieser fehlt dem DollaTek aber. Trotzdem funktioniert es.

Die Anschlüsse des DollaTek sind:

GND, VCC (3,3V!), CLK (Clock), MOSI, RES (reset), DC, BLK (Betriebsspannung Hintergrundbeleuchtung 3,3V!) und MISO. Der MISO-Anschluß hat bei meinem Exemplar keine Funktion, weil das Display nur eine Anzeigefunktion hat. Module, die berührungssensitv sind, können damit auch Informationen zurückliefern. Also lasse ich den Anschluss offen.

Das Display belegt also nur zwei der typischen SPI-Ports. Beim Nano ist das D11 für MOSI und D13 für SCK (Clock – also das Taktsignal für die Datenübermittlung). Die übrigen Anschlüsse habe ich frei gewählt, bzw. mich an die Digitalportnummern eines WEMOS D1 mini angelehnt. So liegt DC auf D4 und RES auf D3. Das WEMOS D1 mini verwendet für MOSI D7 und für SCK D5.

NanoPegelwandlerTFT-Display
D8
D9
D13A2 - B2CLK (SCK) Grau
D3A3 - B3DC (CS/SS)
D11A1 - B1MO(SI) Violett
D12
D10
D6A4 - B4RES RST Braun
MISO Gelb ohne Funktion
3,3VVA + OEBLK Grün und VCC Weiß
5VVB-
GNDGND SchwarzGND Schwarz





Die verwendeten Librarys für die Ansteuerung sind:

#include <Adafruit_GFX.h> // include Adafruit graphics library

#include <Adafruit_ILI9341.h> // include Adafruit ILI9341 TFT library

Zum Ausprobieren habe ich ein Beispielprogramm ausgeweidet und mit eigenen Zeilen ergänzt.

C++:
/**********************************************************************
Testprogramm für das DollaTek 2,4 Zoll LCD Display mit 240x320 Bildpunkten
an einem Arduino Nano Clone

   This is our GFX example for the Adafruit ILI9341 Breakout and Shield
  ----> http://www.adafruit.com/products/1651


**********************************************************************/


#include <Adafruit_GFX.h>       // include Adafruit graphics library
#include <Adafruit_ILI9341.h>   // include Adafruit ILI9341 TFT library

#define TFT_CS    2     // TFT CS  pin is connected to Nano Port D2
#define TFT_RST   3     // TFT RST / RES pin is connected to Nano Port D3
#define TFT_DC    4     // TFT DC  pin is connected to Nano Port D4
// initialize ILI9341 TFT library with hardware SPI module
//SCK (CLK) ---> Nanao Port D13
//MOSI(DIN) ---> Nano Port D11
// 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(5000);

tft.fillScreen(ILI9341_BLACK); // Bildschirm schwarz hinterlegen
tft.setCursor(0, 0); // Cursor auf oben links setzen

tft.setTextColor(ILI9341_ORANGE, ILI9341_BLUE);
// Farbe der Schrift einstellen, Schriftfarbe Orange - Zeichenhintergrund Blau

for (byte i = 1; i<21; i++){
  tft.print("Zeile: "); tft.println(i);
}
delay(5000);
}
 
Zuletzt bearbeitet:

r_a_mueller

Mitglied
Hallo und guten Tag,
ich habe diesen Beitrag über Google gefunden, es scheint der einzige Auffindbare zu sein, der etwas über das Display kombiniert mit Arduino aussagt. Ich habe mir nämlich auch ein Ähnliches gekauft (das gleiche in 2,8", auch ohne Touchfunktion) in der Annahme, da gibt es haufenweise Infos zu, aber Pustekuchen.
Ich möchte es mit einem Nano betreiben und war über das Beispiellisting recht froh. Bei genauem Hinsehen ist mir allerdings nicht alles klar und ich würde mich über Aufklärung freuen.
1. DC (in der Tabelle) ist wohl nicht Chip Select. Im Text steht, dass das Modul kein Chip select hat.
2. Im Listing werden Pins für CS und DC definiert. Welche sind das in der Tabelle? Ich denke, es gibt kein Chip Select? Hieran bin ich gescheitert. Das Display hat ja nur "DC" . Dass die Pindefinitionen nicht mit denen im Text übereinstimmen, macht ja nichts aus, das kann ich ja so definieren wie ich will.
3. Reset geht in der Tabelle an D6, im Listing aber an D3. Aber auch das kann ich ja definieren, wie ich will.
4. Level shift: Leider habe ich keinen bidirektionalen Levelshifter hier rumliegen, aber noch ein paar CD4050. In welche Richtung muss der Levelshifter in die RST-Leitung? Vom nano zum TFT würde von den Pegeln her Sinn machen, aber ich nahm an, dass der RST vom TFT kommt. In dieser Richtung bräuchte es ja eigentlich keinen Levelshift. Kann ich den Level shift auch mit einen Spannungsteiler erreichen oder wäre das zu langsam?

So, und jetzt hoffe ich nur, dass dieser Thread noch aktiv ist...
Vielen Dank schon mal für die Hilfe!

-richard
 

BAXL

Admin
Mitarbeiter
Hallo Richard, ich bin noch aktiv, muß aber nochmal genau nachsehen wo es bei Dir klemmt. :).
 

BAXL

Admin
Mitarbeiter
3. Reset geht in der Tabelle an D6, im Listing aber an D3. Aber auch das kann ich ja definieren, wie ich will.
Ich vermute, dass ich vergessen habe die Tabelle zu ändern. Also so wie im Listing anschließen.

Level shift: Leider habe ich keinen bidirektionalen Levelshifter hier rumliegen, aber noch ein paar CD4050. In welche Richtung muss der Levelshifter in die RST-Leitung? Vom nano zum TFT würde von den Pegeln her Sinn machen, aber ich nahm an, dass der RST vom TFT kommt. In dieser Richtung bräuchte es ja eigentlich keinen Levelshift. Kann ich den Level shift auch mit einen Spannungsteiler erreichen oder wäre das zu langsam?
RST ist am Display ein Eingang, also vom Nano zum Display. Mit einem Spannungsteiler wird das auch funktionieren, ich hatte nur keine Lust auf unübersichtliches Geraffel auf dem Steckbrett.
 

r_a_mueller

Mitglied
Schönen Dank für die Hinweise. Im Listing findet sich
#DEFINE TFT_CS 2
aber CS gibt es ja gar nicht. Ich habe daraufhin die beiden Fotos ausklamüsert und daraus den beigelegten Schaltplan rekonstruiert. Ich habe das Ganze dann auf dem Steckbrett nachgebaut, allerdings mit CD4050B als Levelshift. Den habe ich dann dummerweise mit 5V statt 3,3 V versorgt. Möglicherweise habe ich daraufhin das Display gegrillt. Wenn der Sketch vom 1. Post abläuft, ändert sich zyklisch nur das Backlight: hell --> mittel --> dunkler --> hell --> mittel -->dunkler usw., sonst passiert nix.
 

Anhänge

BAXL

Admin
Mitarbeiter
Hallo Richard, wegen der 3,3V steckt bei mir ja der Level Shifter drin :). Das Listing habe ich aus einem Beispiel genommen und alles rausgeschmissen was nicht gebraucht wird.
Ich weiß nicht mehr genau, warum ich die eine Deklaration noch drin gelassen habe. Möglicherweise wird in der Lib darauf Bezug genommen und der Pin angesteuert, obgleich das Display den Eingang nicht besitzt.
Würde man die Deklaration rausnehmen, dann stolpert der Compiler an der Stelle. Es tut aber nicht weh, wenn die Variable dort drin steht, solange das Display läuft.

Edit:
Mich irritiert Dein Schaltplan etwas. Dort ist am Nano Vin mit 3,3V belegt. Da kommt eigentlich 6 - 12V lt. Spec dran. Wo kommen die 3,3V vom IC her?
 
Zuletzt bearbeitet:

BAXL

Admin
Mitarbeiter
Bist Du sicher, dass das IC schnell genug schaltet. Bei meinem ersten Levelshifter habe ich die Erfahrung gemacht, dass der zu langsam war und nichts klappte.
Evtl. kennt unser Forenscotty @DFENCE das IC.
 

r_a_mueller

Mitglied
Nein, zum Tempo kann ich nichts sagen. Habe den CD4050 eingebaut, weil hier noch 5 Stück davon rumliegen. Im Datenblatt stehen Zeiten Low nach High bzw. umgekehrt von 20 bis 40 ns. Wenn ich das Datenblatt richtig verstehe, scheint der TXS0108 schneller zu sein. Ich hatte bei mir noch einen Fehler, nämlich offene Eingänge beim Level Shifter. Aber auch das auf-GND-Legen hat nichts gebracht. Spannungsteiler habe ich nicht genommen, denn sie sollen oft zu langsam sein.
 

Arduinofan

Neuer Benutzer
Falls das ILI9341 Weißes Display Problem noch nicht gelöst ist:
Ich habe lange daran getüftelt, und schließlich einen Forum-Hinweis gefunden:

Dieses Display ohne CS in der o. abgebildeten Bauform muss an dem VCC-Pin mit 5V und nicht mit 3V3 betrieben werden. Die 4 SPI - Leitungen, wie gehabt mit Levelshifter oder Widerstandsteiler auf 3V3. BLK fest an 3V3. Im Programm trotz fehlendem CS-Pin #define TFT_CS 10 einfügen und bei Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, etc.) mit aufführen. Hier die default Parameter:
#define TFT_CLK 13
#define TFT_MISO 12
#define TFT_MOSI 11
#define TFT_DC 9
#define TFT_CS 10 //erforderlich!
#define TFT_RST 8

// 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);

Diese Maßnahmen haben bei meinen ILI9341, TXS0108E und dem Arduino Nano (ATMega 328P) zum Erfolg geführt.
 

BAXL

Admin
Mitarbeiter
Hallo @Arduinofan vielen Dank für die hilfreichen Infos. Bei mir hat es zwar irgendwann geklappt aber speziell mit dem CS war das tatsächlich etwas Glück. Deine Erklärung ist ein toller Beitrag :thumbsup:
 
Top Bottom