🛠 Lire un capteur I2C (BME280 température/humidité)
Objetivos
Activar el bus I2C del Raspberry Pi 5, detectar un sensor ambiental BME280 (temperatura, humedad, presión) y leer sus mediciones en Python. En el Pi 5, el I2C es proporcionado por el chip RP1; el bus principal I2C0 está en GPIO2 (SDA, pin físico 3) y GPIO3 (SCL, pin físico 5).
Material
- Raspberry Pi 5 con Raspberry Pi OS de 64 bits
- Sensor BME280 en módulo I2C (dirección 0x76 o 0x77)
- Cables Dupont: SDA al pin 3, SCL al pin 5, VCC a 3V3 (pin 1 o 17), GND al pin 6
- El módulo posee resistencias de pull-up integradas; los pines están en lógica de 3,3 V
Código completo
# 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)
Verificación esperada
i2cdetect -y 1 muestra una casilla en 76 (o 77). El script muestra cada 2 segundos los bytes crudos leídos del sensor; con la biblioteca adafruit-circuitpython-bme280 se obtienen directamente la temperatura en °C, la humedad en % y la presión en hPa.
Errores frecuentes
- I2C no activado:
i2cdetect -lno lista ningún bus; activar mediante raspi-config y luego reiniciar. - Número de bus incorrecto: en Raspberry Pi OS el bus de usuario es el 1 (
/dev/i2c-1), no el 0. - Dirección 0x77 en lugar de 0x76: leer la marca del módulo o probar ambas con
i2cdetect. - Alimentar con 5 V un módulo no regulado: la mayoría de los módulos BME280 aceptan 3,3-5 V, pero el nivel lógico I2C debe permanecer en 3,3 V.
- SDA/SCL intercambiados: no responde nada; intercambiar los dos cables y relanzar i2cdetect.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython