Tutoriel - Bibliothèque STM32 BME280

Interface C pour capteur de température, pression et humidité BME280 sur microcontrôleurs STM32

Consultez la librairie sur GitHub.

1. Introduction

Ce tutoriel explique comment utiliser le capteur BME280 de Bosch Sensortec avec un microcontrôleur STM32. Le BME280 est un capteur environnemental capable de mesurer la température, la pression atmosphérique et l'humidité relative.

2. Compatibilité et Prérequis

Compatibilité Matérielle

  • Toutes les familles de microcontrôleurs STM32 supportant HAL et disposant d'un périphérique I2C.
  • Capteur BME280.

Prérequis Logiciels

  • Un microcontrôleur STM32.
  • STM32CubeIDE.
  • Le bus I2C sur lequel se troue votre capteur doit être configuré et initialisé dans votre projet.
  • La librairie HAL STM32_BME280 présente dans le répertoire STM32_Libraries.

3. Fichiers de la librairie

  • STM32_BME280.h : Fichier d'en-tête contenant les déclarations des fonctions et constantes.
  • STM32_BME280.c : Fichier source contenant l'implémentation des fonctions.

n'oubliez pas de modifier le fichier STM32_BME280.h pour l'adapter à votre configuration matérielle #include "stm32l0xx_hal.h" // Remplacez stm32l0xx_hal.h si vous utilisez une autre série de carte ex : stm32f4xx_hal.h.

4. Installation et Intégration

  1. Créez un dossier nommé STM32_BME280 dans le répertoire Drivers de votre projet STM32 et copiez-y les fichiers STM32_BME280.h et STM32_BME280.c.
  2. Ajoutez les chemins d'inclusion : dans les propriétés de votre projet STM32CubeIDE, dans C/C++ General > Paths and Symbols > Onglet Includes, ajoutez le chemin vers le dossier STM32_BME280.

N'oubliez pas d'activer le float dans les propriétés du projet pour afficher les nombres flottants dans le printf.

5. Fonctionnalités

  • Lecture de la température en degrés Celsius (°C).
  • Lecture de la pression atmosphérique en Pascals (Pa).
  • Lecture de l'humidité relative en pourcentage (%).
  • Calcul de l'altitude approximative en mètres (m) basée sur la pression.

6. Connexions Matérielles

Connectez le module BME280 à votre microcontrôleur STM32 en utilisant le bus I2C ou SPI :

  • VCC → 3.3V
  • GND → GND
  • SCL → Broche SCL I2C du STM32 (ex: PB6, PB8, PB10 selon le MCU et la configuration I2C)
  • SDA → Broche SDA I2C du STM32 (ex: PB7, PB9, PB11 selon le MCU et la configuration I2C)

Assurez-vous d'activer le périphérique I2C ou SPI approprié dans votre configuration STM32CubeMX. L'adresse I2C par défaut du BME280 est 0x76 ou 0x77 selon le module.

7. Utilisation de Base

4.1 Inclusion de la Bibliothèque

Incluez le fichier d'en-tête dans la section USER CODE BEGIN Includes :


/* USER CODE BEGIN Includes */
#include <stdio.h>      // Pour printf
#include "STM32_BME280.h"     // Inclure la bibliothèque du capteur
/* USER CODE END Includes */
            

7.2 Déclaration des variables

Définissez les variables dans la section USER CODE BEGIN Private Variables :


/* USER CODE BEGIN PV */
BME280_Handle_t bme280_dev; // Structure de gestion pour le capteur BME280
/* USER CODE END PV */
            

7.3 Fonction pour rediriger printf

Pour afficher les résultats sur le terminal, redirigez la sortie de printf vers l'UART. Vous pouvez utiliser la fonction __io_putchar pour cela. Voici un exemple d'implémentation pour l'UART2 dans la section USER CODE BEGIN 0 :


/* USER CODE BEGIN 0 */
// Fonction qui transmet un caractère via UART et le renvoie.Utilisé pour la sortie standard (printf).
int __io_putchar(int ch) {
    HAL_UART_Transmit(&huart2, (uint8_t*) &ch, 1, 0xFFFF); // Pour Envoyer le caractère via UART
    // ITM_SendChar(ch);                 // Option alternative pour envoyer le caractère via ITM
    return ch;
}
/* USER CODE END 0 */    
            

7.4 Initialisation du capteur

7.4.1 Initialisation avec les paramètres par défaut:

L'initialisation avec les paramètres par défaut configure le capteur en mode normal avec les réglages suivants :

  • Filtre : désactivé (filter = BME280_FILTER_OFF)
  • Suréchantillonnage de la pression : x4 (oversampling_p = BME280_OVERSAMPLING_X4)
  • Suréchantillonnage de la température : x2 (oversampling_t = BME280_OVERSAMPLING_X2)
  • Suréchantillonnage de l'humidité : x2 (oversampling_h = BME280_OVERSAMPLING_X2)
  • Temps d'attente : 1000 ms (standby_time = BME280_STANDBY_1000_MS)

Voici un exemple d'initialisation avec ces paramètres par défaut :

Initialisez le capteur dans la section USER CODE BEGIN 2 :


/* USER CODE BEGIN 2 */
HAL_Delay(250);
// Initialisation du BME280 via la librairie
printf("Initialisation BME280 avec les paramètres par défaut...\r\n");

int8_t init_status = BME280_Init(&bme280_dev, &hi2c1, BME280_ADDRESS_DEFAULT, NULL); // NULL pour utiliser les
paramètres par défaut

if (init_status != BME280_OK) { // Vérification de l'initialisation
    switch (init_status) { // Gestion des erreurs
        case BME280_ERROR_COMM:
            printf("Erreur de communication avec le capteur BME280.\r\n");
            break;
        case BME280_ERROR_CHIP_ID:
            printf("ID de puce incorrect pour le capteur BME280.\r\n");
            break;
        case BME280_ERROR_CONFIG:
            printf("Erreur lors de la configuration du capteur BME280.\r\n");
            break;
        default:
            printf("Erreur inconnue lors de l'initialisation du BME280.\r\n");
            break;
    }    
    Error_Handler();
}
printf("BME280 initialisé avec succès avec les paramètres par défaut.\r\n");
printf("-----------------------------------------------------\r\n\n");
HAL_Delay(100); // Petit délai pour laisser le capteur se stabiliser
/* USER CODE END 2 */
            

7.4.2 Initialisation avec des paramètres personnalisés :

Vous pouvez également initialiser le capteur avec des paramètres personnalisés. Voici un exemple d'initialisation avec des paramètres spécifiques :

Initialisez le capteur dans la section USER CODE BEGIN 2 :


/* USER CODE BEGIN 2 */
HAL_Delay(250);
// Initialisation du BME280 via la librairie
printf("Initialisation BME280...\r\n");

// Définir la configuration souhaitée pour le BME280
BME280_Config_t bme_config;
bme_config.mode = BME280_MODE_NORMAL; // Mode Normal
bme_config.filter = BME280_FILTER_OFF; // Pas de filtre IIR
bme_config.oversampling_p = BME280_OVERSAMPLING_X4; // Suréchantillonnage Pression x4
bme_config.oversampling_t = BME280_OVERSAMPLING_X2; // Suréchantillonnage Température x2
bme_config.oversampling_h = BME280_OVERSAMPLING_X2; // Suréchantillonnage Humidité x2
bme_config.standby_time = BME280_STANDBY_1000_MS; // Temps d'attente 1000ms

int8_t init_status = BME280_Init(&bme280_dev, &hi2c1, BME280_ADDRESS_DEFAULT, &bme_config); // Passer la config
if (init_status != BME280_OK) {
    switch (init_status) {
        case BME280_ERROR_COMM:
            printf("Erreur de communication avec le capteur BME280.\r\n");
            break;
        case BME280_ERROR_CHIP_ID:
            printf("ID de puce incorrect pour le capteur BME280.\r\n");
            break;
        case BME280_ERROR_CONFIG:
            printf("Erreur lors de la configuration du capteur BME280.\r\n");
            break;
        default:
            printf("Erreur inconnue lors de l'initialisation du BME280.\r\n");
            break;
    }
    Error_Handler();
}
printf("BME280 initialisé avec succès.\r\n");
printf("-----------------------------------------------------\r\n\n");
HAL_Delay(100); // Petit délai pour laisser le capteur se stabiliser
/* USER CODE END 2 */
            

