I2C-LCD-Display (16x2) verwenden: Arduino, ESP32 und Pico
Wie schließt man ein 16x2-I2C-LCD an den Arduino an? Verkabelung mit 4 Drähten, I2C-Adresse finden (0x27, 0x3F), Bibliothek LiquidCrystal_I2C, Kontrast einstellen, eigene Zeichen und Lauftext.
Das 16x2-LCD, das 2 Zeilen mit je 16 Zeichen anzeigt, ist das verbreitetste Display in der Arduino-Welt. Man nutzt es für Messwerte wie Temperatur und Entfernung, für Menüs, Uhren und Spielstände. Das Display selbst hat 16 Pins und braucht allein mindestens 6 digitale Pins; das kleine I2C-Modul auf der Rückseite reduziert das auf nur 2 Datenleitungen. In diesem Beitrag siehst du Schritt für Schritt, wie du ein I2C-LCD anschließt, seine Adresse findest und beliebige Texte darauf ausgibst.

Wie funktioniert ein LCD-Display?
Diese Displays arbeiten mit einem Treiberchip namens HD44780. Jedes Zeichen wird in einem kleinen Feld aus 5x8 Pixeln dargestellt, und im Chip steckt eine fertige Zeichentabelle mit Buchstaben, Ziffern und einigen Symbolen. Der Arduino schickt nur den Befehl "schreibe diesen Buchstaben an diese Stelle"; das Umsetzen in Pixel erledigt das Display. Die LED-Hintergrundbeleuchtung macht den Text auch im Dunkeln lesbar, während die Flüssigkristallschicht die Pixel abdunkelt und so den Text bildet.
Was ist I2C und warum macht es alles einfacher?
I2C ist ein Kommunikationsweg, über den mehrere Geräte mit nur zwei Leitungen sprechen: SDA überträgt die Daten, SCL das Taktsignal. Jedes Gerät hat eine eigene Adresse, über die der Arduino es anspricht. LCD-Module nutzen meist die Adresse 0x27 oder 0x3F. An dieselben zwei Leitungen lassen sich auch ein Uhrmodul, ein OLED-Display und Sensoren wie der BME280 hängen – solange die Adressen verschieden sind, arbeiten alle zusammen.

