I2C LCD und Arduino

Da ich in letzter Zeit viel mit dem I2C Display gebastelt habe und damals den Beitrag I2C LCD Modul mit 20×4 Zeichen nie wirklich weitergeführt habe, wollte ich in diesem HowTo zeigen, wie einfach man mit I2C LCD und Arduino eine kleine Visualisierung zusammenbauen kann.
I2C LCD und Arduino - Beispiel

I2C Bus, Verkabelung und Adresse

Kurz zum I²C Bus: Dieser benötigt immer zwei Signalleitungen Takt SCL und Daten SDA. Daher kann man beim Verkabeln nicht viel falsch machen. Aufpassen muss man nur ein wenig auf die z. T. vorgegebene I²C Adresse. Bei vielen Bauteilen lässt sich aber mit Lötbrücken oder über Jumper die Adresse anpassen. Probleme mit Überschneidungen hatte ich aber noch nicht. Ganz genau sollte man auf den richtigen Pegel auf dem I²C Bus achten, der Arduino hat 5V. Die meisten Module arbeiten aber mit 3.3V sowie 5V I²C Pegelspannung zusammen, wenn nicht, wird ein i²C kompatibler Pegelwandler wie z. B. der Adafruit Logic Level Converter – BSS138 benötigt. Wenn alles passt, muss man nur noch die i²C Pins auf dem jeweiligen Arduino finden.

Arduino SDA SCL
Uno A4 A5
Mega 20 21
Micro Pro 2 3

Wenn auf der Arduino Seite die entsprechenden Ports lokalisiert wurden, können I2C LCD und Arduino entsprechend 1:1 mit GND, VCC (5V),  SDA und SCL miteinander verbunden werden. Hier muss nicht auf den richtigen Pegel geachtet werden.

Arduino Sketch File

Im Beispiel habe ich verschiedene Funktionen wie Symbole und Umlaute anzeigen sowie Backlight aus- und einschalten eingebaut. Dabei habe ich versucht die einzelnen Befehle als Kommentar kurz und einfach zu beschreiben.

Ich verwende die LiquidCrystal I2C V1.1 Library von DFRobot die zwar schon etwas länger nicht gepflegt wurde aber auch noch mit der aktuellen Arduino IDE 1.6.x kompatibel ist. Bisher hatte ich mit dieser Library aber die geringsten Probleme.

// Sketch based on CustomChars example from DFRobot.com

#include <Wire.h> // Library for I2C
#include <LiquidCrystal_I2C.h> // Library for I2C LCD

LiquidCrystal_I2C lcd(0x27, 20, 4); // Set address 0x27 (default) 20 x 4 character LCD

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 LCD
  lcd.backlight(); // Turn on LCD backlight
  
// Special symbols optional
  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);

  lcd.clear(); // Clear LCD Screen  							

// Screen 1 - Logo
  
  lcd.print("********************"); // write text

  lcd.setCursor(0, 1); // Set cursor to line 2
  lcd.print("www.nikolaus-"); // write text

  lcd.setCursor(0, 2); // Set cursor to line 3
  lcd.print("        lueneburg.de"); // write text

  lcd.setCursor(0, 3); // Set cursor to line 4
  lcd.print("********************"); // write text

  delay(5000);
  lcd.clear(); // Clear LCD Screen

// Screen 2 - Backlight
  lcd.print("   Turn backlight"); // write text
  lcd.setCursor(5, 1); // Set cursor to line 2 position 6
  lcd.print("off and on"); // write text

  delay(5000);
  lcd.clear(); // Clear LCD Screen

  lcd.noBacklight(); // Turn off LCD backlight
  delay(2000);
  lcd.backlight(); // Turn on LCD backlight

