Note

Bonjour, bienvenue dans la communauté SunFounder des passionnés de Raspberry Pi, Arduino et ESP32 sur Facebook ! Plongez-vous plus profondément dans l’univers du Raspberry Pi, de l’Arduino et de l’ESP32 avec d’autres passionnés.

Pourquoi nous rejoindre ?

  • Support d’experts : Résolvez les problèmes après-vente et les défis techniques grâce à l’aide de notre communauté et de notre équipe.

  • Apprendre et partager : Échangez des astuces et des tutoriels pour perfectionner vos compétences.

  • Aperçus exclusifs : Profitez d’un accès anticipé aux nouvelles annonces de produits et aux aperçus.

  • Remises spéciales : Bénéficiez de réductions exclusives sur nos derniers produits.

  • Promotions festives et cadeaux : Participez à des tirages au sort et à des promotions pendant les fêtes.

👉 Prêt à explorer et à créer avec nous ? Cliquez sur [Ici] et rejoignez-nous dès aujourd’hui !

1.1.7 LCD1602 I2C

Introduction

Le LCD1602 est un écran à cristaux liquides de type caractère, capable d’afficher 32 caractères (16*2) simultanément.

Composants

../_images/list_i2c_lcd1.png

Principe

LCD1602 I2C

../_images/i2c_lcd16022.png
  • GND : Masse

  • VCC : Alimentation électrique, 5V.

  • SDA : Ligne de données série. Connecter au VCC via une résistance de tirage.

  • SCL : Ligne d’horloge série. Connecter au VCC via une résistance de tirage.

Comme vous le savez, bien que les écrans LCD et d’autres types d’affichages enrichissent considérablement l’interaction homme-machine, ils présentent un inconvénient commun : lorsqu’ils sont connectés à un contrôleur, ils occupent de nombreux ports d’E/S, limitant ainsi d’autres fonctionnalités.

C’est pourquoi le LCD1602 avec un module I2C a été développé pour résoudre ce problème. Le module I2C intègre une puce PCF8574 qui convertit les données série I2C en données parallèles pour l’affichage sur le LCD.

Adresse I2C

L’adresse par défaut est généralement 0x27, dans quelques cas, elle peut être 0x3F.

Prenons l’exemple de l’adresse par défaut 0x27, l’adresse de l’appareil peut être modifiée en court-circuitant les broches A0/A1/A2 ; à l’état par défaut, A0/A1/A2 sont à 1, et si le pont est réalisé, A0/A1/A2 sont à 0.

../_images/i2c_address2.jpg

Rétroéclairage/Contraste

Le rétroéclairage peut être activé par un cavalier. Retirez le cavalier pour désactiver le rétroéclairage. Le potentiomètre bleu à l’arrière est utilisé pour ajuster le contraste (le rapport de luminosité entre le blanc le plus brillant et le noir le plus sombre).

../_images/back_lcd16022.jpg
  • Cavalier de court-circuit : Le rétroéclairage peut être activé grâce à ce cavalier. Retirez-le pour désactiver le rétroéclairage.

  • Potentiomètre : Utilisé pour ajuster le contraste (la clarté du texte affiché), qui augmente dans le sens horaire et diminue dans le sens antihoraire.

Schéma de câblage

T-Board Name

physical

SDA1

Pin 3

SCL1

Pin 5

../_images/schematic_i2c_lcd1.png

Procédures expérimentales

Étape 1 : Construisez le circuit.

../_images/image961.png

Étape 2 : Configurez I2C (voir Configuration I²C. Si vous avez déjà configuré I2C, passez cette étape).

Étape 3 : Changez de répertoire.

cd ~/davinci-kit-for-raspberry-pi/c/1.1.7/

Étape 4 : Compilez.

gcc 1.1.7_Lcd1602.c -lwiringPi

Étape 5 : Exécutez.

sudo ./a.out

Après l’exécution du code, vous verrez « Greetings », « From SunFounder » s’afficher sur le LCD.

Note

  • Si une erreur indique wiringPi.h: No such file or directory, veuillez vous référer à Installer et vérifier WiringPi.

  • Si vous obtenez l’erreur Unable to open I2C device: No such file or directory, vous devez vous référer à Configuration I²C pour activer I2C et vérifier si le câblage est correct.

  • Si le code et le câblage sont corrects mais que le LCD n’affiche toujours pas de contenu, ajustez le potentiomètre à l’arrière pour augmenter le contraste.

Code

#include <stdio.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#include <string.h>

int LCDAddr = 0x27;
int BLEN = 1;
int fd;

void write_word(int data){
    int temp = data;
    if ( BLEN == 1 )
        temp |= 0x08;
    else
        temp &= 0xF7;
    wiringPiI2CWrite(fd, temp);
}

void send_command(int comm){
    int buf;
    // Envoie des bits 7 à 4 en premier
    buf = comm & 0xF0;
    buf |= 0x04;                    // RS = 0, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Désactive EN (EN = 0)
    write_word(buf);

    // Envoie des bits 3 à 0 en second
    buf = (comm & 0x0F) << 4;
    buf |= 0x04;                    // RS = 0, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Désactive EN (EN = 0)
    write_word(buf);
}

void send_data(int data){
    int buf;
    // Envoie des bits 7 à 4 en premier
    buf = data & 0xF0;
    buf |= 0x05;                    // RS = 1, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Désactive EN (EN = 0)
    write_word(buf);

    // Envoie des bits 3 à 0 en second
    buf = (data & 0x0F) << 4;
    buf |= 0x05;                    // RS = 1, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Désactive EN (EN = 0)
    write_word(buf);
}

void init(){
    send_command(0x33);     // Initialisation en mode 8 lignes
    delay(5);
    send_command(0x32);     // Passage en mode 4 lignes
    delay(5);
    send_command(0x28);     // 2 lignes et caractères 5*7
    delay(5);
    send_command(0x0C);     // Activation de l'affichage sans curseur
    delay(5);
    send_command(0x01);     // Effacement de l'écran
    wiringPiI2CWrite(fd, 0x08);
}

void clear(){
    send_command(0x01);     // Effacement de l'écran
}

void write(int x, int y, char data[]){
    int addr, i;
    int tmp;
    if (x < 0)  x = 0;
    if (x > 15) x = 15;
    if (y < 0)  y = 0;
    if (y > 1)  y = 1;

    // Déplace le curseur
    addr = 0x80 + 0x40 * y + x;
    send_command(addr);

    tmp = strlen(data);
    for (i = 0; i < tmp; i++){
        send_data(data[i]);
    }
}


void main(){
    fd = wiringPiI2CSetup(LCDAddr);
    init();
    write(0, 0, "Greetings!");
    write(1, 1, "From SunFounder");
}

Explication du Code

void write_word(int data){……}
void send_command(int comm){……}
void send_data(int data){……}
void init(){……}
void clear(){……}
void write(int x, int y, char data[]){……}

Ces fonctions sont utilisées pour contrôler le code source ouvert du LCD1602 I2C, ce qui nous permet de l’utiliser facilement. Parmi ces fonctions, init() est utilisée pour l’initialisation, clear() pour effacer l’écran, write() pour écrire les informations à afficher, et les autres fonctions servent de support à ces principales.

fd = wiringPiI2CSetup(LCDAddr);

Cette fonction initialise le système I2C avec le symbole de l’appareil spécifié. Le prototype de la fonction :

int wiringPiI2CSetup(int devId);

Le paramètre devId est l’adresse du périphérique I2C, il peut être trouvé via la commande i2cdetect (voir annexe) et l’adresse de l’I2C LCD1602 est généralement 0x27.

void write(int x, int y, char data[]){}

Dans cette fonction, data[] est le texte à imprimer sur le LCD, et les paramètres x et y déterminent la position d’impression (la ligne y+1, la colonne x+1 correspond au point de départ du texte à afficher).