🛠 Lire un capteur sur le bus I2C
Objectifs
Activer le bus I2C0 du Raspberry Pi 2, scanner le bus pour trouver l'adresse d'un capteur, puis lire ses mesures depuis Python. L'I2C ne nécessite que deux fils (SDA, SCL) partagés entre plusieurs périphériques, chacun ayant une adresse — c'est la base de la majorité des capteurs du commerce.
Matériel
- Raspberry Pi 2 Model B sous Raspberry Pi OS 32 bits
- 1 capteur I2C (par exemple BME280 ou BMP280 : température/pression)
- 4 câbles jumper : 3,3 V, GND, SDA (GPIO2, broche 3), SCL (GPIO3, broche 5)
- Paquets : sudo apt install i2c-tools python3-smbus
Code complet
# 1. Activer I2C : sudo raspi-config -> Interface -> I2C, ou :
sudo sed -i 's/^#*dtparam=i2c_arm=.*/dtparam=i2c_arm=on/' /boot/config.txt
sudo reboot
# 2. Scanner le bus : le capteur doit apparaitre (ex. 0x76 ou 0x77)
i2cdetect -y 1
#!/usr/bin/env python3
"""lire_capteur.py — lecture brute d'un registre I2C."""
import smbus
import time
BUS = smbus.SMBus(1)
ADRESSE = 0x76 # adresse renvoyee par i2cdetect
REG_ID = 0xD0 # registre « chip id » (BMP/BME280)
chip_id = BUS.read_byte_data(ADRESSE, REG_ID)
print(f"Chip ID lu a 0x{ADRESSE:02X} : 0x{chip_id:02X}")
for _ in range(5):
t = BUS.read_byte_data(ADRESSE, 0xFA) # octet haut de temperature
print(f"Brut temperature (octet haut) : {t}")
time.sleep(1)
Vérification attendue
i2cdetect -y 1 affiche une grille ; l'adresse du capteur apparaît en clair (jamais 0x03 ni 0x70, réservés). Le script Python affiche un chip id non nul (0x60 pour BME280, 0x50/0x51 pour BMP280) puis cinq lectures espacées d'une seconde. Un 0x00 partout signale un câblage ou une adresse erronés.
Erreurs fréquentes
- I2C non activé : sans dtparam=i2c_arm=on et redémarrage, /dev/i2c-1 n'existe pas.
- Bus erroné : c'est le bus 1 (i2cdetect -y 1), pas le bus 0.
- Capteur alimenté en 5 V sur un module sans régulateur : la logique I2C du Pi est en 3,3 V ; la plupart des breakouts l'acceptent, d'autres non.
- Adresse 0x76 ou 0x77 : elle dépend du strap ADDR ; teste les deux si i2cdetect n'en montre qu'une.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython