• 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 Arduino - 2004 LCD-Display mit I2C Modul

BAXL

Admin
Mitarbeiter
Anzeigedisplay 2004 / 4 Zeilen, 20 Zeichen für Arduino
Anschluß, Ansteuerung und Beispielprogramm




Im oberen Bild ist das 2004 Display bereits zu sehen. Für die Inbetriebnahme, habe ich einen meiner Arduino Nano Nachbauten genommen. Der erste Versuch, das Display einfach am Uno, an die Anschlüsse des 1602 zu stecken, hat leider nicht funktioniert. Scheinbar sind die verwendeten Bibliotheken nicht kompatibel. Beim 1602 brauchte ich nur die Displaygröße (16,2) in der Initialisierung angeben, beim 2004 musste dem I2C-Modul ebenfalls eine Pinreihenfolge übergeben werden. Wie sich die ergibt und was genau damit gemeint ist habe ich noch nicht herausgefunden. Gut dass ich eine Anleitung und einen Demosketch dafür hatte.

Man achte auch darauf, dass beim Befehl lcd.setcursor(s,z); der erste Wert die Spaltenposition ist und der zweite Wert die Zeile und dass dort bei 0 angefangen wird zu zählen. (0,0) ist dann (Spalte 1, Zeile 1)

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);

void setup() {

lcd.begin(20, 4);
lcd.clear();

lcd.setCursor(0,0);
lcd.print("Testtext Zeile 1");
lcd.setCursor(0,1);
lcd.print("Testtext Zeile 2");
lcd.setCursor(0,2);
lcd.print("Testtext Zeile 3");
lcd.setCursor(0,3);
lcd.print("Testtext Zeile 4");

}

void loop() {

lcd.setBacklight(HIGH);
delay(1000);
lcd.setBacklight(LOW);
delay(1000);
}
 
Zuletzt bearbeitet:

BAXL

Admin
Mitarbeiter
Nachdem das 2004 Display (4 Zeilen, 20 zeichen) so wunderbar funktioniert, hat mir eine Codezeile zum Ansteuern keine Ruhe gelassen, es geht um:

LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE); Das ist die Zeile, in der man dem kleinen I2C Zusatzmodul klar macht, wie es das Display ansteuern soll.

Warum gerade diese Zeile?

Bei meinem 1602 Display (2 Zeilen, 16 zeichen), braucht man als "Erklärung" nur folgenden Code:

LiquidCrystal_I2C lcd(0x27, 16, 2);
Dieser Code ist einleuchtend einfach. Die Zahl 0x27 ist wie eine Art Adresse für das I2C Modul, weil man mehrere dieser Module parallel anschließen kann. Die 16 sagt dem I2C Modul, dass das Display 16 Zeichen besitzt und die 2, dass dort 2 Zeilen sind.

Aber wofür stehen die vielen Zahlen in lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE)?

Dazu muß man sich ansehen, wie so ein LCD-Display normalerweise an einen Arduino angeschlossen wird.

2004 LCD - Display Arduino UNO
VSS - GND
VDD - 5V
V0 - Kontrast Potentiometer (0V bis 5 V)
RS - Pin 12
RW - GND
E - Pin 11
D4 - Pin 5
D5 - Pin 4
D6 - Pin 3
D7 - Pin 2
A (Hintergrundbeleuchtung Anode) - 5V
Pin K (Hintergrundbeleuchtung Kathode) - GND

Dieses nun mehrfach genannte I2C Modul soll den Anschluß und die Bedienung des Display erleichtern, weil man u.a. viel weniger Anschlußpins des Arduinos braucht. So ein I2C-Modul (PCF8574) für das LCD-Display braucht nur 4 Leitungen.

I2C Schnittstelle => Arduino

GND => GND

VCC => 5V

SDA => A4

SCL => A5

So, und nun wirds spannend.

Es werden durch das I2C-Modul im Prinzip aus 4 Leitungen am Arduino, 12 Leitungen am Display. Auf dem I2C - Modul steckt also Elektronik und eine Intelligenz. Die Elektronik ist u.A. ein Ausgabebaustein, nämlich der PCF8547 und der hat Ausgangspins (Ports), die P0 bis P7 genannt werden und natürlich die Eingangspinns SCL und SDA, über die der Arduino dem Teil sagt, was er machen soll. Und jetzt kommt das Problem, der PCF8547 muß wissen, welche LCD-Displayanschlüsse an welchem Port angeschlossen ist. Und das ist leider unterschiedlich, je nachdem, von welchem Hersteller man die Zusatzplatine bekommt, die per Pfostenstecker am Display angeschlossen wird.

Es ist auch nicht so einfach herauszufinden, wozu die einzelnen Zahlen in der Klammer lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE) sind.
Man muß also wissen, welche Bedeutung die Zahlen haben und welcher Pin des I2C-Moduls auf welchen Port des aufgelöteten PCF8547 geht. Dann kann man das Problem mit den Zahlen lösen.

