🛠 Lire un capteur I2C (BME280) sur le bus
Objetivos
Implementar I2C en la Orange Pi PC: activar el bus, escanear las direcciones con i2cdetect y luego leer un sensor de temperatura/presión/humedad BME280 en Python. También descubrirá que la placa ya posee un dispositivo I2C interno: el regulador de voltaje de la CPU SY8106A, en el bus R_I2C (bus secundario) en la dirección 0x65 — prueba de que la pila I2C funciona incluso sin conectar nada.
Material
- Orange Pi PC con Armbian, fuente de alimentación de 5 V / 2 A (conector DC)
- Sensor BME280 (se recomienda un módulo con regulador de 3.3 V)
- Cables Dupont: VCC→3.3 V, GND→GND, SDA→pin SDA, SCL→pin SCL
- sudo apt install i2c-tools python3-smbus
Código completo
- Activar I2C (armbian-config > Hardware > Overlays > i2c) y escanear:
sudo sed -i 's/^overlays=.*/& i2c0/' /boot/armbianEnv.txt && sudo reboot
i2cdetect -l # lister les bus
i2cdetect -y 0 # balayer le bus 0 : le BME280 répond 0x76 ou 0x77
- Lectura en Python (registro ID + datos brutos simplificados):
#!/usr/bin/env python3
"""bme280_lut.py — lecture bas niveau d'un BME280 sur Orange Pi PC."""
import smbus, time
BUS, ADDR = smbus.SMBus(0), 0x76 # 0x77 si ADDR du module câblé à VCC
def main -> None:
chip_id = BUS.read_byte_data(ADDR, 0xD0)
print(f"Chip ID : 0x{chip_id:02X} (attendu 0x52)")
# Configuration forcée en mode capteur (datasheet BME280, registre 0xF4)
BUS.write_byte_data(ADDR, 0xF4, 0x27) # x1/x1 oversampling, mode normal
time.sleep(0.1)
for _ in range(5):
# Température brute (registres 0xFA-0xFC) — conversion simplifiée
msb, mid, lsb = BUS.read_i2c_block_data(ADDR, 0xFA, 3)
adc_t = (msb << 12) | (mid << 4) | (lsb >> 4)
t_c = (adc_t / 16384.0 - 50.0) # approximation linéaire, hors compensation
print(f"ADC temp : {adc_t:6d} -> ~{t_c:5.1f} °C (non compensé)")
time.sleep(1)
if __name__ == "__main__":
main
Para obtener valores compensados exactos, instale la biblioteca adafruit-circuitpython-bme280 (pip3).
Verificación esperada
i2cdetect muestra una cuadrícula con 76 (o 77) ocupado. El script imprime Chip ID: 0x52, seguido de 5 líneas de temperatura. En el bus R_I2C interno, un escaneo dedicado mostraría el regulador SY8106A en 0x65.
Errores frecuentes
- Bus no activado por overlay: i2cdetect -l no muestra ningún bus — reinicie después de modificar armbianEnv.txt.
- Alimentar el módulo con 5 V en un sensor de 3.3 V sin regulador: riesgo de destrucción (lógica de 3.3 V en el H3).
- Dirección incorrecta (0x76 vs 0x77): el módulo tiene un jumper ADDR; primero ejecute i2cdetect.
- SCL/SDA invertidos: el escaneo devuelve una cuadrícula vacía sin error explícito.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash