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
- 2. Compatibilité et Prérequis
- 3. Installation et Intégration
- 4. Fichiers de la librairie
- 5. Fonctionnalités
- 6. Connexions Matérielles
- 7. Utilisation de Base
- 7.1 Inclusion de la Bibliothèque
- 7.2 Déclaration des Variables
- 7.3 Redirection de printf
- 7.4 Initialisation du Capteur
- 7.4.1 Initialisation avec les Paramètres par Défaut
- 7.4.2 Initialisation avec des Paramètres Personnalisés
- 7.5 Lecture des Données
- 8. Référence API
- 9. Codes d'Erreur
- 10. Options de Configuration
- 11. Déboggage
- 12. Conclusion
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
- Créez un dossier nommé
STM32_BME280
dans le répertoireDrivers
de votre projet STM32 et copiez-y les fichiersSTM32_BME280.h
etSTM32_BME280.c
. - 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 siconfig
estNULL
). - Retourne
BME280_OK
en cas de succès, ou un code d'erreurBME280_ERROR_xxx
.
- Initialise le capteur BME280. Lit les coefficients de calibration, configure le capteur
selon la
structure
-
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'erreurBME280_ERROR_xxx
.
- Lit les données compensées de température, pression et humidité. Si le capteur est en mode
-
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.
- Lit uniquement la température compensée. Calcule
-
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).
- Lit uniquement la pression compensée. Nécessite que
-
HAL_StatusTypeDef BME280_ReadHumidity(BME280_Handle_t *dev, float *humidity)
- Lit uniquement l'humidité compensée. Nécessite que
t_fine
ait été calculé.
- Lit uniquement l'humidité compensée. Nécessite que
-
HAL_StatusTypeDef BME280_SetMode(BME280_Handle_t *dev, BME280_Mode_t mode)
- Change le mode de fonctionnement du capteur (
SLEEP
,FORCED
,NORMAL
).
- Change le mode de fonctionnement du capteur (
-
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'appelerBME280_ReadAll
si vous gérez le modeFORCED
manuellement. - Retourne
BME280_OK
,BME280_ERROR_COMM
, ouHAL_TIMEOUT
.
- Met le capteur en mode
-
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).
- Lit l'identifiant matériel du capteur (devrait être
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: pointeurNULL
).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.