from machine import I2C, Pin
import dht
from time import sleep
# Configuration de l'I2C pour l'écran LCD
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000) # SCL sur GPIO 22 et SDA sur GPIO 21
# Adresse de l'écran LCD (vérifiez avec un scanner I2C si nécessaire)
LCD_ADDR = 0x27 # Adresse typique pour l'écran LCD I2C
# Commandes pour l'initialisation de l'écran LCD
LCD_WIDTH = 16 # Nombre de caractères par ligne (16x2 pour un écran standard)
LCD_LINE_1 = 0x80 # Adresse de la première ligne
LCD_LINE_2 = 0xC0 # Adresse de la deuxième ligne
LCD_BACKLIGHT = 0x08 # Activer le rétroéclairage
# Définitions des commandes de contrôle
LCD_CMD = 0
LCD_CHR = 1
# Configuration du capteur DHT22
dht_pin = Pin(4) # GPIO 4 pour DHT22
dht_sensor = dht.DHT22(dht_pin)
def lcd_init():
lcd_byte(0x33, LCD_CMD) # Initialisation
lcd_byte(0x32, LCD_CMD) # Mode 4 bits
lcd_byte(0x06, LCD_CMD) # Déplacement du curseur vers la droite
lcd_byte(0x0C, LCD_CMD) # Écran allumé, curseur désactivé
lcd_byte(0x28, LCD_CMD) # Mode 2 lignes
lcd_byte(0x01, LCD_CMD) # Effacer l'écran
sleep(0.005)
def lcd_byte(bits, mode):
"""Envoie des commandes ou des données à l'écran."""
bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
bits_low = mode | ((bits << 4) & 0xF0) | LCD_BACKLIGHT
i2c.writeto(LCD_ADDR, bytes([bits_high]))
lcd_toggle_enable(bits_high)
i2c.writeto(LCD_ADDR, bytes([bits_low]))
lcd_toggle_enable(bits_low)
def lcd_toggle_enable(bits):
"""Active le signal d'horloge pour l'envoi de données."""
sleep(0.0005)
i2c.writeto(LCD_ADDR, bytes([bits | 0b00000100]))
sleep(0.0005)
i2c.writeto(LCD_ADDR, bytes([bits & ~0b00000100]))
sleep(0.0005)
def lcd_string(message, line):
"""Affiche un message sur la ligne spécifiée."""
# Si la chaîne est trop longue, on la tronque
if len(message) > LCD_WIDTH:
message = message[:LCD_WIDTH]
# Si la chaîne est trop courte, on ajoute des espaces à la fin
if len(message) < LCD_WIDTH:
message += ' ' * (LCD_WIDTH - len(message))
lcd_byte(line, LCD_CMD)
for char in message:
lcd_byte(ord(char), LCD_CHR)
# Initialisation de l'écran LCD
lcd_init()
# Affichage initial de "Bonjour"
lcd_string("Bonjour", LCD_LINE_1)
while True:
try:
# Lire les données du DHT22
dht_sensor.measure()
temp = dht_sensor.temperature() # Lire la température
hum = dht_sensor.humidity() # Lire l'humidité
# Afficher la température et l'humidité sur la 2ème ligne
lcd_string("T:{:.1f}C H:{:.1f}%".format(temp, hum), LCD_LINE_2)
# Attendre 2 secondes avant de rafraîchir les données
sleep(2)
except OSError as e:
# En cas d'erreur de lecture du capteur, afficher un message d'erreur
lcd_string("Erreur capteur", LCD_LINE_2)
sleep(2)