🛠 Lire un capteur I2C (BME280) sur le bus
Objectifs
Mettre en œuvre l'I2C sur l'Orange Pi PC : activer le bus, balayer les adresses avec i2cdetect, puis lire un capteur de température/pression/humidité BME280 en Python. Vous découvrirez aussi que la carte possède déjà un périphérique I2C interne : le régulateur de tension CPU SY8106A, sur le bus R_I2C (bus secondaire) à l'adresse 0x65 — preuve que la pile I2C fonctionne même sans rien brancher.
Matériel
- Orange Pi PC sous Armbian, alimentation 5 V / 2 A (jack DC)
- Capteur BME280 (module à régulateur 3.3 V recommandé)
- Câbles Dupont : VCC→3.3 V, GND→GND, SDA→broche SDA, SCL→broche SCL
- sudo apt install i2c-tools python3-smbus
Code complet
- Activer I2C (armbian-config > Hardware > Overlays > i2c) et scanner :
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
- Lecture Python (registre ID + données brutes simplifiées) :
#!/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
Pour des valeurs compensées exactes, installez la bibliothèque adafruit-circuitpython-bme280 (pip3).
Vérification attendue
i2cdetect affiche une grille avec 76 (ou 77) occupé. Le script imprime Chip ID : 0x52, puis 5 lignes de température. Sur le bus R_I2C interne, un scan dédié montrerait le régulateur SY8106A en 0x65.
Erreurs fréquentes
- Bus non activé par overlay : i2cdetect -l ne montre aucun bus — redémarrer après modification d'armbianEnv.txt.
- Alimenter le module en 5 V sur un capteur 3.3 V sans régulateur : risque de destruction (logique 3.3 V sur le H3).
- Mauvaise adresse (0x76 vs 0x77) : le module a un pontet ADDR ; d'abord faire i2cdetect.
- SCL/SDA inversés : le scan renvoie une grille vide sans erreur explicite.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash