capteur-i2c-bmp280.ino

Arduino Portenta H7 · Archivo : capteur-i2c-bmp280.ino · Lenguaje : Arduino · Uso : Lire un capteur pression/température BMP280 en I2C

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.

← Volver a la ficha