// Screen 3 - Umlaute
  lcd.print("Umlaute"); // write text
  lcd.setCursor(0, 1); // Set cursor to line 2
  lcd.write(239); // ö
  lcd.print("=239 "); // write text
  lcd.write(245); // ü
  lcd.print("=245 "); // write text
  lcd.write(225); // ä
  lcd.print("=225"); // write text

  lcd.setCursor(0, 2); // Set cursor to line 3
  lcd.print("Beispiel Symbole"); // write text
  lcd.setCursor(0, 3); // Set cursor to line 4
  lcd.write(2); // Clock
  lcd.print("=2 "); // write text
  lcd.write(3); // Heart
  lcd.print("=3 "); // write text
  lcd.write(5); // Check Mark
  lcd.print("=5 "); // write text
  lcd.write(6); // Cancel
  lcd.print("=6"); // write text

  delay(5000);
  lcd.clear(); // Clear LCD Screen

// Screen 4 - COde Description
  lcd.setCursor(0, 1); // Set cursor to line 2
  lcd.print(" Showing Code 0-255"); // write text
  
  delay(5000);

// Screen 5 - Display Key Codes
  displayKeyCodes();
}

// Function to display all keycodes
void displayKeyCodes(void) {
  uint8_t i = 0;
  while (1) {
    lcd.clear();
    
    lcd.print("Code ");
    lcd.print(i);
    lcd.print(" - ");
    lcd.print(i + 15);
    lcd.setCursor(0, 1);
    for (int j = 0; j < 16; j++) {
      lcd.write(i + j);
    }
    i += 16;
    
    lcd.setCursor(0, 2);
    lcd.print("Code ");
    lcd.print(i);
    lcd.print(" - ");
    lcd.print(i + 15);
    
    lcd.setCursor(0, 3);
    for (int j = 0; j < 16; j++) {
      lcd.write(i + j);
  }
  i += 16;
  delay(6000);
  }
}

void loop()
{
  // Nothing to do here
}

4 Gedanken zu „I2C LCD und Arduino“

  1. Hallo Nikolaus,
    habe Deinen Sketch mal getestet (ARDUINO UNO + LCD 4×20 I2C).
    Auch hier tritt bei der Ausgabe von “normalen” Zeichen (hier Screen 1 – Logo) bei meiner Schaltung folgender Fehler auf:
    Es wird jeweils nur das Zeichen der ersten Spalte ausgegeben; d.h. z.B.
    statt “www.nikolaus-” wird nur ein “w” angezeigt.
    Ich habe schon einige Experimente diesbezüglich hinter mir und keine Idee mehr.
    Wäre über jeglichen Tipp dankbar.

    Herbert

    1. Hallo Herbert,

      dieser Fehler ist mir so nicht bekannt bzw. ich wüsste nicht, das ich diesen so schon einmal hatte. Hast du mal eine der vielen anderen Libraries (z. B. Adafruit_LiquidCrystal und dort das HelloWorld_i2c Beispiel) ausprobiert und hast du ggf. die Möglichkeit ein anderes Display zu testen?

      Viele Grüße
      Stefan

      1. Hallo Stefan,

        danke für Deine Rückmeldung.
        Ich habe mein Problem zwischenzeitlich gelöst:
        Ursache war, dass es auf meinem PC zwei verschiedene Verzeichnisse der ARDUINO- Software gab;
        inkl. des “library”- Ordners.
        Ich bin dabei über folgende Fehlermeldung beim Compilieren gestossen:
        “Mehrere Bibliotheken wurden für “LiquidCrystal_I2C.h” gefunden.”
        “Benutzt: C:{pfad…}LiquidCrystal_I2C”
        “Nicht benutzt: C:{pfad…}LiquidCrystal_I2C_I2C-1.1.2”
        Nach der Bereinigung lief das ganze auch wie gewünscht an dem WIN7- Rechner.
        Falls also jemand ähnliche Probleme haben sollte, kann es auch daran liegen.
        Trotzdem danke nochmal für Deine Hinweise.

        Grüße

        Herbert

  2. Hallo Nikolaus,
    wo kann ich diese Library
    // I2C Bibliothek einbinden
    herunter laden.
    Alle Versuche gingen schief.

    Viele Grüße
    Alwin

Schreibe einen Kommentar

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