Arduino LCD Display mit i2c anschluss

[HOW TO] Arduino LCD Display I2C anschließen

Kurzes Tutorial, wie ein I2C-Bus Display an einen Arduino angeschlossen werden kann.

Basics: um ein Display zu verbinden, müssen wir die I2C-BUS Adresse von dem Gerät wissen. Ein Tutorial gibt es hier.

Benötige Materialen:

Was ist IIC / I2C?

Wikipedia:
Der I2C Bus ist ein synchroner serieller 2-Draht Bus, der in den 80er Jahren von Philips entwickelt wurde. I2C gesprochen ‚I Quadrat C‘ kommt von der der Abkürzung IIC und bedeutet Inter-Integrated Circuit. Er wird hauptsächlich dazu benutzt, zwischen Schaltkreisen, die sich auf einer Platine verbinden, Daten auszutauschen. Die beiden Leitungen, die den I2C Bus bilden heißen SCL und SDA. SCL steht für Signal Clock und ist die Taktleitung für den Bus. Deshalb spricht man auch von einem synchronen Bus. SDA steht für Signal Data und ist die Datenleitung. Die Datenübertragungsrate des I2C Busses beträgt 100kHz im Standard Mode, bzw. 400kHz im Fast Mode. Aus Lizenzgründen nennt man das I2C Interface bei Atmel TWI (Two Wire Interface).

Der I2C Bus ist ein Multi Master/Slave Bus. Das bedeutet, es gibt mindestens einen I2C Master und ebenso mindestens einen I2C Slave. Der Master selektiert einen Slave durch seine Slave Adresse, die innerhalb eines Busses eindeutig sein muss. Eine Datenübertragung kann nur durch einen I2C Master initiiert werden. Der Slave bleibt immer passiv und lauscht nur auf die Slave Adresse und vergleicht diese mit seiner eigenen Slave Adresse. Erst wenn er seine Slave Adresse erkennt, greift der Slave auch aktiv in das Busgeschehen ein.

Aus Sicht des I2C Masters unterscheidet man zwischen Read und Write Sequenzen. Bei einer Read Sequenz liest der I2C Master Daten vom I2C Slave. Bei einer Write Sequenz sendet der I2C Master Daten zum Slave.

Level Shifter – wann wird dieser benötigt?

Ein Level Shifter wird nur dann benötigt, wenn das Logic Bauteil eine andere Spannung für die Kommunikation hat als das Masterbauteil.

Es gibt I2C Bauteile, die können direkt mit 5 Volt betrieben werden. Im Datenblatt steht auch dabei, auf wie viel Volt die I2C BUS (SDA/SCL) betrieben werden kann.
Sollte hier 3.3 Volt stehen, muss ein Konverter verwendet werden, damit der Controller vom gewünschten Bauteil nicht zerstört wird.

Das heißt, die Betriebsspannung kann zur BUS Spannung abweichen. Dies kommt öfters vor, als Ihr denkt. Bestes Beispiel ist ein Raspberry PI.

Beispiel:
Arduino I2C-Bus 5 Volt.
Raspberry I2C-Bus 3.3Volt
Damit die Geräte untereinander kommunizieren können, muss ein Logik-Konverter verbaut werden. Andernfalls, wird der I2C beim Raspberry PI zerstört.

Verdrahtung eines Logic Level Konverter

Ein Level Konverter hat eine HV und ein LV Seite. HV = High Voltage und LV = Low Voltage.
Low Voltage: wäre in unserem Fall für die 3.3 Volt betriebenen Bauteile
High Voltage: in unserem Fall für die 5 Volt betriebenen Bauteile.

Verkabelung von einem I2C Display zum Arduino

Generell benötigen wir für die Kommunikation und Stromversorgung 4 Kabel. 5 Volt, GND, SDA und SCL.

5 Volt: für die Betriebsspannung von dem Display.
GND: für die Masse
SCL: Kommunikation
SDA: Kommunikation

reset3V35VGNDGNDVINA0A1A2A3A4A5
Arduino Uno R3+SDASCL
I2C Modul+SDASCL

Der Code

Damit wir das Display nun ansprechen können, werden Bibliotheken benötigt. Je nach Hersteller können die Bibliotheken abweichen – bitte schaut in den Dokumentationen nach, welche Bibliotheken Ihr benötigt. In meinem Fall für das QC2004A Display wird:

  • Wire.h
  • LiquidCrystal_I2C.h

benötigt.

Beide Bibliotheken können in der Arduino IDE unter Sketch –> „Bibliotheken einbinden –> Bibliotheken Verwalten“ heruntergeladen und installiert werden.

Erklärung / Funktionen

