🛠 Lire un capteur I2C (température/humidité)
Objectifs
Activer le bus I2C du connecteur 40 broches, détecter un capteur connecté (par exemple BME280 ou BMP280, adresse 0x76 ou 0x77), lire température et humidité en Python, et comprendre le rôle des résistances de pull-up et de l'adresse 7 bits. L'I2C du connecteur utilise SDA (broche 3) et SCL (broche 5), en logique 3,3 V.
Matériel
- Carte type Raspberry Pi 3 Model B+ sous Raspberry Pi OS
- 1 capteur I2C (BME280/BMP280/SHT31 — adaptez l'adresse)
- 4 fils Dupont : 3,3 V (broche 1), GND (broche 6), SDA (broche 3), SCL (broche 5)
sudo apt install -y i2c-tools python3-smbus
Code complet
# 1. Activer I2C : sudo raspi-config -> Interface Options -> I2C (ou config.txt)
echo 'dtparam=i2c_arm=on' | sudo tee -a /boot/firmware/config.txt
sudo reboot
# 2. Scanner le bus : le capteur doit répondre, p. ex. 0x76
sudo i2cdetect -y 1
#!/usr/bin/env python3
"""Lecture BMP280 en brut via smbus (adresse 0x76)."""
import smbus, time
BUS = smbus.SMBus(1)
ADDR = 0x76 # 0x77 si la broche SDO est au 3.3 V — voir i2cdetect
# Séquence simplifiée d'initialisation BMP280 (regs de configuration)
BUS.write_byte_data(ADDR, 0xF4, 0x27) # oversampling x16/x1, mode forcé
BUS.write_byte_data(ADDR, 0xF5, 0x00) # config, filtre off
time.sleep(0.05)
def lire_registre2(reg):
hi, lo = BUS.read_i2c_block_data(ADDR, reg, 3)[1:3]
return (hi << 8) | lo
while True:
adc_t = lire_registre2(0xFA) # température brute (MSB, LSB, XLSB)
t_c = (adc_t / 16.0) / 100.0 # conversion indicative, non calibrée
print(f"Temperature brute: {adc_t} (~{t_c:.1f} C) Ctrl-C pour sortir")
time.sleep(2)
Vérification attendue
i2cdetect -y 1 affiche une grille avec l'adresse du capteur (plutôt 0x76/0x77). Le script affiche une valeur qui bouge quand on réchauffe le capteur du doigt. En cas de -- -- partout : câblage SDA/SCL inversés ou I2C non activé.
Erreurs fréquentes
- I2C non activé :
/dev/i2c-1absent,i2cdetectse plaint — activer le overlay et redémarrer. - SDA/SCL inversés : rien ne répond au scan ; permuter les deux fils.
- Alimenter en 5 V un capteur 3,3 V sans régulateur : risque de destruction ; le bus I2C est en 3,3 V.
- Mauvaise adresse : SDO sur GND donne 0x76, sur 3,3 V donne 0x77 — lire
i2cdetectplutôt que deviner. - Bus sans pull-up : les modules breakout en embarquent ; sur un capteur nu, ajouter 4,7 kΩ vers 3,3 V sur SDA et SCL.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython