🛠 Lire un capteur I2C (BME680)
Objectifs
Activer le bus I2C matériel du Raspberry Pi 3 Model B, détecter un capteur environnement BME680 (température, humidité, pression) et lire une mesure brute en Python avec smbus2. Comprendre le rôle des adresses I2C (fixées par la puce : 0x76 ou 0x77 selon la broche SDO), du bus i2c-1 et des résistances de pull-up.
Matériel
- Raspberry Pi 3 Model B sous Raspberry Pi OS Lite
- Capteur BME680 sur module breakout (ou BME280, adresses identiques 0x76/0x77)
- Câblage : SDA → broche physique 3, SCL → broche physique 5, VCC → 3,3 V (broche 1), GND → broche 9
- Paquets :
i2c-tools,python3-smbus(oupip install smbus2)
Code complet
# 1) Activer I2C (ou via raspi-config : Interface Options > I2C)
sudo raspi-config nonint do_i2c 0
sudo reboot
# 2) Détecter le capteur sur le bus i2c-1
sudo apt install -y i2c-tools
i2cdetect -y 1 # doit afficher 76 ou 77
#!/usr/bin/env python3
"""bme680_brut.py — lecture brute de température sur BME680 (i2c-1).
Séquence minimale en mode forced ; conversion complète : datasheet Bosch."""
import smbus2, time
BUS, ADDR = 1, 0x77 # vérifier avec i2cdetect -y 1
b = smbus2.SMBus(BUS)
b.write_byte_data(ADDR, 0xE8, 0x2C) # ctrl_hum : suréchantillonnage x1
b.write_byte_data(ADDR, 0xF4, 0x24) # config : t_sb=1000 ms, filtre off
b.write_byte_data(ADDR, 0xF2, 0x01) # ctrl_meas : temp x1, pression off
time.sleep(1.0)
msb, lsb, xlsb = b.read_i2c_block_data(ADDR, 0xFA, 3)
adc_t = (msb << 12) | (lsb << 4) | (xlsb >> 4) # ADC 20 bits
print(f"ADC brut température : {adc_t}") # convertir via datasheet
Vérification attendue
i2cdetect -y 1 affiche une case 76 ou 77 (le reste en --). Le script Python affiche une valeur ADC brute cohérente (elle augmente quand on réchauffe le capteur du doigt). Avec i2cdump -y 1 0x77, les registres de calibration (0x88–0xA1) ne sont pas tous à 0x00 — preuve que la puce répond. Pour des valeurs physiques prêtes à l'emploi, utiliser ensuite la bibliothèque bme680 ou adafruit-circuitpython-bme680.
Erreurs fréquentes
- I2C non activé :
i2cdetectrenvoie « Could not open bus » ; activer via raspi-config oudtparam=i2c_arm=ondans config.txt puis redémarrer. - Mauvais bus : le connecteur du Pi 3B correspond à i2c-1 (
-y 1), pas i2c-0 (caméra). - Inverser SDA/SCL : rien ne répond ; permuter les deux fils.
- Alimenter le module en 5 V sur VCC puis lire 0x00 : la logique I2C est en 3,3 V, alimenter le breakout en 3,3 V.
Address in useou capteur absent du scan : adresse SDO différente (0x76 vs 0x77) — tester les deux.- Fil I2C trop long ou breadboard sale : bus aléatoire ; les modules breakout intègrent déjà les pull-up.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython