I2C : Lcd
Ce que l'on va faire ici
Voici comment utiliser un afficheur I2C avec Micropython. Ici avec la carte Pi Pico
Le matériel
- Un module afficheur LCD 1602 I2C (l'afficheur utilise un HD44780 et la com' I2C est faite via un PCF8574) - conso = 1.1mA + Led - Vcc=5V (Si 3.3V fonctionne mais affichage pas terrible..)
- La carte micropython
Le montage
Sur la Pi Pico, on connecte :
-
les broches SDA/SCL du module connectées en GP16(SDA) /GP17 (SCL) qui corresponde à I2C n°0
-
Vbus (=5V alim USB) ou VSys idéalement ~5V et GND de la carte vers Vcc / GND du module.
Pré-requis
Les fichiers suivant sont à copier sur la flash :
- lcd_api.py (7ko)
- pico_i2c_lcd.py (=esp3266_i2c_lcd.py renommé) (3ko)
Le plus simple c'est à l'aide de notre utilitaire copy.sh
à partir du répertoire où se trouvent les libs.
Dispo ici : https://github.com/dhylands/python_lcd/tree/master/lcd
Le code
from machine import I2C, Pin # import class I2C
from pico_i2c_lcd import I2cLcd # import lib
# The PCF8574 has a jumper selectable address: 0x20 - 0x27
DEFAULT_I2C_ADDR = 0x27
"""Test function for verifying basic functionality."""
print("Running test_main")
i2c = I2C(0,scl=Pin(17), sda=Pin(16), freq=400000) # création de l'objet i2C
lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16) # création de l'objet LCD i2c
lcd.putstr("It Works!\nSecond Line")
#delay(3000)
#lcd.clear()
Notes
Si on ne voit rien ou pas bien, il faut modifier le contraste en tournant le potentiomètre à l'arrière jusqu'à avoir une visibilité correcte. .
La librairie en question fournit :
La classe principale I2cLcd
(qui elle-même ré-implémente la classe interne LcdApi
) fournit :
Constructeur
lcd=I2cLcd(i2c, DEFAULT_I2C_ADDR, lignes, colonnes)
où :
- i2c : l'objet I2C à utiliser
- DEFAULT_I2C_ADDR : l'adresse par défaut à utiliser
- lignes : nombre de lignes
- colonnes : nombre de colonnes
Voici par exemple la définition possible pour un LCD I2C 2x16 :
DEFAULT_I2C_ADDR = 0x27
lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16)
Fonctions
clear()
: efface l'écran et ramène origine à 0,0 - sans effet sur l'état du curseurhal_write_init_nibble()
: fonction internedisplay_off()
: éteint l'écranbacklight_on()
: allume le rétro-éclairagehide_cursor()
: masque le curseurdisplay_on()
: allume écranshow_cursor()
: montre le curseurblink_cursor_on()
: active clignotement curseurblink_cursor_off()
: désactive clignotement curseurbacklight_off()
: éteint le rétro-éclairagemove_to(colonne,ligne)
: se déplace en position voulue - La numérotation commence à 0,0 (1ère ligne, 1ère colonne)putchar()
: ajoute un caractèreputstr()
: ajoute une chaîne (supporte saut de ligne !)custom_char()
: définition d'un caractère personnaliséhal_sleep_us()
: fonction interne
Propriétés
LCD_FUNCTION_RESET
LCD_FUNCTION
LCD_FUNCTION_2LINES
hal_write_command
hal_backlight_on
hal_backlight_off
hal_write_data
LCD_CLR
LCD_HOME
LCD_ENTRY_MODE
LCD_ENTRY_INC
LCD_ENTRY_SHIFT
LCD_ON_CTRL
LCD_ON_DISPLAY
LCD_ON_CURSOR
LCD_ON_BLINK
LCD_MOVE
LCD_MOVE_DISP
LCD_MOVE_RIGHT
LCD_FUNCTION_8BIT
LCD_FUNCTION_10DOTS
LCD_CGRAM
LCD_DDRAM
LCD_RS_CMD
LCD_RS_DATA
LCD_RW_WRITE
LCD_RW_READ
Tests dans l'interpréteur
On a ici une illustration de l'intérêt majeur du mode interpréteur pour explorer une librairie avec de nombreuses fonctions : il est facile de tester une à une les fonctions, voir l'effet, essayer une autre, etc... Bref, c'est à la fois ludique et efficace pour apprendre.
Note
Le gain de temps pour la découverte d'une librairie est énorme en utilisant l'interpréteur car on peut réagir immédiatement aux effets constatés, etc. Pas besoin de recompiler, etc. Et le code testé est copiable/collable facilement.
Par exemple :
>>> from machine import I2C, Pin
>>> from pico_i2c_lcd import I2cLcd
>>> DEFAULT_I2C_ADDR = 0x27
>>> i2c = I2C(0,scl=Pin(17), sda=Pin(16), freq=400000)
>>> lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16)
>>> lcd.move_to(8,0)
>>> lcd.put # double appui sur TAB pour auto-complétion
putchar putstr
>>> lcd.putstr("Test")
>>> lcd.blink_cursor_o
blink_cursor_on blink_cursor_off
>>> lcd.blink_cursor_on()
>>> lcd.hide_cursor()
>>> lcd.clear()
>>> lcd.putchar('A')
>>> lcd.putstr("Micropython\nc'est cool !")
>>> lcd.clear()
>>> lcd.putstr("Micropython\nc'est cool !")
>>> lcd.clear() # efface et ramne origine 0,0
>>> lcd.move_to(1,1) # 2e ligne 2e colonne
>>> lcd.putchar('A')
>>> lcd.clear()
>>> lcd.show_cursor()
>>> lcd.clear()
>>> lcd.hide_cursor()
>>> import utime
>>> for i in range(10):
... lcd.move_to(0,0)
... lcd.putstr(str(i))
... utime.sleep_ms(400)
# etc... trop cool !