🛠 Lire un capteur I2C (BME680)
Objetivos
Activar el bus I2C por hardware del Raspberry Pi 3 Model B, detectar un sensor ambiental BME680 (temperatura, humedad, presión) y leer una medición en bruto en Python con smbus2. Comprender el papel de las direcciones I2C (fijadas por el chip: 0x76 o 0x77 según el pin SDO), del bus i2c-1 y de las resistencias de pull-up.
Material
- Raspberry Pi 3 Model B con Raspberry Pi OS Lite
- Sensor BME680 en módulo breakout (o BME280, direcciones idénticas 0x76/0x77)
- Cableado: SDA → pin físico 3, SCL → pin físico 5, VCC → 3,3 V (pin 1), GND → pin 9
- Paquetes:
i2c-tools,python3-smbus(opip install smbus2)
Código completo
# 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
Verificación esperada
i2cdetect -y 1 muestra una celda 76 o 77 (el resto en --). El script de Python muestra un valor ADC en bruto coherente (aumenta cuando se calienta el sensor con el dedo). Con i2cdump -y 1 0x77, los registros de calibración (0x88–0xA1) no están todos en 0x00 — prueba de que el chip responde. Para obtener valores físicos listos para usar, utilizar después la biblioteca bme680 o adafruit-circuitpython-bme680.
Errores frecuentes
- I2C no activado:
i2cdetectdevuelve «Could not open bus»; activar mediante raspi-config odtparam=i2c_arm=onen config.txt y luego reiniciar. - Bus incorrecto: el conector del Pi 3B corresponde a i2c-1 (
-y 1), no a i2c-0 (cámara). - Invertir SDA/SCL: no responde nada; permutar los dos cables.
- Alimentar el módulo con 5 V en VCC y luego leer 0x00: la lógica I2C es de 3,3 V, alimentar el breakout con 3,3 V.
Address in useo sensor ausente en el escaneo: dirección SDO diferente (0x76 vs 0x77) — probar ambas.- Cable I2C demasiado largo o breadboard sucio: bus aleatorio; los módulos breakout ya integran las resistencias de pull-up.
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