# TP2 — Exercice 1 : DHT22 + Affichage OLED I2C
# ESP32 / MicroPython
import dht
import machine
import ssd1306
import time
# ── Initialisation des périphériques ──
capteur_dht = dht.DHT22(machine.Pin(4))
i2c = machine.SoftI2C(
scl=machine.Pin(22),
sda=machine.Pin(21),
freq=400_000
)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
led = machine.Pin(2, machine.Pin.OUT)
SEUIL_TEMP = 30.0 # Seuil d'alarme en °C
SEUIL_HUM = 70.0 # Seuil humidité en %
def lire_dht22():
"""Lit température et humidité. Retourne (None, None) si erreur."""
try:
capteur_dht.measure()
return capteur_dht.temperature(), capteur_dht.humidity()
except OSError as e:
print(f"Erreur DHT22 : {e}")
return None, None
def afficher_oled(temp, hum, alerte):
"""Affiche les données sur l'écran OLED."""
oled.fill(0)
oled.text("=== Station IoT ===", 0, 0)
oled.hline(0, 10, 128, 1)
if temp is not None:
oled.text(f"Temp : {temp:.1f} C", 0, 16)
oled.text(f"Hum : {hum:.1f} %", 0, 28)
else:
oled.text("Erreur capteur", 0, 16)
oled.hline(0, 42, 128, 1)
if alerte:
oled.text("!! ALERTE !!", 20, 50)
else:
oled.text("Etat : Normal", 0, 50)
oled.show()
# ── Boucle principale ──
print('Station météo IoT démarrée')
print('-' * 35)
while True:
temp, hum = lire_dht22()
if temp is not None:
alerte = (temp > SEUIL_TEMP) or (hum > SEUIL_HUM)
led.value(1 if alerte else 0)
print(f'Temp={temp:.1f}°C Hum={hum:.1f}% Alerte={alerte}')
afficher_oled(temp, hum, alerte)
else:
afficher_oled(None, None, False)
time.sleep(2) # DHT22 : délai min 2 s entre lectures