Der PCF8574-Chip auf dem Modul wandelt die über I2C ankommenden Befehle in die 8 parallelen Signale um, die das Display erwartet. Du kannst das Display auch ohne I2C-Modul betreiben, brauchst dann aber 6 Pins, ein Potentiometer und viele Kabel. Das Modul spart Pins und hält die Schaltung übersichtlich.
Technische Daten
| Merkmal | Wert |
|---|---|
| Anzeige | 16 Spalten × 2 Zeilen Zeichen |
| Zeichengröße | 5 × 8 Pixel |
| Treiberchip | HD44780 (oder kompatibel) |
| I2C-Adapter | PCF8574 / PCF8574A |
| Standardadresse | 0x27 (PCF8574) oder 0x3F (PCF8574A) |
| Versorgung | 5 V, etwa 20–30 mA mit Hintergrundbeleuchtung |
| Anschlüsse | GND, VCC, SDA, SCL |
I2C-LCD anschließen: Arduino, ESP32 und Pico
Bei allen Boards sind es dieselben vier Drähte; es ändert sich nur, auf welchen Pins SDA und SCL liegen. Die I2C-Pins deines Boards findest du im Werkzeug Pinout.
| LCD-Pin | Arduino Uno / Nano | Arduino Mega | ESP32 | Raspberry Pi Pico |
|---|---|---|---|---|
| GND | GND | GND | GND | GND |
| VCC | 5V | 5V | VIN (5V) | VBUS (5V) |
| SDA | A4 | 20 | GPIO 21 | GP4 |
| SCL | A5 | 21 | GPIO 22 | GP5 |
I2C-Adresse finden: Scanner-Sketch
Wenn du die Adresse deines Displays nicht kennst, lade den folgenden Code hoch. Er probiert alle Adressen von 1 bis 126 durch und gibt die Adresse jedes antwortenden Geräts im seriellen Monitor aus. Diese Adresse brauchst du beim Einrichten des Displays.
1#include <Wire.h>
2
3void setup() {
4 Wire.begin();
5 Serial.begin(9600);
6 Serial.println("I2C taranıyor / scanning...");
7 for (byte addr = 1; addr < 127; addr++) {
8 Wire.beginTransmission(addr);
9 if (Wire.endTransmission() == 0) { // cihaz cevap verdi / device answered
10 Serial.print("Bulundu / found: 0x");
11 Serial.println(addr, HEX);
12 }
13 }
14}
15
16void loop() {
17}Bibliothek installieren und Text ausgeben
Suche im Bibliotheksverwalter nach LiquidCrystal I2C und installiere die Bibliothek von Frank de Brabander. Der folgende Code schreibt in die erste Zeile einen Gruß und in die zweite die Sekunden seit dem Start des Arduino.
1#include <Wire.h>
2#include <LiquidCrystal_I2C.h>
3
4LiquidCrystal_I2C lcd(0x27, 16, 2); // adres, sütun, satır / address, columns, rows
5
6void setup() {
7 lcd.init();
8 lcd.backlight(); // arka ışığı aç / backlight on
9 lcd.setCursor(0, 0); // sütun 0, satır 0 / column 0, row 0
10 lcd.print("Merhaba Dunya!");
11}
12
13void loop() {
14 lcd.setCursor(0, 1); // ikinci satır / second row
15 lcd.print("Sure: ");
16 lcd.print(millis() / 1000); // saniye / seconds
17 lcd.print(" sn "); // eski rakamları sil / clear old digits
18 delay(200);
19}Die wichtigsten LCD-Befehle
| Befehl | Was er macht |
|---|---|
| lcd.init() | Initialisiert das Display; einmal in setup() aufrufen. |
| lcd.backlight() / lcd.noBacklight() | Schaltet die Hintergrundbeleuchtung ein oder aus. |
| lcd.setCursor(spalte, zeile) | Legt fest, wo der Text beginnt; gezählt wird ab 0. |
| lcd.print(wert) | Gibt Text oder eine Zahl aus. |
| lcd.clear() | Löscht das ganze Display und setzt den Cursor an den Anfang. |
| lcd.scrollDisplayLeft() | Schiebt die gesamte Anzeige um ein Zeichen nach links. |
| lcd.blink() / lcd.cursor() | Zeigt einen blinkenden oder unterstrichenen Cursor. |
| lcd.createChar(nr, array) | Speichert ein eigenes Zeichen in Platz 0–7. |
Lauftext erzeugen
Um Text mit mehr als 16 Zeichen zu zeigen, kannst du die Anzeige verschieben. Der folgende Code schreibt den Text und schiebt ihn alle 300 Millisekunden nach links, sodass eine lange Nachricht wie auf einer Anzeigetafel durchläuft.
1#include <Wire.h>
2#include <LiquidCrystal_I2C.h>
3
4LiquidCrystal_I2C lcd(0x27, 16, 2);
5
6void setup() {
7 lcd.init();
8 lcd.backlight();
9 lcd.print("BlueGrays ile elektronik ogren"); // 16 karakterden uzun / longer than 16 chars
10}
11
12void loop() {
13 lcd.scrollDisplayLeft(); // bir adım sola / one step left
14 delay(300);
15}Eigene Zeichen und Umlaute
Die Zeichentabelle des HD44780 ist für Sonderbuchstaben kaum geeignet: Umlaute wie ä, ö, ü erreichst du nur über spezielle Zeichencodes, und Buchstaben wie ş, ğ oder ç fehlen ganz; schreibst du sie direkt in den Code, erscheinen sinnlose Zeichen. Die Lösung sind bis zu 8 eigene Zeichen mit 5x8 Pixeln. Jede Zeile wird als ein Byte geschrieben, die Bits mit 1 sind leuchtende Pixel. Das Beispiel unten zeichnet ein Herz; auf dieselbe Weise kannst du jeden Sonderbuchstaben zeichnen.
1byte heart[8] = {
2 0b00000,
3 0b01010,
4 0b11111,
5 0b11111,
6 0b01110,
7 0b00100,
8 0b00000,
9 0b00000
10};
11
12// setup() içinde / inside setup()
13lcd.createChar(0, heart); // 0. yuvaya kaydet / store in slot 0
14lcd.setCursor(15, 0);
15lcd.write(byte(0)); // kalbi göster / show the heartI2C-LCD mit ESP32 und Raspberry Pi Pico
Am ESP32 funktionieren derselbe Arduino-Code und dieselbe Bibliothek; Wire.begin() nutzt standardmäßig GPIO 21 (SDA) und GPIO 22 (SCL). Für andere Pins schreibst du Wire.begin(SDA, SCL). Am Raspberry Pi Pico mit MicroPython kopierst du die zwei kleinen Dateien lcd_api.py und pico_i2c_lcd.py auf den Pico und nutzt sie so:
1from machine import I2C, Pin
2from pico_i2c_lcd import I2cLcd # Pico'ya kopyalanan dosya / file copied to the Pico
3
4i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)
5addr = i2c.scan()[0] # ilk bulunan adres / first found address
6lcd = I2cLcd(i2c, addr, 2, 16) # 2 satır, 16 sütun / 2 rows, 16 columns
7
8lcd.putstr("Merhaba Pico!")
9lcd.move_to(0, 1) # sütun 0, satır 1 / column 0, row 1
10lcd.putstr("BlueGrays")Projektideen mit I2C-LCD
- Digitales Thermometer: Temperatur und Luftfeuchtigkeit anzeigen; für die Sensorseite siehe DHT11 Temperatur- und Feuchtigkeitssensor.
- Entfernungsanzeige: die mit einem HC-SR04 gemessene Entfernung in Zentimetern anzeigen; Details in HC-SR04 Entfernungssensor.
- Digitales Voltmeter: die an einem Analogpin gemessene Spannung anzeigen.
- Codeschloss: den auf einem Tastenfeld eingegebenen Code als Sternchen anzeigen.
- Menüsystem: mit einem Potentiometer oder zwei Tastern durch die Optionen blättern.
- Minispiel: eine aus eigenen Zeichen gezeichnete Figur Hindernissen ausweichen lassen.
Typische Fehler und ihre Lösungen
- Display leuchtet, aber kein Text: Der Kontrast ist nicht eingestellt; dreh am Trimmpoti.
- Volle Kästchen in der oberen Zeile: Das Display hat Strom, wurde aber nicht initialisiert; Adresse falsch, SDA und SCL vertauscht oder lcd.init() fehlt.
- Falsche Adresse: Im Code steht 0x27, das Display hat aber 0x3F; finde die echte Adresse mit dem Scanner-Sketch.
- Alte Ziffern bleiben stehen: Fällt eine Zahl von 100 auf 99, erscheint 990; schreibe nach der Zahl ein paar Leerzeichen. lcd.clear() hilft auch, ist aber langsam und lässt das Display flackern, wenn du es oft in der Schleife aufrufst.
- Sonderzeichen verstümmelt: Sie fehlen in der Tabelle des Displays; definiere eigene Zeichen oder verzichte auf sie.
- Zufällig gestörter Text: Lange, lose Kabel oder störende Bauteile wie Motoren können den I2C-Bus beeinträchtigen; halte die Kabel kurz und versorge Motoren separat.
Das Display mit einem Sensor zu kombinieren, ist der schnellste Weg zu deinem ersten echten Projekt. In der BlueGrays-App findest du Dutzende I2C-LCD-Projekte mit Schaltplänen und fertigem Code; um Werte mit einem Drehknopf zu ändern, hilft dir Was ist ein Potentiometer?
Häufige Fragen
Warum zeigt mein LCD nur Kästchen?
Volle Kästchen in der oberen Zeile bedeuten, dass das Display Strom hat, aber nicht initialisiert wurde. Die Adresse kann falsch sein, SDA und SCL können vertauscht sein oder der Kontrast ist zu hoch. Prüfe zuerst die Adresse mit dem I2C-Scanner und stelle dann das Trimmpoti ein.
Hat mein I2C-LCD die Adresse 0x27 oder 0x3F?
Module mit PCF8574-Chip nutzen meist 0x27, Module mit PCF8574A meist 0x3F. Am einfachsten findest du es mit dem I2C-Scanner heraus; danach änderst du den Code einfach in LiquidCrystal_I2C lcd(0x3F, 16, 2).
Kann ich zwei LCDs an einen Arduino anschließen?
Ja. Durch Brücken der Lötpads A0, A1 und A2 auf dem Modul änderst du die Adresse; so passen bis zu 8 LCDs an dieselben zwei Leitungen. Im Code legst du für jedes Display ein eigenes Objekt mit seiner Adresse an.
Funktioniert derselbe Code auch für ein 20x4-LCD?
Ja. Ändere nur die Deklaration in LiquidCrystal_I2C lcd(0x27, 20, 4); die Zeilen laufen dann von 0 bis 3 und die Spalten von 0 bis 19.
Wie gebe ich Sonderzeichen auf einem LCD aus?
Die eingebaute Tabelle enthält Buchstaben wie ş, ğ oder ç nicht. Zeichne sie mit lcd.createChar() als eigene 5x8-Pixel-Zeichen und gib sie mit lcd.write() aus. Denk daran, dass gleichzeitig höchstens 8 eigene Zeichen definiert werden können.
Soll ich ein LCD oder ein OLED-Display nehmen?
Ein LCD ist günstig, in der Sonne gut lesbar und ideal für Text und Zahlen. Ein OLED ist kleiner, sehr kontrastreich und kann Grafiken und Symbole zeichnen, kann aber einbrennen, wenn lange dasselbe Bild steht. Für Text das LCD, für Grafik das OLED.
Projekte, die du danach bauen kannst
Alle Projekte ansehen
Verwendung des LCD-Bildschirms mit I2C
Dank des I2C-Moduls druckt das Projekt Nachrichten, indem es den LCD-Bildschirm mit nur 2 Kabeln (SDA, SCL) steuert. Es lehrt, wie man Pins mit dem I2C-Protokoll speichern kann.