7.5 Lecture des données

Pour lire les données de température et d'humidité dans la section USER CODE BEGIN WHILE :


/* USER CODE BEGIN WHILE */
while (1) { // Boucle infinie
    float temperature = 0.0f, pressure = 0.0f, humidity = 0.0f; // Variables pour stocker les données du capteur
    int8_t read_status = BME280_ReadAll(&bme280_dev, &temperature, &pressure, &humidity); // Lire les données du capteur

    if (read_status == BME280_OK) { // Vérifier si la lecture a réussi
        printf("Température : %.2f °C\r\n", temperature); // Afficher la température
        printf("Pression : %.2f hPa\r\n", pressure / 100.0); // Afficher la pression en hPa
        printf("Humidité : %.2f %%\r\n", humidity); // Afficher l'humidité en pourcentage
    } else {
        printf("Erreur lors de la lecture des données du BME280 (code : %d).\r\n", read_status); // Afficher un message d'erreur
    }
    printf("-----------------------------------------------------\r\n\n");
    HAL_Delay(2000); // Attendre le délai défini avant la prochaine lecture
    /* USER CODE END WHILE */
            

8. Référence API

8.1 Structures Principales

  • BME280_Handle_t: Structure principale contenant le handle I2C, l'adresse du capteur, la configuration et les données de calibration.
  • BME280_Config_t: Structure pour définir la configuration du capteur (mode, suréchantillonnage, filtre, temps d'attente).

8.2 Fonctions Principales

  • int8_t BME280_Init(BME280_Handle_t *dev, I2C_HandleTypeDef *hi2c, uint8_t dev_addr, BME280_Config_t *config)
    • Initialise le capteur BME280. Lit les coefficients de calibration, configure le capteur selon la structure config fournie (ou utilise une configuration par défaut si config est NULL).
    • Retourne BME280_OK en cas de succès, ou un code d'erreur BME280_ERROR_xxx.
  • int8_t BME280_ReadAll(BME280_Handle_t *dev, float *temperature, float *pressure, float *humidity)
    • Lit les données compensées de température, pression et humidité. Si le capteur est en mode FORCED, cette fonction déclenche d'abord une mesure.
    • Retourne BME280_OK en cas de succès, ou un code d'erreur BME280_ERROR_xxx.
  • HAL_StatusTypeDef BME280_ReadTemperature(BME280_Handle_t *dev, float *temperature)
    • Lit uniquement la température compensée. Calcule t_fine nécessaire pour les autres compensations.
  • HAL_StatusTypeDef BME280_ReadPressure(BME280_Handle_t *dev, float *pressure)
    • Lit uniquement la pression compensée. Nécessite que t_fine ait été calculé (généralement en lisant d'abord la température).
  • HAL_StatusTypeDef BME280_ReadHumidity(BME280_Handle_t *dev, float *humidity)
    • Lit uniquement l'humidité compensée. Nécessite que t_fine ait été calculé.
  • HAL_StatusTypeDef BME280_SetMode(BME280_Handle_t *dev, BME280_Mode_t mode)
    • Change le mode de fonctionnement du capteur (SLEEP, FORCED, NORMAL).
  • int8_t BME280_TriggerForcedMeasurement(BME280_Handle_t *dev, uint32_t timeout)
    • Met le capteur en mode FORCED, attend la fin de la mesure (ou le timeout). Utile avant d'appeler BME280_ReadAll si vous gérez le mode FORCED manuellement.
    • Retourne BME280_OK, BME280_ERROR_COMM, ou HAL_TIMEOUT.
  • HAL_StatusTypeDef BME280_Reset(BME280_Handle_t *dev)
    • Effectue une réinitialisation logicielle du capteur.
  • HAL_StatusTypeDef BME280_ReadChipID(BME280_Handle_t *dev, uint8_t *chip_id)
    • Lit l'identifiant matériel du capteur (devrait être 0x60 pour BME280).

9. Code erreur

Voici les codes d'erreur possibles lors de l'initialisation et de la lecture du capteur :

  • BME280_OK (0): Opération réussie.
  • BME280_ERROR_COMM (-1): Erreur de communication I2C (vérifiez connexions, adresse, configuration I2C).
  • BME280_ERROR_CHIP_ID (-2): L'ID lu ne correspond pas à celui attendu (0x60).
  • BME280_ERROR_CONFIG (-3): Erreur lors de l'écriture de la configuration dans les registres.
  • BME280_ERROR_PARAM (-4): Paramètre invalide passé à une fonction (ex: pointeur NULL).
  • BME280_ERROR_MEASURING (-5): (Non utilisé actuellement, mais réservé).

10. Options de Configuration

La structure BME280_Config_t permet de configurer les paramètres suivants :

10.1. Mode de fonctionnement (mode)

Détermine comment le capteur effectue les mesures :

  • BME280_MODE_SLEEP : Mode veille, aucune mesure.
  • BME280_MODE_FORCED : Une seule mesure, puis retour en veille.
  • BME280_MODE_NORMAL : Mesures périodiques en continu.

10.2. Suréchantillonnage

Améliore la précision des mesures en effectuant plusieurs lectures :

  • oversampling_t : Suréchantillonnage pour la température.
  • oversampling_p : Suréchantillonnage pour la pression.
  • oversampling_h : Suréchantillonnage pour l'humidité.

Options disponibles :

  • BME280_OVERSAMPLING_SKIPPED : Désactivé.
  • BME280_OVERSAMPLING_X1 : Une seule mesure.
  • BME280_OVERSAMPLING_X2 : Suréchantillonnage x2.
  • BME280_OVERSAMPLING_X4 : Suréchantillonnage x4.
  • BME280_OVERSAMPLING_X8 : Suréchantillonnage x8.
  • BME280_OVERSAMPLING_X16 : Suréchantillonnage x16.

10.3. Filtre IIR (filter)

Réduit les fluctuations rapides dans les mesures :

  • BME280_FILTER_OFF : Pas de filtrage.
  • BME280_FILTER_X2 : Filtrage léger.
  • BME280_FILTER_X4 : Filtrage modéré.
  • BME280_FILTER_X8 : Filtrage élevé.
  • BME280_FILTER_X16 : Filtrage très élevé.

10.4. Temps d'attente (standby_time)

Définit l'intervalle entre deux cycles de mesure en mode NORMAL :

  • BME280_STANDBY_0_5_MS : 0,5 ms.
  • BME280_STANDBY_62_5_MS : 62,5 ms.
  • BME280_STANDBY_125_MS : 125 ms.
  • BME280_STANDBY_250_MS : 250 ms.
  • BME280_STANDBY_500_MS : 500 ms.
  • BME280_STANDBY_1000_MS : 1000 ms.
  • BME280_STANDBY_10_MS : 10 ms.
  • BME280_STANDBY_20_MS : 20 ms.

11. Déboggage

Vous pouvez activer des messages de débogage via printf en décommentant la ligne #define DEBUG_ON au début du fichier STM32_BME280.c. Assurez-vous que printf est correctement redirigé (par exemple, vers une liaison série UART, comme montré dans l'exemple __io_putchar).

Les messages de débogage fourniront des informations sur les opérations effectuées par la bibliothèque, facilitant le suivi des erreurs potentielles.

12. Conclusion

La bibliothèque STM32_BME280 vise à simplifier l'utilisation des capteurs DHT avec les microcontrôleurs STM32 en encapsulant la complexité de la communication et de la conversion des données. En suivant ce tutoriel, vous devriez être en mesure de configurer, brancher et lire les données de température, pression et'humidité de vos capteurs BME280.