🛠 Lire un capteur I2C (BME280 température/humidité)
Objectifs
Activer le bus I2C du Raspberry Pi 5, détecter un capteur d'ambiance BME280 (température, humidité, pression) et lire ses mesures en Python. Sur le Pi 5, l'I2C est apporté par la puce RP1 ; le bus principal I2C0 est sur GPIO2 (SDA, broche physique 3) et GPIO3 (SCL, broche physique 5).
Matériel
- Raspberry Pi 5 sous Raspberry Pi OS 64 bits
- Capteur BME280 en module I2C (adresse 0x76 ou 0x77)
- Câbles Dupont : SDA vers broche 3, SCL vers broche 5, VCC vers 3V3 (broche 1 ou 17), GND vers broche 6
- Le module possède des résistances de pull-up intégrées ; les broches sont en logique 3,3 V
Code complet
# 1) Activer I2C : sudo raspi-config -> Interface Interfacing Options -> I2C
# ou dans /boot/firmware/config.txt : dtparam=i2c_arm=on
sudo apt install -y i2c-tools python3-smbus
sudo reboot
# 2) Vérifier la présence du capteur (0x76 ou 0x77 attendu)
i2cdetect -y 1
#!/usr/bin/env python3
# lire_bme280.py — lecture brute des registres du BME280 sur I2C bus 1
import smbus, time
BUS = smbus.SMBus(1)
ADDR = 0x76 # 0x77 si les broches SD0/AD0 sont câblées autrement
def read_regs(reg, n):
return BUS.read_i2c_block_data(ADDR, reg, n)
# Calibration (une seule fois au démarrage)
dig = read_regs(0x88, 24) + read_regs(0xE0, 7)
BUS.write_byte_data(ADDR, 0xF2, 0x01) # oversampling humidité
BUS.write_byte_data(ADDR, 0xF4, 0x27) # mode normal
BUS.write_byte_data(ADDR, 0xF5, 0x00)
time.sleep(0.5)
while True:
data = read_regs(0xF7, 8) # T, P, H bruts
print("octets bruts T/P/H :", [hex(b) for b in data])
time.sleep(2)
Vérification attendue
i2cdetect -y 1 affiche une case à 76 (ou 77). Le script affiche toutes les 2 secondes les octets bruts lus sur le capteur ; avec la bibliothèque adafruit-circuitpython-bme280 on obtient directement température en °C, humidité en % et pression en hPa.
Erreurs fréquentes
- I2C non activé :
i2cdetect -lne liste aucun bus ; activer via raspi-config puis redémarrer. - Mauvais numéro de bus : sous Raspberry Pi OS le bus utilisateur est le 1 (
/dev/i2c-1), pas le 0. - Adresse 0x77 au lieu de 0x76 : lire le marquage du module ou tester les deux avec
i2cdetect. - Alimenter en 5 V un module non régulé : la plupart des modules BME280 acceptent 3,3-5 V, mais le niveau logique I2C doit rester 3,3 V.
- SDA/SCL inversés : rien ne répond ; échanger les deux fils et relancer i2cdetect.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython