Composants · 5 min de lecture

Utiliser un écran LCD I2C (16x2) avec Arduino, ESP32 et Pico

Comment brancher un écran LCD I2C 16x2 sur Arduino ? Câblage à 4 fils, trouver l'adresse I2C (0x27, 0x3F), bibliothèque LiquidCrystal_I2C, réglage du contraste, caractères personnalisés et texte défilant.

L'écran LCD 16x2, qui affiche 2 lignes de 16 caractères, est l'écran le plus répandu dans le monde Arduino. On s'en sert pour afficher des mesures comme la température ou la distance, des menus, des horloges ou des scores de jeu. L'écran lui-même a 16 broches et demande à lui seul au moins 6 broches numériques ; le petit module I2C soudé au dos ramène ce nombre à 2 fils de données. Dans cet article, tu verras pas à pas comment brancher un LCD I2C, trouver son adresse et y afficher ce que tu veux.

Écran LCD 16x2 avec module I2C
LCD 16x2 avec module I2C : grâce à la petite carte au dos, il se branche avec seulement 4 fils.

Comment fonctionne un écran LCD ?

Ces écrans utilisent une puce de commande appelée HD44780. Chaque caractère est dessiné dans une petite case de 5x8 pixels et la puce contient une table de caractères toute prête : lettres, chiffres et quelques symboles. L'Arduino envoie seulement l'ordre « écris cette lettre à cet endroit » ; transformer la lettre en pixels, c'est le travail de l'écran. Le rétroéclairage LED rend le texte lisible dans le noir, tandis que la couche de cristaux liquides forme le texte en assombrissant les pixels.

Qu'est-ce que l'I2C et pourquoi simplifie-t-il tout ?

L'I2C permet à plusieurs appareils de communiquer sur deux fils : SDA transporte les données et SCL le signal d'horloge. Chaque appareil possède sa propre adresse, et l'Arduino appelle celui qu'il veut par cette adresse. Les modules LCD utilisent généralement l'adresse 0x27 ou 0x3F. Un module horloge, un écran OLED et des capteurs comme le BME280 peuvent partager les mêmes deux fils : tant que leurs adresses sont différentes, tout fonctionne ensemble.

Module adaptateur I2C PCF8574 pour LCD
Module I2C à base de PCF8574 : le potentiomètre bleu règle le contraste et le cavalier allume ou éteint le rétroéclairage.

La puce PCF8574 du module convertit les commandes reçues en I2C en 8 signaux parallèles attendus par l'écran. Tu peux utiliser l'écran sans module I2C, mais il faut alors 6 broches, un potentiomètre et beaucoup de fils. Le module économise des broches et simplifie le montage.

Caractéristiques techniques

CaractéristiqueValeur
Affichage16 colonnes × 2 lignes de caractères
Taille d'un caractère5 × 8 pixels
Puce de commandeHD44780 (ou compatible)
Adaptateur I2CPCF8574 / PCF8574A
Adresse par défaut0x27 (PCF8574) ou 0x3F (PCF8574A)
Alimentation5 V, environ 20–30 mA rétroéclairage allumé
ConnexionsGND, VCC, SDA, SCL

Câblage du LCD I2C : Arduino, ESP32 et Pico

Le câblage utilise les mêmes quatre fils sur toutes les cartes ; seules les broches de SDA et SCL changent. Pour voir les broches I2C de ta carte, consulte l'outil Brochage.

Broche du LCDArduino Uno / NanoArduino MegaESP32Raspberry Pi Pico
GNDGNDGNDGNDGND
VCC5V5VVIN (5V)VBUS (5V)
SDAA420GPIO 21GP4
SCLA521GPIO 22GP5
Le module I2C tire les lignes SDA et SCL vers son propre VCC, donc vers 5 V. Les broches de l'ESP32 et du Pico fonctionnent en 3,3 V. Même si cela marche souvent en pratique, le plus sûr est d'intercaler un convertisseur de niveau I2C bidirectionnel, ou de retirer les résistances de tirage du module pour tirer les lignes vers 3,3 V.

Trouver l'adresse I2C : le scanner

Si tu n'es pas sûr de l'adresse de ton écran, téléverse le code ci-dessous. Il essaie toutes les adresses de 1 à 126 et affiche dans le moniteur série l'adresse de chaque appareil qui répond. C'est cette adresse que tu utiliseras pour déclarer l'écran.

Arduino (C++)
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}

Installer la bibliothèque et afficher du texte

Dans le gestionnaire de bibliothèques, cherche LiquidCrystal I2C et installe la bibliothèque de Frank de Brabander. Le code ci-dessous affiche un message de bienvenue sur la première ligne et, sur la deuxième, le nombre de secondes écoulées depuis le démarrage de l'Arduino.

Arduino (C++)
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}
Si l'écran s'allume mais n'affiche aucun texte, ou si la ligne du haut ne montre que des pavés pleins, tourne doucement le potentiomètre bleu au dos du module avec un petit tournevis. C'est le réglage du contraste, et il règle la plupart des problèmes du type « mon écran ne marche pas ».

Les commandes LCD les plus utiles

CommandeCe qu'elle fait
lcd.init()Initialise l'écran ; à appeler une fois dans setup().
lcd.backlight() / lcd.noBacklight()Allume ou éteint le rétroéclairage.
lcd.setCursor(colonne, ligne)Choisit où commence le texte ; on compte à partir de 0.
lcd.print(valeur)Affiche un texte ou un nombre.
lcd.clear()Efface tout l'écran et ramène le curseur au début.
lcd.scrollDisplayLeft()Décale tout l'affichage d'un caractère vers la gauche.
lcd.blink() / lcd.cursor()Affiche un curseur clignotant ou souligné.
lcd.createChar(n, tableau)Enregistre un caractère personnalisé dans les emplacements 0 à 7.

Faire défiler un texte

Pour afficher un texte de plus de 16 caractères, tu peux faire défiler l'écran. Le code ci-dessous écrit le texte puis le décale vers la gauche toutes les 300 millisecondes : un long message défile comme sur une enseigne.

Arduino (C++)
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}

Caractères personnalisés et lettres accentuées

La table de caractères du HD44780 ne contient pas les lettres accentuées comme é, è, à, ç ; si tu essaies de les afficher, tu verras des symboles sans signification. La solution consiste à définir jusqu'à 8 caractères personnalisés de 5x8 pixels. Chaque ligne s'écrit sous forme d'un octet, et les bits à 1 sont les pixels allumés. L'exemple ci-dessous dessine un cœur ; tu peux dessiner é ou ç de la même manière.

Arduino (C++)
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 heart

LCD I2C avec l'ESP32 et le Raspberry Pi Pico

Sur l'ESP32, le même code Arduino et la même bibliothèque fonctionnent ; Wire.begin() utilise par défaut GPIO 21 (SDA) et GPIO 22 (SCL). Pour d'autres broches, écris Wire.begin(SDA, SCL). Sur le Raspberry Pi Pico en MicroPython, copie sur le Pico deux petits fichiers appelés lcd_api.py et pico_i2c_lcd.py, puis utilise-les ainsi :

MicroPython
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")

Idées de projets avec un LCD I2C

  • Thermomètre numérique : affiche la température et l'humidité ; pour le capteur, vois Capteur de température et d'humidité DHT11.
  • Afficheur de distance : affiche en centimètres la distance mesurée par un HC-SR04 ; détails dans Capteur de distance HC-SR04.
  • Voltmètre numérique : affiche la tension lue sur une broche analogique.
  • Serrure à code : affiche en étoiles le code saisi sur un clavier matriciel.
  • Système de menus : parcours les options à l'écran avec un potentiomètre ou deux boutons.
  • Mini-jeu : fais esquiver des obstacles à un coureur dessiné avec des caractères personnalisés.

Erreurs fréquentes et solutions

  • Écran allumé mais pas de texte : le contraste n'est pas réglé ; tourne le potentiomètre.
  • Pavés pleins sur la ligne du haut : l'écran est alimenté mais pas initialisé ; l'adresse est peut-être fausse, SDA et SCL inversés, ou lcd.init() n'est pas appelé.
  • Mauvaise adresse : le code indique 0x27 mais l'écran est en 0x3F ; trouve la vraie adresse avec le scanner.
  • Anciens chiffres qui restent : un nombre qui passe de 100 à 99 s'affiche 990 ; écris quelques espaces après le nombre. lcd.clear() fonctionne aussi, mais il est lent et fait scintiller l'écran si tu l'appelles souvent dans la boucle.
  • Lettres accentuées illisibles : elles ne sont pas dans la table de l'écran ; définis des caractères personnalisés ou évite-les.
  • Texte corrompu au hasard : des fils longs et mal fixés ou des composants parasites comme les moteurs peuvent perturber le bus I2C ; garde les fils courts et alimente les moteurs séparément.

Associer l'écran à un capteur est le moyen le plus rapide de réaliser ton premier vrai projet. Dans l'application BlueGrays, tu trouveras des dizaines de projets avec LCD I2C, avec schémas et code prêt à l'emploi ; et pour modifier des valeurs avec un bouton rotatif, Qu'est-ce qu'un potentiomètre ? te sera utile.

Questions fréquentes

Pourquoi mon LCD n'affiche que des carrés ?

Des pavés pleins sur la ligne du haut signifient que l'écran est alimenté mais n'a pas été initialisé. L'adresse est peut-être fausse, SDA et SCL inversés, ou le contraste trop élevé. Vérifie d'abord l'adresse avec le scanner I2C, puis règle le potentiomètre.

Mon LCD I2C est-il en 0x27 ou en 0x3F ?

Les modules à puce PCF8574 utilisent généralement 0x27, ceux à PCF8574A 0x3F. Le plus simple est d'utiliser le scanner I2C ; il suffit ensuite de modifier le code en LiquidCrystal_I2C lcd(0x3F, 16, 2).

Peut-on brancher deux LCD sur un même Arduino ?

Oui. En pontant les pastilles A0, A1 et A2 du module, on change son adresse : jusqu'à 8 LCD peuvent ainsi partager les deux mêmes fils. Dans le code, tu déclares un objet par écran avec sa propre adresse.

Le même code fonctionne-t-il pour un LCD 20x4 ?

Oui. Il suffit de modifier la déclaration en LiquidCrystal_I2C lcd(0x27, 20, 4) ; les lignes vont alors de 0 à 3 et les colonnes de 0 à 19.

Comment afficher des lettres accentuées sur un LCD ?

La table intégrée de l'écran ne contient pas é, è, à ou ç. Dessine chaque lettre comme un caractère personnalisé de 5x8 pixels avec lcd.createChar(), puis affiche-la avec lcd.write(). N'oublie pas que tu ne peux définir que 8 caractères personnalisés à la fois.

Vaut-il mieux un écran LCD ou OLED ?

Le LCD est bon marché, lisible au soleil et idéal pour du texte et des chiffres. L'OLED est plus petit, très contrasté et sait dessiner des graphiques et des icônes, mais il peut marquer si la même image reste affichée longtemps. Choisis le LCD pour le texte et l'OLED pour le graphisme.

Voir tous les projets
Utilisation de l'écran LCD avec I2C
#32Débutant
Premium

Utilisation de l'écran LCD avec I2C

Grâce au module I2C, le projet qui imprime des messages en contrôlant l'écran LCD avec seulement 2 câbles (SDA, SCL). Il enseigne comment économiser des pins avec le protocole I2C.

4.8(53)
69
Impression d'un message sur un écran LCD 2x16
#29Avancé
Premium

Impression d'un message sur un écran LCD 2x16

Projet qui imprime caractère par caractère sur un écran LCD 2x16 et affiche un message cyclique en effaçant l'écran. La bibliothèque LCD enseigne l'utilisation des fonctions setCursor et print.

4.6(37)
51
Ecriture d'un multiplicateur gauche et droit à l'aide d'un écran LCD
#30Avancé
Premium

Ecriture d'un multiplicateur gauche et droit à l'aide d'un écran LCD

Projet qui crée un effet d'animation qui frappe les murs en déplaçant le texte de gauche à droite sur l'écran LCD. Enseigne le positionnement dynamique de setCursor et la logique d'animation du texte.

4.5(29)
40
Écran LCD I2C ESP32 (16x2)
#119Intermédiaire
Premium

Écran LCD I2C ESP32 (16x2)

Dans ce projet, nous affichons du texte en connectant un écran LCD 16x2 à l'ESP32 via le protocole I2C. Grâce à l'I2C, nous pouvons contrôler l'écran avec seulement 2 broches de données (SDA et SCL) ; cela évite le gaspillage de 6 broches ou plus inhérent à la connexion parallèle classique. Le code affiche un message fixe sur la première ligne et un compteur qui augmente chaque seconde sur la deuxième ligne. De plus, au démarrage, nous lançons un scanner I2C pour afficher l'adresse de l'écran su

4.9(22)
39
Température et humidité avec DHT11
#55Intermédiaire

Température et humidité avec DHT11

Projet qui mesure la température et l'humidité ambiantes à l'aide d'un capteur DHT11 et les affiche sur un écran LCD I2C. Enseigne l'utilisation d'un capteur numérique de température et d'humidité.

4.7(47)
60
Voltmètre numérique avec écran LCD
#56Intermédiaire
Premium

Voltmètre numérique avec écran LCD

Projet de voltmètre numérique affichant le résultat sur l'écran LCD I2C en mesurant la tension dans la plage de 0 à 55 V avec un circuit de diviseur de tension. Enseigne la formule du diviseur de tens

4.5(27)
36
Clavier 4x4 Affichage LCD Application du mot de passe
#64Avancé
Premium

Clavier 4x4 Affichage LCD Application du mot de passe

Projet de sécurité qui ouvre la porte à l'aide d'un servo si la saisie du mot de passe est correcte à l'aide d'un clavier 4x4 et qui allume une LED rouge si la saisie est incorrecte. Enseigne la compa

4.8(57)
75
Jeu Arduino LCD Runner
#98Intermédiaire
Premium

Jeu Arduino LCD Runner

Jeu de course sans fin à défilement latéral fonctionnant sur un écran LCD de 6x2 caractères. Le héros court automatiquement, le joueur saute par-dessus les obstacles en appuyant sur le bouton. Des obstacles aléatoires apparaissent sur les rangées du haut et du bas. Un buzzer passif joue la mélodie d'ouverture, le son de saut, le son de célébration des 50 points et la mélodie de fin de partie. L'écran d'accueil "BlueGrays - Arduino Projects" s'affiche au démarrage. Le score est mis à jour instant

4.7(31)
53

Apprends à brancher un LCD 16x2 avec module I2C en 4 fils seulement, à trouver son adresse, à afficher du texte et des nombres, à faire défiler un message et à dessiner tes propres symboles.

Utiliser un écran LCD I2C (16x2) avec Arduino, ESP32 et Pico | BlueGrays