Dos pantallas I²C simultáneamente en el Arduino

FunduinoÚltima actualización el

I²C-Adressen verstehen, ändern und zwei Displays getrennt beschreiben

Zwei I²C-LCDs an denselben zwei Leitungen, und jedes zeigt einen anderen Text: Damit das klappt, braucht jedes Display seine eigene Adresse.

In dieser Anleitung liest du die Adresse mit einem Scanner-Sketch aus, änderst sie über eine Lötbrücke und steuerst anschließend beide Displays getrennt an.

Zwei I²C-LCDs am Arduino UNO mit unterschiedlichem Text

Zwei Displays an einem Bus

Am I²C-Bus können mehrere Module an denselben zwei Leitungen hängen. Damit der Arduino sie auseinanderhalten kann, hat jedes Modul eine eigene Adresse, meist als HEX-Zahl angegeben. Ein Modul reagiert nur auf Daten, die an genau seine Adresse gehen.

Viele I²C-LCDs kommen mit derselben Adresse aus der Fabrik. Schließt du zwei davon an, reagieren beide auf dieselben Daten – unterschiedliche Texte sind so nicht möglich. Bevor du zwei Displays gleichzeitig nutzt, musst du deshalb bei einem die Adresse ändern.

Zwei I²C-LCDs am Arduino UNO mit unterschiedlichem Text

Die Adresse über Lötbrücken ändern

Das funktioniert nur bei Displays, deren I²C-Modul die Lötstellen A0, A1 und A2 hat – auf dem Bild rot markiert. Ab Werk sind alle drei offen. Je nachdem, welche du mit einem Tropfen Lötzinn überbrückst, ergeben sich acht verschiedene Adressen.

Die Ausgangsadresse hängt vom Modul ab und liegt meist bei 0x27 oder 0x3F. Die Tabelle zeigt, welche Adresse sich bei welcher Kombination ergibt (I = verbunden, : = nicht verbunden).

Der Hinweiskasten im Artikel endet mit einem verwaisten „ד – Rest eines Schließen-Knopfs aus der alten Website.

Rückseite eines I²C-LCD mit den rot markierten Lötstellen A0, A1 und A2
Tabelle der I²C-Adressen je nach überbrückten Lötstellen
1 / 2

Die Adresse mit dem I²C-Scanner auslesen

Welche Adresse dein Display tatsächlich hat, findest du mit einem kleinen Scanner-Sketch heraus. Schließ das Display dafür an:

  • VCC an 5V
  • GND an GND
  • SDA an A4
  • SCL an A5

Lade den Scanner hoch, öffne den seriellen Monitor und stell die Baudrate auf 115200. Der Sketch probiert alle Adressen durch und gibt jede aus, unter der sich ein Modul meldet.

Der serielle Monitor zeigt die gefundene I²C-Adresse an
I²C-Scanner
// 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() {}

Die Bibliothek installieren

Für das I²C-LCD brauchst du die Bibliothek „LiquidCrystal I2C“. Sie ist nicht vorinstalliert, du findest sie im Bibliotheksverwalter der Arduino IDE unter dem Namen „LiquidCrystal I2C by Marco Schwartz“. Wie das Installieren im Einzelnen geht, zeigt die Anleitung Hardware und Software.

Die Bibliothek LiquidCrystal I2C von Marco Schwartz im Bibliotheksverwalter

Zwei Displays anschließen und programmieren

Im Beispiel wird bei einem der beiden Displays die Lötstelle A1 überbrückt. Dieses Display heißt ab jetzt Display 2, das unveränderte Display 1. Prüf die neue Adresse am besten noch einmal mit dem Scanner.

Beide Displays hängen parallel an denselben vier Leitungen: SDA an A4, SCL an A5, VCC an 5V und GND an GND.

Im Sketch legst du für jedes Display ein eigenes Objekt mit seiner Adresse an – lcd1 und lcd2 – und kannst sie danach getrennt beschreiben. Trag dort die beiden Adressen ein, die dir der Scanner angezeigt hat.

Text und Sketch passen nicht zusammen: Laut Text hat Display 2 nach dem Überbrücken von A1 die Adresse 0x3D, im Sketch stehen aber 0x27 und 0x3F – die Adresse 0x3D kommt gar nicht vor. Bei einem Modul mit Grundadresse 0x3F ergibt A1 tatsächlich 0x3D; dann müssten im Sketch 0x3F und 0x3D stehen. Außerdem steht in den Kommentaren „(0 schaltet die Beleuchtung aus)“ – backlight() nimmt keinen Wert, ausschalten geht mit noBacklight().

Schaltplan: zwei I²C-LCDs parallel an SDA, SCL, 5V und GND des Arduino UNO
Zwei Displays mit unterschiedlichem Text
#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
}
Calificar la guía

Comentarios

Haz una pregunta o comparte tu experiencia

Schreib uns, wenn etwas nicht funktioniert. Nenne dabei dein Board und die Fehlermeldung.

Revisamos cada comentario antes de publicarlo. Tu dirección de correo electrónico permanece con nosotros.