Am Start vom Sketch muss die Bibliothek mittels #include eingebunden werden.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

Danach folgt der SETUP des Displays. Adresse und auch Zeilen- und Zeichenanzahl.
Adresse: 0x27
Zeichenanzahl: 20
Zeilen: 4

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

Nun kann im Void Setup das LCD initialisiert werden.

lcd.init();                      // initialize the lcd 

Wir können nun das Display ansprechen, jetzt wird es an der Zeit etwas auszugeben! Wir teilen dem Display nun mit, ob wir eine Hintergrundbeleuchtung möchten oder nicht.

  lcd.backlight();

Jetzt wird die Position benötigt.
2,0
2= ab Zeichen 2 (2 Felder werden ausgelassen) 20 Zeichen pro Zeile stehen uns zur Verfügung. 20-2 = 18 Zeichen haben in dieser Zeile noch Platz.
0= Zeile 0 – Wir haben 4 Zeilen. Die erste Zeile wird mit 0 Angesprochen. Die letzte Zeile mit 3.
Dies ergibt:
0 = Zeile 1
1 = Zeile 2
2 = Zeile 3
3 = Zeile 4

Ihr könnt euch das Display anhand einer Tabelle sehr gut Vorstellen:

012345678910111213141516171819
Zeile 0
Zeile 1
Zeile 2
Zeile 3
  lcd.setCursor(2,0);

Anschließen der Text, den wir in der Zeile 0, ab Zeichen 2 Ausgeben möchten.

  lcd.print("Hello, world...");

Um das Display zu bereinigen, kann im Void loop dieselbe Position mit “ “ überschrieben werden oder mit lcd.clear() das gesamte Display gelöscht/bereinigt werden.

lcd.clear();           // Display wird komplett geleert
lcd.setCursor(0,0);    // Position ab wo wir etwas überschreiben möchten
lcd.print("    ");     // Überschreiben mit "nichts" :)

Symbole darstellen

Symbole können relativ einfach mittels diesem Script dargestellt werden.

Wir müssen zuerst ein Symbol definieren, dies kann unter #include… geschrieben werden.

uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0};

in dem Void Setup, definieren (erstellen) wir das Symbol anschließend mit dieser Zeile:

lcd.createChar(3, heart);

Die Ausgabe, auf dem Display erfolgt dann mittels:

lcd.printByte(3);
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif
LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

uint8_t bell[8]  = {0x4,0xe,0xe,0xe,0x1f,0x0,0x4};
uint8_t note[8]  = {0x2,0x3,0x2,0xe,0x1e,0xc,0x0};
uint8_t clock[8] = {0x0,0xe,0x15,0x17,0x11,0xe,0x0};
uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0};
uint8_t duck[8]  = {0x0,0xc,0x1d,0xf,0xf,0x6,0x0};
uint8_t check[8] = {0x0,0x1,0x3,0x16,0x1c,0x8,0x0};
uint8_t cross[8] = {0x0,0x1b,0xe,0x4,0xe,0x1b,0x0};
uint8_t retarrow[8] = {  0x1,0x1,0x5,0x9,0x1f,0x8,0x4};

void setup()
{
  lcd.init();                      // initialize the lcd 
  lcd.init();
  
  lcd.createChar(0, bell);
  lcd.createChar(1, note);
  lcd.createChar(2, clock);
  lcd.createChar(3, heart);
  lcd.createChar(4, duck);
  lcd.createChar(5, check);
  lcd.createChar(6, cross);
  lcd.createChar(7, retarrow);
  
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(3,0);
  lcd.print("Hello, world!");
  lcd.setCursor(0,2);
  lcd.print(" I ");
  lcd.printByte(3);
  lcd.print(" stoffl.info!");
  lcd.setCursor(2,3);
  lcd.print("Have a nice day!");
}


void loop()
{
}

Code Download

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup()
{
  lcd.init();                      // initialize the lcd 
  lcd.init();
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(2,0);
  lcd.print("Hello, world...");
  lcd.setCursor(0,1);
  lcd.print("stoffl.info Arduino!");
   lcd.setCursor(2,2);
  lcd.print("Display: QC2004A");
   lcd.setCursor(2,3);
  lcd.print("Have a nice day!");
}


void loop()
{
}
Christoph Purin
Christoph Purin

Mein Name ist Christoph Purin und befasse mich mit IoT Geräten wie Raspberry, Arduino, ESP. Auch Aktivitäten wie die FFW, Quad-fahren, Amateurfunk zählen zu meinen bevorzugten Hobbys.
Dieser Blog, stellt eine Sammlung meiner Projekte dar, wie Dinge gelöst oder umgebaut werden können.

Artikel: 345

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert