🛠 Lire un capteur I2C (température/humidité)
Objetivos
Activar el bus I2C del conector de 40 pines, detectar un sensor conectado (por ejemplo, BME280 o BMP280, dirección 0x76 o 0x77), leer la temperatura y la humedad en Python, y comprender la función de las resistencias de pull-up y de la dirección de 7 bits. El I2C del conector utiliza SDA (pin 3) y SCL (pin 5), con lógica de 3,3 V.
Material
- Placa tipo Raspberry Pi 3 Model B+ con Raspberry Pi OS
- 1 sensor I2C (BME280/BMP280/SHT31 — adapte la dirección)
- 4 cables Dupont: 3,3 V (pin 1), GND (pin 6), SDA (pin 3), SCL (pin 5)
sudo apt install -y i2c-tools python3-smbus
Código completo
# 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)
> NO VERIFICADO: la secuencia de registros y la conversión anteriores son indicativas para BMP280; para una lectura fiable, utilice la biblioteca del fabricante (adafruit-circuitpython-bme280), que aplica los coeficientes de calibración grabados en el sensor.
Verificación esperada
i2cdetect -y 1 muestra una cuadrícula con la dirección del sensor (normalmente 0x76/0x77). El script muestra un valor que cambia cuando se calienta el sensor con el dedo. En caso de ver -- -- en todas partes: los cables SDA/SCL están invertidos o el I2C no está activado.
Errores frecuentes
- I2C no activado:
/dev/i2c-1no existe,i2cdetectmuestra errores — active el overlay y reinicie. - SDA/SCL invertidos: nada responde al escaneo; permutar los dos cables.
- Alimentar con 5 V un sensor de 3,3 V sin regulador: riesgo de destrucción; el bus I2C funciona a 3,3 V.
- Dirección incorrecta: SDO conectado a GND da 0x76, conectado a 3,3 V da 0x77 — lea
i2cdetecten lugar de adivinar. - Bus sin pull-up: los módulos breakout los incluyen; en un sensor sin placa, añada 4,7 kΩ hacia 3,3 V en SDA y SCL.
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