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 ?
Le HD44780 se contrôle par un bus de data de 8 bits :
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.
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.
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.
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).
Selene.Use("SelLCD")
Selene.LetsGo() -- ensure late building dependencies
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.
SelLCD.SetTiming(500, 0)
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
On est propre, on fait le ménage avant de partir
lcd:Backlight(false) -- L'écran s'éteind
lcd:Shutdown() -- et s'arrete
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.
Il est important de noter :
Visitez : 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 au total. |
Vous pouvez
laissez un commentaire
sur cette page.