Nachricht auf 2x16 LCD-Bildschirm drucken
Projekt, das Zeichen für Zeichen auf einem 2x16 LCD-Bildschirm ausgibt und eine zyklische Meldung anzeigt, indem es den Bildschirm löscht. Die LCD-Bibliothek lehrt die Verwendung der Funktionen setCur

Schreibender linker und rechter Multiplikator mit LCD
Projekt, das einen Animationseffekt erzeugt, der die Wände trifft, indem der Text auf dem LCD-Bildschirm nach links und rechts bewegt wird. Lehrt dynamische setCursor-Positionierung und Textanimations

ESP32 I2C-LCD-Display (16×2)
In diesem Projekt zeigen wir Text an, indem wir ein 16x2-Zeichen-LCD-Display über das I2C-Protokoll an den ESP32 anschließen. Dank I2C können wir das Display mit nur zwei Datenpins (SDA und SCL) steuern; die Verschwendung von 6+ Pins bei einer klassischen parallelen Verbindung entfällt. Der Code schreibt in die erste Zeile eine feste Meldung und in die zweite Zeile einen Zähler, der sich jede Sekunde erhöht. Außerdem lassen wir zu Beginn den I2C-Scanner laufen und geben die Adresse des Displays

Temperatur und Luftfeuchtigkeit mit DHT11
Projekt zur Messung der Umgebungstemperatur und der Luftfeuchtigkeit mit einem DHT11-Sensor und Anzeige auf einem I2C-LCD-Bildschirm. Lehrt die Verwendung eines digitalen Temperatur-/Luftfeuchtigkeits

