capteur-i2c-bmp280.ino

Arduino Portenta H7 · Fichier : capteur-i2c-bmp280.ino · Langage : Arduino · Usage : Lire un capteur pression/température BMP280 en I2C

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.

← Retour à la fiche