.. note::

    Bonjour et bienvenue dans la communauté des passionnés de Raspberry Pi & Arduino & ESP32 de SunFounder sur Facebook ! Plongez dans l'univers de Raspberry Pi, Arduino et 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 avec l'aide de notre communauté et de notre équipe.
    - **Apprendre et partager** : Échangez des astuces et des tutoriels pour améliorer vos compétences.
    - **Aperçus exclusifs** : Profitez d'un accès anticipé aux nouvelles annonces de produits et aux avant-premières.
    - **Réductions spéciales** : Bénéficiez de réductions exclusives sur nos derniers produits.
    - **Promotions festives et concours** : Participez à des concours et des promotions spéciales lors des fêtes.

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

1.1.7 I2C LCD1602
======================

Introduction
------------------

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

Composants
-------------------

.. image:: img/list_i2c_lcd.png

Principe
-----------

**I2C LCD1602**

.. image:: img/i2c_lcd1602.png
    :width: 800

* **GND**: Masse
* **VCC**: Alimentation en tension, 5V.
* **SDA**: Ligne de données série. Connectez-la à VCC via une résistance pull-up.
* **SCL**: Ligne d'horloge série. Connectez-la à VCC via une résistance pull-up.

Comme vous le savez, bien que les écrans LCD et d'autres affichages améliorent grandement l'interaction homme-machine, ils partagent une faiblesse commune. Lorsqu'ils sont connectés à un contrôleur, plusieurs E/S sont occupées, ce qui réduit le nombre de ports disponibles pour d'autres fonctions.

Pour remédier à ce problème, le LCD1602 avec un module I2C a été développé. Le module I2C intègre une puce PCF8574 qui convertit les données série I2C en données parallèles pour l'affichage LCD.

* `PCF8574 Datasheet <https://www.ti.com/lit/ds/symlink/pcf8574.pdf?ts=1627006546204&ref_url=https%253A%252F%252Fwww.google.com%252F>`_

**Adresse I2C**

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

Prenons l'exemple de l'adresse par défaut 0x27. L'adresse du périphérique peut être modifiée en court-circuitant les broches A0/A1/A2 ; à l'état par défaut, A0/A1/A2 est à 1, et si le cavalier est enlevé, A0/A1/A2 est à 0.

.. image:: img/i2c_address.jpg
    :width: 600

**Rétroéclairage/Contraste**

Le rétroéclairage peut être activé via un cavalier, et en enlevant le cavalier, le rétroéclairage est désactivé. Le potentiomètre bleu à l'arrière est utilisé pour ajuster le contraste (la différence de luminosité entre le blanc le plus clair et le noir le plus sombre).

.. image:: img/back_lcd1602.jpg

* **Cavalier de court-circuit** : Le rétroéclairage peut être activé par ce cavalier, retirez-le pour le désactiver.
* **Potentiomètre** : Utilisé pour ajuster le contraste (la clarté du texte affiché), augmentez-le en tournant dans le sens des aiguilles d'une montre et diminuez-le dans le sens inverse.

Schéma
---------------------

============ ========
T-Board Name physical
SDA1         Pin 3
SCL1         Pin 5
============ ========

.. image:: img/schematic_i2c_lcd.png


Procédures expérimentales
------------------------------

**Étape 1 :** Montez le circuit.

.. image:: img/image96.png
    :width: 800

**Étape 2** : Configurez l'I2C (voir :ref:`I2C Configuration`. Si vous avez déjà configuré l'I2C, passez cette étape.)

Pour les utilisateurs du langage C
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**Étape 3 :** Changez de répertoire.

.. raw:: html

   <run></run>

.. code-block::

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

**Étape 4 :** Compilez.

.. raw:: html

   <run></run>

.. code-block::

    gcc 1.1.7_Lcd1602.c -lwiringPi

**Étape 5 :** Exécutez.

.. raw:: html

   <run></run>

.. code-block::

    sudo ./a.out

Après l'exécution du code, vous verrez "Greetings", "From SunFounder" affiché sur le LCD.

.. note::

    * Si une erreur du type ``wiringPi.h: No such file or directory`` apparaît, veuillez vous référer à :ref:`install_wiringpi`.
    * Si vous obtenez l'erreur ``Unable to open I2C device: No such file or directory``, vous devez vous référer à :ref:`i2c_config` pour activer l'I2C et vérifier si le câblage est correct.
    * Si le code et le câblage sont corrects, mais que l'écran LCD ne s'affiche toujours pas, vous pouvez ajuster le potentiomètre à l'arrière pour augmenter le contraste.


**Code**

.. code-block:: c

    #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;
        // Envoyer d'abord les bits 7-4
        buf = comm & 0xF0;
        buf |= 0x04;            // RS = 0, RW = 0, EN = 1
        write_word(buf);
        delay(2);
        buf &= 0xFB;            // Mettre EN = 0
        write_word(buf);

        // Envoyer ensuite les bits 3-0
        buf = (comm & 0x0F) << 4;
        buf |= 0x04;            // RS = 0, RW = 0, EN = 1
        write_word(buf);
        delay(2);
        buf &= 0xFB;            // Mettre EN = 0
        write_word(buf);
    }

    void send_data(int data){
        int buf;
        // Envoyer d'abord les bits 7-4
        buf = data & 0xF0;
        buf |= 0x05;            // RS = 1, RW = 0, EN = 1
        write_word(buf);
        delay(2);
        buf &= 0xFB;            // Mettre EN = 0
        write_word(buf);

        // Envoyer ensuite les bits 3-0
        buf = (data & 0x0F) << 4;
        buf |= 0x05;            // RS = 1, RW = 0, EN = 1
        write_word(buf);
        delay(2);
        buf &= 0xFB;            // Mettre EN = 0
        write_word(buf);
    }

    void init(){
        send_command(0x33);    // Doit initialiser en mode 8 bits en premier
        delay(5);
        send_command(0x32);    // Puis passer en mode 4 bits
        delay(5);
        send_command(0x28);    // 2 lignes et caractères de 5*7 points
        delay(5);
        send_command(0x0C);    // Activer l'affichage sans curseur
        delay(5);
        send_command(0x01);    // Effacer l'écran
        wiringPiI2CWrite(fd, 0x08);
    }

    void clear(){
        send_command(0x01);    // Effacer 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éplacer 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**

.. code-block::

    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 de l'I2C LCD1602. Elles nous permettent d'utiliser facilement l'I2C LCD1602.
Parmi ces fonctions, `init()` est utilisée pour l'initialisation, `clear()` pour effacer l'écran, `write()` pour écrire ce qui est affiché, et les autres fonctions soutiennent ces opérations.

.. code-block:: c

    fd = wiringPiI2CSetup(LCDAddr);

Cette fonction initialise le système I2C avec le périphérique spécifié. Le prototype de la fonction :

.. code-block:: c

    int wiringPiI2CSetup(int devId);

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

.. code-block:: c

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

Dans cette fonction, `data[]` est le texte à imprimer sur l'écran LCD, et les paramètres `x` et `y` déterminent la position d'impression (ligne `y+1`, colonne `x+1` comme position de départ du texte à imprimer).

Pour les utilisateurs de Python
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**Étape 3:** Changer de répertoire.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/davinci-kit-for-raspberry-pi/python/

**Étape 4:** Exécuter.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 1.1.7_Lcd1602.py

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

.. note::

    * Si vous obtenez l'erreur ``FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1'``, vous devez consulter :ref:`i2c_config` pour activer l'I2C.
    * Si vous obtenez l'erreur ``ModuleNotFoundError: No module named 'smbus2'``, exécutez la commande ``sudo pip3 install smbus2``.
    * Si l'erreur ``OSError: [Errno 121] Remote I/O`` apparaît, cela signifie que le module est mal câblé ou endommagé.
    * Si le câblage et le code sont corrects mais que l'écran LCD n'affiche toujours rien, essayez d'ajuster le potentiomètre à l'arrière pour augmenter le contraste.

**Code**

.. note::

    Vous pouvez **Modifier/Réinitialiser/Copier/Exécuter/Arrêter** le code ci-dessous. Mais avant cela, vous devez aller dans le répertoire du code source tel que ``davinci-kit-for-raspberry-pi/python``. 
    
.. raw:: html

    <run></run>

.. code-block:: python

    import LCD1602
    import time

    def setup():
        LCD1602.init(0x27, 1)  # init(adresse du périphérique, lumière de fond)
        LCD1602.write(0, 0, 'Greetings!!')
        LCD1602.write(1, 1, 'from SunFounder')
        time.sleep(2)

    def destroy():
        LCD1602.clear()

    if __name__ == "__main__":
        try:
            setup()
        except KeyboardInterrupt:
            destroy()

**Explication du Code**

.. code-block:: python

    import LCD1602

Ce fichier est un fichier open source pour contrôler l'I2C LCD1602. Il permet d'utiliser facilement l'I2C LCD1602.

.. code-block:: python

    LCD1602.init(0x27, 1)

Cette fonction initialise le système I2C avec le périphérique désigné. Le premier paramètre est l'adresse du périphérique I2C, détectable par la commande `i2cdetect` (voir l'annexe pour les détails). L'adresse de l'I2C LCD1602 est généralement 0x27.

.. code-block:: python

    LCD1602.write(0, 0, 'Greetings!!')

Dans cette fonction, le texte `'Greetings!!'` est imprimé sur la ligne `0+1`, colonne `0+1` de l'écran LCD.
Vous verrez maintenant « Greetings! From SunFounder » affiché sur l'écran LCD.

Image du Résultat
------------------------

.. image:: img/image97.jpeg