Digitales Voltmeter mit LCD-Anzeige
Digitales Voltmeter-Projekt, das das Ergebnis auf dem I2C-LCD-Bildschirm anzeigt, indem es die Spannung im Bereich von 0-55 V mit einer Spannungsteilerschaltung misst. Lehrt die Formel für den Spannun

4x4 Tastatur LCD Display Passwort Anwendung
Sicherheitsprojekt, das die Tür mit einem Servo öffnet, wenn das Passwort mit einer 4x4-Tastatur richtig eingegeben wird, und eine rote LED aufleuchtet, wenn es falsch ist. Lehrt Passwortvergleich und

Arduino LCD-Läufer-Spiel
Seitlich scrollendes Endlos-Laufspiel, das auf einem 6x2-Zeichen-LCD-Bildschirm läuft. Der Held läuft automatisch, der Spieler springt über Hindernisse, indem er die Taste drückt. Zufällige Hindernisse erscheinen in der oberen und unteren Reihe. Passiver Buzzer spielt Eröffnungsmelodie, Sprunggeräusch, 50-Punkte-Feierton und Spielende-Melodie. Beim Start wird der Splash-Screen "BlueGrays - Arduino Projects" angezeigt. Der Punktestand wird sofort in der oberen rechten Ecke des Bildschirms aktuali
Weitere Artikel
Lerne, ein 16x2-LCD mit I2C-Modul über nur 4 Drähte anzuschließen, seine Adresse zu finden, Text und Zahlen auszugeben, Lauftext zu erzeugen und eigene Symbole zu zeichnen.

