Raspberry - LCD 1602 - I2C

logo-i2c


Le bus I2C permet aux périphériques ou aux composants équipés de l'interface I2C de communiquer entre eux avec 4 fils

  • Signal de donnée : SDA
  • Signal d’horloge : SCL
  • Signal  d'alimentation : +Vcc
  • Signal de masse : Gnd

  • Le Raspberry possède un bus I2C Maitre
  • L'afficheur LCD 1602 I2C possède un bus I2C Esclave


 Ne pas confondre le bus i2c avec le bus 1-wire 



Valider le bus I2C du Raspberry

  • i2c-enable-tty
  • i2c-enable-gui

 L'afficheur LCD1602 I2C utilise le bus I2C 

Pour utiliser le bus I2C du Raspberry, il faut l'activer

En mode console
  • sudo raspi-config
  • 5 - Interfacing Options
  • P5 - I2C
  • OK

En mode GUI
  • Préférences / Configuration du Raspberry Pi
  • Onglet "Interfaces"
  • Activer I2C



Présentation de l'interface I2C du LCD 1602

lcd-i2c-reglage


L'interface I2C du LCD 1602 possède d'un coté 4 broches

  • Gnd - La masse
  • Vcc - Le +5v
  • SDA - Le bit de donnée SDA
  • SCL - Le bit d'horloge SCL

et de l'autre coté 2 broches qui correspondent au rétro-éclairage

Sur le dessus de la carte I2C,  vous trouverez
  • 1 potentiometre pour le réglage du constraste
  • 3 cavaliers à souder A0, A1 et A2 pour l'adresse de l'interface I2C 

 De base les LCD 1602 - I2C sont configurés en 0x3f ou 0x27 suivant le type du composant (Voir tableau ci-dessous) 



Adresse de l'interface I2C

lcd-i2c-adresse



L'interface I2C est un composant électronique du type PCF8574AT ou PCF8574T qui possède son adresse.

Vous pouvez modifier l'adresse suivant vos besoins, en soudant un cavalier aux emplacements A0, A1 et A2 suivant le tableau ci-contre



PCF8574ATPCF8574TCavaliersCavaliersCavaliers
Adresse I2CAdresse  I2CA0A1A2
0x3f0x27
0x3e0x26cavalier
0x3d0x25cavalier
0x3c0x24cavaliercavalier
0x3b0x23cavalier
0x3a0x22cavaliercavalier
0x390x21cavaliercavalier
0x380x20cavaliercavaliercavalier

Connexion du LCD 1602 - I2C au Raspberry


Relier l'afficheur LCD 1602 - I2C au Raspberry

Lcd 1602 I2C  au  Raspberry

  • Vcc  à la broche 2   # +5v
  • Gnd à la broche 6   # Masse
  • SDA à la broche 3   # Bus Données
  • SCL à la broche 5   # Bus Horloge



Installation de la librairie Lcddriver

i2c-demo


Nous installons la librairie lcddriver et tout le nécessaire pour le bon fonctionnement du LCD 1602 I2C

Dans un terminal saisir les commandes ci-dessous


  • git clone https://github.com/the-raspberry-pi-guy/lcd    # Copie de lcddriver
  • ls                              # Visualiser ce qui à était installer
  • cd lcd                       # Se déplacer dans le dossier lcd
  • sudo sh install.sh    # Exécuter le fichier install.sh

 
le Raspberry reboote automatiquement à la fin de l’installation


Vous trouverez des codes de démonstration dans le dossier /lcd

  • cd lcd    # Se déplacer dans le dossier lcd


Exécuter des codes de  demonstration


  • python demo_lcd.py             # Exécuter les fichiers de demonstration
  • python demo_clock.py
  • python demo_scrolling_text.py


Si vous souhaitez voir le contenu des fichiers, vous ouvrez les fichiers avec un éditeur

En mode GUI, vous pouvez utiliser Geany

En mode console, vous pouvez utiliser nano



Erreur d'adresse I2C

adresse-0x27


Si vous avez une erreur d'adresse I2C   " ERROR LCD I2C ADDRESS INVALID "   lors de l'exécution des fichiers.

Vous devez vérifier l'adresse de la carte I2C. (Voir tableau ci-dessus)


Et corriger le fichier lcddriver.py en fonction de l'adresse du LCD

  • nano lcddriver.py


Rechercher ADDRESS = 0x27 ou ADDRESS = 0x3f

Et remplacer l'adresse par celle de la carte I2C

Sauvegarder la modification [Ctrl]+[o] et [Enter]

Quitter l'éditeur [Ctrl]+[x]




Détection du bus i2C et de l'adresse du lCD1602

  • lc-i2c
  • i2cdetect-l
  • ic2detect-y-1


Une fois installé, vous pouvez vérifier si le bus I2C du Raspberry a bien détecté le LCD1602

Dans un terminal [ctrl]+[alt]+[t], saisir les commandes ci-dessous

Voir le device i2c 

  • ls /dev/i2c*  # Voir le bus i2c
    • /dev/i2c-1   # le -1 indique le n° du bus
Voir les informations du bus i2c 
  • i2cdetect -l  # Détection du bus i2c (-l c'est un L minuscule)
    • i2c-1  # le -1 indique le n° du bus
