Où sommes nous ?

Retour

Ecran LCD 16x02 par I2C

Dans des projets comme ma domotique, afficher des informations sur un écran peut être quelque chose d'indispensable. J'y ai déjà ajouté un écran OLED I2C qui a l'avantage d'être graphique, mais sa technologie fait qu'il se "brûle" lorsqu'il est allumé longtemps.

Autre solution très pratique, les écrans LCD dit 16x02 pour 16 caractères sur 2 lignes. Si c'est le modèle le plus répandu, il y a beaucoup de variantes allant jusqu'au 20x4. Le tout pour quelques €uro, pourquoi s'en passer ?

Un peu de technique

La majorité des écrans sont basés sur le contrôleur HD44780 qui peut stocker jusqu'à 80 caractères. Maintenant, on sait pourquoi ces écrans se limitent à 20x4 !

Le HD44780 se contrôle par un bus de data de 8 bits :

Beaucoup, beaucoup trop de pins utilisés, juste pour afficher quelques informations. C'est pourquoi, généralement, on le connectera par I2C en lui adjoignant un multiplexeur PCF8574.

Alimentation

Certains vendeurs indiquent que ces circuits sont compatibles à la fois 3,3 et 5 volts. C'est moyennement vrai, car en 3,3 volts, l'écran sera illisible par manque de contraste : il faut donc passer le bus en 5 volts par l'intermédiaire d'un convertisseur de niveau.

Présence sur le bus I2C

On utilise le classique i2cdetect

$ i2cdetect -y 2
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- 18 -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --                         

Le PCF8574 apparait en tant que 0x27. Suivant le contrôleur du LCD, il peut être possible (ou pas) de la changer, mais il faut généralement jouer du fer à souder.

Diminuer la luminosité

L'écran est généralement très (trop) lumineux : le contrôleur I2C possède un petit cavalier qui active ou non le rétro-éclairage. Il suffit de le remplacer par une résistance (ou mieux, un potentiomètre) pour pouvoir le régler.

Programmation

La majorité du code qu'on retrouvera sur le web est en Python pour Raspberry, mais le type du SBC n'a strictement aucune importance tant que le bus I2C y est accessible. Côté programmation, j'ai choisi évidemment Lua s'appuyant sur Séléné (version 8 ou plus requise).

Chargement du module

Selene.Use("SelLCD")
Selene.LetsGo() -- ensure late building dependencies

Initialisation

local lcd = SelLCD.Init(2, 0x27, true, false)

Comme nous l'avons vu précédemment, l'écran apparait à l'adresse 0x27 sur le second bus I2C.

Les codes sur lesquels je me suis basé utilisent des timings vraiment très larges rendant l'affichage d'une chaîne très lente. J'ai donc rajouté SetTiming() à Séléné.
 SelLCD.SetTiming(500, 0)
Les 2 valeurs sont en microsecondes :

Notre code

Le classique "hello world"

lcd:Clear()  -- On efface l'écran
lcd:WriteString("Coucou")
lcd:Backlight(true) -- l'écran s'allume
lcd:DisplayCtl(true, true, true) -- Le processeur tourne et le curseur clignote
io.stdin:read'*l'       -- On attend que l'utilisateur appuis sur Enter

Code de fermeture

On est propre, on fait le ménage avant de partir

lcd:Backlight(false) -- L'écran s'éteind
lcd:Shutdown() -- et s'arrete

Redéfinition des caractères

Le HD44780 permet de redéfinir 8 caractères, ce qui se fait par le code suivant :

lcd:SetChar(0, {  -- on redéfinit le caractère numéro 0
    "01010",
    "10101",
    "01010",
    "10101",
    "01010",
    "10101",
    "01010",
    "10101"
})

Ou chaque 1 indique un pixel allumé, 0 lorsqu'il doit être éteint. Mais pour que ce soit plus lisible, on peut le coder par des caractères : tout ce qui n'est pas espace correspond à un pixel allumé.

lcd:SetChar(1, {
    " x x ",
    "xxxxx",
    "x x x",
    "xxxxx",
    " xxx ",
    "x   x",
    "x   x",
    " x x "
})

Ils sont accessibles en tant que caractères 0x00 à 0x07 ... sauf que le caractère 0 n'est pas idéal car ayant une signification spéciale en C empêchant de l'intégrer dans une chaîne. Mais, heureusement, aussi en tant que 0x08 à 0x0f.

A noter

Il est important de noter :


Visitez :
La liste de nos voyages
Nos sorties Ski et rando
Copyright Laurent Faillie 2001-2024
N'oubliez pas d'entrer le mot de passe pour voir aussi les photos perso.
Contactez moi si vous souhaitez réutiliser ces photos et pour les obtenir avec une plus grande résolution.
Visites durant les 7 derniers jours Nombre de visites au total.

Vous pouvez laissez un commentaire sur cette page.