Zuerst die Bedeutung der Zahlen:
LiquidCrystal_I2C (lcd_Addr, En, Rw, Rs, d4, d5, d6, d7, backlighPin, t_backlighPol pol)

lcd_Addr: Adrsse des I2C Moduls über die der Arduino mit dem Teil reden kann
rs : Nummer des Pin an RS pin vom LCD
rw : Number des Pin am RW Pin vom LCD (optional)
enable : Pinnummer die am enable Pin des LCDs angeschlossen ist
d4,d5,d6,d7 : Nummern der Datenpins zum LCD

Und jetzt wird es wieder spannend, weil die Zahlen in der Klammer die Portnummer des PCF8547 sind.
lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE)

"En" gehört an ...? ja woran nun? Genau das hängt davon ab, wie die Elektronikbude die PCF8547 Ports auf die Postenleiste ihrer geschusterten Platine gelegt hat.
In dem oben gzeigten Beispiel wäre En - Port 2, RW - Port 1, RS - Port 0, d4 - Port 4, d5 - Port 5, d6 - Port 6, d7 - Port 7. Leider sind die 2 letzten werte noch nicht in ihrer Bedeutung und Zuordnung von mir entschlüsselt worden.

Weiterhin gilt die o.g. Portzuordnung nur genau für die Platine, die ich bei AZ-Delivery gekauft habe. hat man eine von einem anderen Hersteller/Lieferant, kann die Zuordnung komplett anders sein. Man ist also darauf angewiesen zu wissen, welche Ports auf welchem Pin landen und welche Funktion dieser Pin dann am LCD ansteuert.


Also von wegen, mal eben ein Modul kaufen, anstöpseln Beispielsketch herunterladen und alles läuft easy...

Da habe ich ganz deutlich feststellen können, dass die Erklärbären immer an der Stelle aufhören, wo es interessant und schwierig wird, bzw. nicht zugeben, wenn ihnen selbst etwas suspekt ist.
 
Zuletzt bearbeitet:

BAXL

Admin
Mitarbeiter
Ich habe gerade was gefunden und nehme diesen Post mal als Gedankenstütze
https://controllerstech.blogspot.com/2017/07/i2c-lcd-in-stm32.html







Scheinbar ist das die Pinbelegung von dem Chinamodul
1 ---> Vss
2 ---> Vcc
3 ---> Vee
4 ---> RS ---> p0
5 ---> R/W ---> p1
6 ---> En ---> p2
7 ---> DB0
8 ---> DB1
9 ---> DB2
10 ---> DB3
11 ---> DB4 ---> p4
12 ---> DB5 ---> p5
13 ---> DB6 ---> p6
14 ---> DB7 ---> p7
15 ---> LED+
16 ---> LED-
 

DFENCE

Mitglied
Achso,

Ja das ist eigentlich einfach erklärt, das Modul ist nicht zwingend für das Display sondern das ist nen Port Expander, der muss natürlich ersma aufs Display programmiert werden, du könntest auch an dem Expander 4 Temperatur Sensoren anklemmen und über I2C auslesen, oder sonstige Analogen Sensoren usw.

Allerdings wie du schon festgestellt hast, optimalerweise nimmt man diese Chips einzeln und verbaut sie so wie man sie brauch, im Prinzip macht das jeder "Hersteller" dieser "Arduino Gimmicks"
Im Prinzip kannst einfach irgendwas nehmen, z.b von AD den LTC4314 klatsch den auf ne Platine, schreib ne Library und fertig is das Arduino Modul, nur hat halt keiner ne Ahnung was ich mir dabei gedacht hab und so kann auch nur ich voll erklären wie es funzt.

So kommt das ganze zustande das es viele eben nicht wissen sondern mehr oder weniger selbst erforschen per Try&Error, das schlimme is das 80% derjenigen eh nicht Programmieren können da wird dann stück für stück der Code zusammengefudelt und am ende weiß keiner warum das eigentlich funktioniert, das fängt ja schon bei der Formatierung an.
 

BAXL

Admin
Mitarbeiter
Ich dachte mir nur, wenn ich so ein Modul ausdrücklich für Displays anbiete, dann gebe ich zumindest an, welcher Port an welchem Pin rauskommt. Ist schon drollig, dass es beim 1602 ohne große Zahlenorgie klappt und beim 2004 muß ich mir aus den Fingern saugen was wo hin kommt. Da ist ein unkommentierter Beispielsketch an der Stelle ein schwacher Trost.
 

BAXL

Admin
Mitarbeiter
Mittlerweile verstehe ich die Welt nicht mehr. Als ich vor längerer Zeit einfach das 2004 Display an einen Arduino gehängt habe, an dem ein 1602 Modul gelaufen ist, konnte ich keine Zeichen zum 2004 senden. Es wurde schlicht nichts angezeigt. Bei meinem letzten Versuch hat es auf einmal geklappt. Warum, das weiß ich auch nicht. Vieleicht habe ich durch Zufall eine andere Library für das Display eingebunden!? Keine Ahnung.
 
Top Bottom