Nr.06 – Zwei I²C Displays

Zwei I²C Displays am Arduino gleichzeitig verwenden.

zweiLCDergebnis

Materialbeschaffung: www.funduinoshop.com

Achtung:

Dieser Aufbau und die damit verbundene Änderung der I²C Adresse ist nur bei Displays möglich, die über eine Jumper-funktion verfügen. Die erkennt man auf dem folgenden Bild an dem rot markierten Bereich. Auf den Stellen  A0,A1 und A2 kann eine Kontaktbrücke aufgelötet werden.

zweiLCDrueckseite

Um mit dem I²C LCD Modul zu arbeiten, benötigt man eine Library welche noch nicht im Arduino Programm vorinstalliert ist. Wir verwenden in dieser Anleitung die „LiquidCrystal I2C“ Library. Die Library kann über die Bibliothekenverwaltung der Arduino-Software hinzugefügt werden. Als Suchbegriff direkt den Namen „LiquidCrystal I2C“ eingeben. Eine detaillierte Beschreibung, wie Bibliotheken eingefügt werden findet man im Theorieteil zu dieser Anleitung im Unterpunkt „Bibliotheken zur Arduino Software hinzufügen“.

Material: Arduino / 2 Displays mit I²C Modul / Breadboard / Kabel

Aufgabe: Zwei LCDs mit I²C Modul sollen gleichzeitig von einem Arduino Mikrocontroller angesteuert werden und zwei verschiedene Texte anzeigen. Dazu sollen die I²C Adressen der Displays vorher herausgefunden werden und die Adresse eines der Displays geändert werden.

Als erstes eine kurze Erläuterung zu der I²C Adresse:

Jedes I²C Modul hat eine sogenannte „HEX Adresse“. Über diese Adresse reagiert das I²C-Modul auf die Daten, die vom Arduino auf dem Datenbus an genau diese Adresse gesendet werden. Viele I²C-LCDs auch die gleiche HEX-Adresse. Das bedeutet, dass beim verwenden von zwei Displays beide Displays auf die gesendeten Daten vom Arduino-Board reagieren würden. Man könnte also auf zwei Displays keine unterschiedlichen Daten darstellen.

Die HEX-Adresse kann bei dem Display mit Hilfe der A0, A1 und A2 Lötstellen jedoch verändert werden. Im unveränderten Zustand sind alle drei Lötstellen nicht verbunden. Je nach Kombination, welche der Stellen man mit einer Lötstelle überbrückt, sind also 8 verschiedene Adressen möglich. Abhängig vom Display Typ kann diese Adresse anfangs 0x27 oder 0x3F sein (kann mit dem Adressen „Scanner“ herausgefunden werden, dazu später mehr).

Tabellen zu HEX Adressen je nach verlöteten Stellen( I = verbunden, : = nicht verbunden):

A0

A1

A2

HEX Adresse

HEX Adresse

:

:

:

0x27

0x3F

I

:

:

0x26

0x3E

:

I

:

0x25

0x3D

I

I

:

0x24

0x3C

:

:

I

0x23

0x3B

I

:

I

0x22

0x3A

:

I

I

0x21

0x39

I

I

I

0x20

0x38

Kommen wir zum I²C Adressen „Scanner“:

Der „Scanner“ ist im Prinzip nur ein Code der auf den Arduino hochgeladen wird an dem das LCD Modul angeschlossen ist und dann am seriellen Monitor die HEX Adresse anzeigt.

Schrittweise Anleitung zum I²C Adressen „Scanner“:

1. Entsprechendes LCD Modul mit dem Arduino verbinden:

I²C LCD Modul >> Arduino

VCC >> 5V

GND >> GND

SDA >> A4

SCL >> A5

2. Folgenden Sketch auf den Mikrocontroller laden:

 

// I2C Scanner
// Written by Nick Gammon
// Date: 20th April 2011
#include <Wire.h>
void setup() {
Serial.begin (115200);
// Leonardo: wait for serial port to connect
while (!Serial)
{
}
Serial.println ();
Serial.println ("I2C scanner. Scanning ...");
byte count = 0;
Wire.begin();
for (byte i = 8; i < 120; i++)
{
Wire.beginTransmission (i);
if (Wire.endTransmission () == 0)
{
Serial.print ("Found address: ");
Serial.print (i, DEC);
Serial.print (" (0x");
Serial.print (i, HEX);
Serial.println (")");
count++;
delay (1); // maybe unneeded?
} // end of good response
} // end of for loop
Serial.println ("Done.");
Serial.print ("Found ");
Serial.print (count, DEC);
Serial.println (" device(s).");
} // end of setup
void loop() {}

3. Seriellen Monitor in der Arduino Software öffnen

4. Baudrate auf 115200 ändern

5. Ggf. Reset Knopf auf dem Arduino drücken

In dem seriellen Monitor sollte folgendes zu sehen sein (HEX Adresse ist rot markiert):

zweiLCDscanner

 

Wieder zur eigentlichen Anleitung:

Um nun auf zwei I²C Displays gleichzeitig zwei verschiedene Texte anzeigen lassen zu können müssen die Displays natürlich auch verschiedene HEX Adressen haben. Also verlöten wir in unserem Beispiel bei einem der Displays den A1 Kontakt, sodass dieser nun die Adresse 0x3D hat (kann mit dem Adressen Scanner nochmal geprüft werden). Wir nennen diesen Display ab jetzt Display 2 und den anderen Display 1.

Aufbau: Die Displays müssen nun mit dem Arduino verbunden werden:

ZweiLCDaufbau

Code:

#include <Wire.h>  // Wire Bibliothek hochladen
#include <LiquidCrystal_I2C.h> // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek hochladen
LiquidCrystal_I2C lcd1(0x27, 16, 2);  //Hier wird das erste Display benannt (Adresse/Zeichen pro Zeile/Anzahl Zeilen). In unserem Fall „lcd1“. Die Adresse des I²C Displays kann je nach Modul variieren.
LiquidCrystal_I2C lcd2(0x3F, 16, 2);  //Hier wird das zweite LCD benannt, hier "lcd2".

void setup()
{
lcd1.init(); //Im Setup wird das LCD1 gestartet
lcd2.init(); //Im Setup wird das LCD2 gestartet
lcd1.backlight(); //Hintergrundbeleuchtung von LCD1 einschalten (0 schaltet die Beleuchtung aus).
lcd2.backlight(); //Hintergrundbeleuchtung von LCD2 einschalten (0 schaltet die Beleuchtung aus).
}

void loop()
{
lcd1.setCursor(0,0); //Der folgende Text soll beim LCD1 beim ersten Zeichen in der ersten Zeile beginnen.
lcd1.print("Display1 Zeile 1"); //In der ersten Zeile soll der Text „Display1 Zeile 1“ angezeigt werden
lcd1.setCursor(0,1); //Der folgende Text soll beim LCD1 beim ersten Zeichen in der zweiten Zeile beginnen.
lcd1.print("Display1 Zeile 2"); //In der zweiten Zeile soll der Text „Display1 Zeile 2“ angezeigt werden
lcd2.setCursor(0,0); //Der folgende Text soll beim LCD2 beim ersten Zeichen in der ersten Zeile beginnen.
lcd2.print("Display2 Zeile 1"); //In der ersten Zeile soll der Text „Display2 Zeile 1“ angezeigt werden
lcd2.setCursor(0,1); //Der folgende Text soll beim LCD2 beim ersten Zeichen in der zweiten Zeile beginnen.
lcd2.print("Display2 Zeile 2"); //In der zweiten Zeile soll der Text „Display2 Zeile 2“ angezeigt werden
}