capteur-i2c-bmp280.ino
El BMP280 en el bus I2C de la Portenta con escrituras Wire en bruto: reset, modo forzado, disparo y lectura de 20 bits de presión. Entender el protocolo antes de sacar librerías hechas.
Hardware
Un Arduino Portenta H7 (módulo ST STM32H747 doble núcleo Cortex-M7 @ 480 MHz + M4 @ 240 MHz, 8 MB SDRAM, conector high-density), alimentado por USB-C o 5 V. 1 módulo BMP280 (I2C, dirección 0x76 o 0x77), alimentación de 3,3 V.
Cableado
SDA/SCL a los pines I2C del conector (ver esquema de la carrier), VCC 3,3 V, GND. Pull-ups suelen venir en el módulo.
Funcionamiento
Wire controla el controlador I2C del H7 a 400 kHz; cada medida forzada se dispara con una escritura y se lee en 20 bits. La conversión física usa la calibración de fábrica.
Ejecución
Arduino IDE con el core « Arduino Mbed OS Portenta Boards »: elige « Portenta H7 » (núcleo M7), el puerto USB-C y Subir. El selector M7/M4 del modo DFU permite cargar también el núcleo M4.
Variantes
Conectar la librería Adafruit_BMP280 para la conversión hecha, o vigilar la presión cada minuto en sueño profundo.
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.