Voir l'adresse du lcd
  • i2cdetect -y 1  # Détection du LCD (1 c'est le chiffre 1)
    • 27  # Correspond à l'adresse du LCD 0x27



Explication du code demo_lcd.py

  • demo-lcd-code
  • demo-lcd-1
  • demo-lcd-2


Le code


# Importation librairie
import lcddriver
import time


# Chargement du driver lcddriver
display = lcddriver.lcd()

try:
    while True:
        print("Writing to display")               # Affichage d'un texte d'information dans le terminal
        display.lcd_display_string("Greetings Human!", 1) # Affichage texte sur la 1ere ligne
        display.lcd_display_string("Demo Pi Guy code", 2# Affichage texte sur la 2eme ligne
        time.sleep(2)                                     # Temporisation
        display.lcd_display_string("I am a display!", 1)  # Affichage d'un texte different sur la 1ere ligne
        time.sleep(2)                                     # Temporisation
        display.lcd_clear()                            # Effacement lcd
        time.sleep(2)                                     # Temporisation


except KeyboardInterrupt: # Affichage d'un texte dans le terminal et effacement du lcd
    print("Cleaning up!")
    display.lcd_clear()




Afficher la date sur le Lcd1602 I2c

  • i2c-date-heure-cod
  • i2c-date-heure


Nous allons modifier le code demo_lcd.py pour afficher la date et l'heure.

Nous le nommerons demo_date.py 


Mettre le fichier .py dans le dossier /lcd ou indiquer le chemin de lcddriver

Sinon la commande import lcddriver ne trouvera pas le lcddriver

et générera une erreur


Le code


# Import necessary libraries for communication and display use
import lcddriver
import time


# Load the driver and set it to "display"
display = lcddriver.lcd()


# Main body of code
try:
    while True:
        print("Affichage date/heure sur le lcd i2c")  # Affichage texte d'information dans le terminal
        display.lcd_display_string("Date: %s" %time.strftime("%d/%m/%Y"), 1)   # Affichage de la date sur la 1ere ligne
        display.lcd_display_string("Heure: %s" %time.strftime("%H:%M:%S"), 2)  # Affichage de l'heure sur la 2eme ligne


except KeyboardInterrupt:   # Press ctrl+c pour stopper le programme et effacer le lcd
    print()    
    print("-----------------------------------")
    print("  ARRET DU PROGRAMME PAR CTRL + C")
    print("-----------------------------------")
    display.lcd_clear()




Afficher la température DS18B20 sur LCD1602 I2c

  • lcd-i2c-temp-code
  • lcd-i2c-temp
  • lcd-i2c-temp-arret


Nous ajoutons à notre montage une sonde de température DS18B20

Et nous affichons la date/heure et la température

Nous utiliserons le code demo_date.py en y ajoutant le code pour la detection et l'affichage de la température. Nous le nommerons demo_temp.py


Mettre le fichier .py dans le dossier /lcd ou indiquer le chemin de lcddriver

Sinon la commande import lcddriver ne trouvera pas le lcddriver

et générera une erreur


 La sonde de température DS18B20 utilise le bus 1-Wire 

(Voir Raspberry - Sonde DS18B20 - Température pour installer la sonde DS18B20)

Connexion sonde DS18B20 sur Raspberry

  • +Vcc sur le +5v pin 4  # ou +3.3v pin 1
  • Gnd sur le Gnd pin 9
  • Data sur Gpio4 pin 7


Le code


#coding:utf-8
# Import necessary libraries for communication and display use

import lcddriver
import time


# Load the driver and set it to "display"
display = lcddriver.lcd()


# Lecture température DS18B20
def lireFichier(emplacement):
    fichTemp = open(emplacement)
    contenu = fichTemp.read()
    fichTemp.close()
    return contenu
    
# Recuperation temperature DS18B20
def recupTemp(contenuFich):
    secondeLigne = contenuFich.split("\n")[1]
    temperatureData = secondeLigne.split(" ")[9]
    temperature = float(temperatureData[2:5])
    temperature = temperature / 10
    return temperature


# Main body of code
try:
    while True:

        print("Affichage date et temperature sur lcd i2c")  # Affichage texte d'information dans le terminal
        # Mettre le 28-xxxxxxxxx de votre sonde
        contenuFich = lireFichier("/sys/bus/w1/devices/28-xxxxxxxxxx/w1_slave")  # contenuFich la temperature
        temperature = recupTemp(contenuFich)
        # Affichage date/heure sur la 1ere ligne
        display.lcd_display_string("%s" %time.strftime("%d/%m/%y  %H:%M"), 1)
        # Affichage de la température sur la 2eme ligne
        display.lcd_display_string("Temp: " + str(temperature) + " C", 2)


except KeyboardInterrupt: # Press ctrl+c pour stopper le programme et effacer le lcd
    print()    
    print("-----------------------------------")
    print("  ARRET DU PROGRAMME PAR CTRL + C")
    print("-----------------------------------")
    display.lcd_clear()




Définir le chemin dans python

Définir le chemin dans un code python

Au début du code, ajouter les lignes ci-dessous

import sys

sys.append.path.("/chemin")