capteur-i2c-bmp280.ino
Le BMP280 sur le bus I2C de la Portenta, en écritures Wire brutes : reset, mode forcé, déclenchement et lecture des 20 bits de pression. Comprendre le protocole avant de sortir les bibliothèques toutes faites.
Matériel requis
Une Arduino Portenta H7 (module ST STM32H747 double cœur Cortex-M7 @ 480 MHz + M4 @ 240 MHz, 8 Mo SDRAM, connecteur haut-density), alimentée par USB-C ou 5 V. 1 module BMP280 (I2C, adresse 0x76 ou 0x77), alimentation 3,3 V.
Câblage
SDA/SCL sur les broches I2C du connecteur (voir schéma carrier), VCC 3,3 V, GND. Pull-ups souvent présents sur le module.
Fonctionnement
Wire pilote le contrôleur I2C du H7 à 400 kHz ; chaque mesure forcée se déclenche par une écriture puis se lit en 20 bits. La conversion physique utilise la calibration gravée en usine.
Exécution
Arduino IDE avec le core « Arduino Mbed OS Portenta Boards » : choisir « Portenta H7 » (cœur M7), le port USB-C puis Téléverser. Le sélecteur M7/M4 du mode DFU permet de charger aussi le cœur M4.
Variantes
Brancher la bibliothèque Adafruit_BMP280 pour la conversion toute faite, ou surveiller la pression toutes les minutes en sommeil profond.
capteur-i2c-bmp280.ino
// BMP280 (0x76) sur le bus Wire de la Portenta.
#include <Wire.h>
#define ADRESSE 0x76
uint16_t lire16(uint8_t reg) {
Wire.beginTransmission(ADRESSE);
Wire.write(reg);
Wire.endTransmission(false);
Wire.requestFrom((uint8_t)ADRESSE, (uint8_t)2);
uint8_t lsb = Wire.read();
uint8_t msb = Wire.read();
return (msb << 8) | lsb;
}
void setup() {
Serial.begin(9600);
Wire.begin();
Wire.setClock(400000);
// Reinitialisation puis mode forcé.
Wire.beginTransmission(ADRESSE);
Wire.write(0xE0); Wire.write(0xB6); // soft reset
Wire.endTransmission();
delay(10);
Wire.beginTransmission(ADRESSE);
Wire.write(0xF4); Wire.write(0x27); // x16/x16, mode force
Wire.endTransmission();
}
void loop() {
Wire.beginTransmission(ADRESSE);
Wire.write(0x2C); // declenche une mesure
Wire.endTransmission();
delay(20);
int32_t p = ((uint32_t)lire16(0xF7) << 12) | (lire16(0xF9) >> 4);
int32_t t = ((uint32_t)lire16(0xFA) << 12) | (lire16(0xFC) >> 4);
Serial.printf("pression brute=%ld temperature brute=%ld\n", p, t);
delay(1000);
}
// Valeurs brutes : la conversion complete (Bosch datasheet)
// utilise les registres de calibration 0x88..0xA1.