🛠 Lire un capteur I2C (BMP280) depuis le bus du connecteur

Orange Pi 5 Plus (Rockchip RK3588) · intermediaire · Schéma : IMG-orangepi-5-plus-intermediaire-2-opi5p-i2c-capteur.svg — capteur BMP280 relié en I2C (SDA, SCL, 3,3 V, GND) au connecteur 40 broches de l'Orange Pi 5 Plus, valeurs température/pression affichées en terminal

Objetivos

Activar y explorar un bus I2C de la Orange Pi 5 Plus, escanear el bus con i2cdetect, y luego leer un sensor BMP280 (temperatura + presión, dirección 0x76 o 0x77) en Python con smbus2. El conector de 40 pines multiplexa I2C entre UART/SPI/CAN/PWM; internamente, el PMIC RK806-1 está en SPI y los reguladores RK8602/RK8603 ya están en I2C — el controlador conectado al conector debe verificarse en su imagen.

Material

Código completo

# 1. Lister les contrôleurs I2C puis balayer le bus du connecteur
i2cdetect -l
i2cdetect -y 1        # adapter N ; le BMP280 apparaît à 76 (ou 77)

# Lecture brute en shell :
sudo i2cget -y 1 0x76 0xd0    # doit répondre 0x58 (ID du BMP280)
#!/usr/bin/env python3
"""Lecture BMP280 sur i2c-1 (adapter le numéro de bus)."""
import smbus2, struct, time

BUS, ADDR = 1, 0x76
bus = smbus2.SMBus(BUS)
assert bus.read_byte_data(ADDR, 0xD0) == 0x58, "BMP280 introuvable"

# Calibration (registres 0x88..0xA1)
cal = bus.read_i2c_block_data(ADDR, 0x88, 24)
dig_T1, dig_T2, dig_T3 = struct.unpack("<Hhh", bytes(cal[0:6]))

bus.write_byte_data(ADDR, 0xF4, 0x27)   # mode forcé, oversampling x16/x1
bus.write_byte_data(ADDR, 0xF5, 0xA0)   # standby 1000 ms, filtre x16
time.sleep(0.1)
raw = bus.read_i2c_block_data(ADDR, 0xF7, 6)
adc_p, adc_t = struct.unpack(">HH", bytes(raw[0:4]))

# Compensation température simplifiée du datasheet
var1 = (adc_t / 16384.0 - dig_T1 / 1024.0) * dig_T2
var2 = ((adc_t / 131072.0 - dig_T1 / 8192.0) ** 2) * dig_T3
t_fine = var1 + var2
temp = (t_fine * 5.12) / 100.0
print(f"Température : {temp:.1f} °C (ADC pression brut : {adc_p})")

Verificación esperada

i2cdetect -y N muestra « 76 » en la cuadrícula; i2cget ... 0xd0 devuelve 0x58; el script de Python imprime una temperatura coherente con la habitación (15 a 30 °C). Para la presión, prefiera la biblioteca Adafruit_BMP280 (pip) que implementa la compensación completa.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales