Premier programme Arduino avec le capteur BMP280
Ce premier programme Arduino (ou plutôt ces premiers programmes, car ils diffèrent pour chaque interface) va simplement lire les valeurs de température et de pression du capteur BMP280 puis les afficher sur le Moniteur série.
Bibliothèque de gestion du capteur BMP280
Je vous invite à installer la bibliothèque Arduino nommée “BMP280_DEV” by Martin Lindupp. Pour plus d’information sur la procédure d’installation d’une bibliothèque sous Arduino, reportez-vous au chapitre “Installation d’une bibliothèque pour l’écran OLED” de l’article “Température et humidité avec Arduino”.
Écriture du programme de gestion de ce capteur BMP280
La bibliothèque BMP280_DEV choisie pour ce projet se déclare de la façon suivante afin de pouvoir l’utiliser dans notre croquis :
#include <BMP280_DEV.h>
Nous déclarons en globale une instance capteur_G de la classe principale BMP280_DEV de cette bibliothèque de même nom. Ce sont les paramètres de cette déclaration d’instance qui vont définir le type d’interface utilisé.
Pour l’interface SPI, le numéro de la broche CSB est passé en paramètre :
BMP280_DEV capteur_G(5);
Pour l’interface I2C, il n’est pas nécessaire de passer de paramètre :
BMP280_DEV capteur_G;
Une différence de code est également présente entre les 2 interfaces lors de l’appel de la méthode begin() qui gère la configuration matérielle. On utilise les valeurs par défaut pour l’interface SPI:
capteur_G.begin();
Les valeur par défaut de l’interface I2C utilisent l’adresse 0x77 ce qui oblige à câbler la broche SDO sur le 3V3. Afin de minimiser le nombre de câbles utilisés, nous forçons l’adresse 0x76 :
capteur_G.begin(0x76); // SDO sur GND ou en l'air
Le capteur BMP280 est capable d’effectuer des acquisitions en continu. Ce mode de fonctionnement est déclenché par la méthode startNormalConversion() de notre objet capteur_G.
capteur_G.startNormalConversion();
Dans cet exemple, nous paramétrons au préalable une période d’une seconde entre 2 acquisitions à l’aide de la méthode setTimeStandby().
capteur_G.setTimeStandby(TIME_STANDBY_1000MS);
Les valeurs de température et de pression sont obtenues par l’appel de la méthode getMeasurements() dont nous testons le retour afin de n’afficher qu’une seule fois chaque acquisition:
if (capteur_G.getMeasurements(temperature_L, pression_L, altitude_L))
Il est à noter que cette méthode retourne également une estimation de l’altitude, calculée à partir de la pression et de la température mesurée. Cette grandeur d’altitude calculée ne nous intéresse pas dans ce projet.
Voici le code source Arduino pour la lecture des données du BMP280 par l’interface SPI:
/* Déclaration des bibliothèques utilisées */
#include <BMP280_DEV.h>
/* Déclaration globales */
BMP280_DEV capteur_G(5);
// Fonction de démarrage, s'exécute une seule fois:
void setup()
{
// Ouverture du port série pour les traces
Serial.begin(115200);
// Configuration du capteur BMP280
capteur_G.begin();
capteur_G.setTimeStandby(TIME_STANDBY_1000MS); // Définie un temps de repos d'1 seconde
capteur_G.startNormalConversion(); // Démarre des acquisitions en continu, espacées par le temps de repos défini précédemment.
}
// Fonction principale du programme, s'exécute en boucle:
void loop()
{
float temperature_L, pression_L, altitude_L;
char tampon_l[60];
if (capteur_G.getMeasurements(temperature_L, pression_L, altitude_L))
{
/* Une mesure a été réalisée */
sprintf(tampon_l, "Temperature: %4.2f°C \t\t Pression: %4.2fhPa", temperature_L, pression_L);
Serial.println(tampon_l);
}
}
et le code source Arduino pour la lecture des données du BMP280 par l’interface I2C:
/* Déclaration des bibliothèques utilisées */
#include <BMP280_DEV.h>
/* Déclaration globales */
BMP280_DEV capteur_G;
// Fonction de démarrage, s'exécute une seule fois:
void setup()
{
// Ouverture du port série pour les traces
Serial.begin(115200);
// Configuration du capteur BMP280
capteur_G.begin(0x76); // SDO sur GND ou en l'air
capteur_G.setTimeStandby(TIME_STANDBY_1000MS); // Définie un temps de repos d'1 seconde
capteur_G.startNormalConversion(); // Démarre des acquisitions en continu, espacées par le temps de repos défini précédemment.
}
// Fonction principale du programme, s'exécute en boucle:
void loop()
{
float temperature_L, pression_L, altitude_L;
char tampon_l[60];
if (capteur_G.getMeasurements(temperature_L, pression_L, altitude_L))
{
/* Une mesure a été réalisée */
sprintf(tampon_l, "Temperature: %4.2f°C \t\t Pression: %4.2fhPa", temperature_L, pression_L);
Serial.println(tampon_l);
}
}
Compilation et test de ce programme de lecture des données du BMP280
Une fois ce programme compilé et transféré dans l’ESP32-DevKit, le moniteur affiche en continu la température et la pression de la pièce obtenues par le capteur BMP280:

Maintenant que nous avons vérifié, la bonne gestion du capteur BMP280 par Arduino, intéressons nous à l’interface Bluetooth et à l’appli sur le smartphone.

Tuto, montage et explications, « tropbien ».
Ce petit projet est ma première utilisation de l’ESP32. Je l’ai trouvé très formateur.
Le projet que j’ai en arrière plan est de réaliser des mesures de pression (athmosphérique) de l’air dans un compartiment moteur d’un avion afin d’améliorer le système de ventilation et de refroidissement.
Pour ce faire j’ai besoin de 4 ou 5 points de mesure et d’un transfert en bluetooth vers un téléphone. Le montage tropratik est un super point de départ.
Je suis ensuite passé à 2 capteurs BMP280 en cherchant la liaison SPI. j’ai tout simplement utilisé le code qui est en exemple dans la librairie BMP280 « BMP280_SPI_Normal_Multiple » en utilisant les broche 5 et 17 pour le CSB, mais cela fonctione de façon aléatoire (un capteur, ou l’autre, mais pas les deux…).
Si vous avez des idées ou un peu d’expérience sur le sujet je suis intéréssé par vos avis.
Merci.
Bonjour Thomas,
Merci pour votre retour,
De mon côté j’ai fait l’essai avec deux capteurs et tout a bien fonctionné. Je vous mets ci-dessous le code:
/* Déclaration des bibliothèques utilisées */ #include <BMP280_DEV.h> /* Déclaration globales */ BMP280_DEV capteur1_G(5); BMP280_DEV capteur2_G(17); // Fonction de démarrage, s'exécute une seule fois: void setup() { // Ouverture du port série pour les traces Serial.begin(115200); // Configuration des capteur BMP280 capteur1_G.begin(); capteur1_G.setTimeStandby(TIME_STANDBY_1000MS); // Définie un temps de repos d'1 seconde capteur1_G.startNormalConversion(); // Démarre des acquisitions en continu, espacées par le temps de repos défini précédemment. capteur2_G.begin(); capteur2_G.setTimeStandby(TIME_STANDBY_1000MS); // Définie un temps de repos d'1 seconde capteur2_G.startNormalConversion(); // Démarre des acquisitions en continu, espacées par le temps de repos défini précédemment. } // Fonction principale du programme, s'exécute en boucle: void loop() { float temperature_L, pression_L, altitude_L; char tampon_l[60]; if (capteur1_G.getMeasurements(temperature_L, pression_L, altitude_L)) { /* Une mesure a été réalisée */ sprintf(tampon_l, "Capteur 1 --> Temperature: %4.2f°C \t\t Pression: %4.2fhPa", temperature_L, pression_L); Serial.println(tampon_l); } if (capteur2_G.getMeasurements(temperature_L, pression_L, altitude_L)) { /* Une mesure a été réalisée */ sprintf(tampon_l, "Capteur 2 --> Temperature: %4.2f°C \t\t Pression: %4.2fhPa", temperature_L, pression_L); Serial.println(tampon_l); } }et le schéma de branchement que j’ai utilisés pour mes tests.
N’hésitez surtout pas à partager votre avancée, votre application dans un compartiment moteur d’avion est intéressante et je suis curieux de voir la suite !
Bonsoir Nikko,
Effectivement cela fonctionne bien, j’utilisais une vielle breadboar et j’avais des faux contact…
J’ai ajouté au code une moyenne glissante et un réglage de l’offset des capteurs, ça marche bien.
J’ai besoin de 5 capteurs en tout, si j’ai bien compris, je dois utiliser deux liaisons SPI, VSPI et HSPI?
C’est la que je bloque de nouveau…
J’ai essayé le code suivant pour faire un test avec le HSPI avec le câblage (SCK 14, MOSI 13, MISO 12, SS 5), Si tu vois ce qui clôche???
Merci
Thomas
Code essai HSPI:
/////////////////////////////////////////////////////////////////////////////////////
// BMP280_DEV – ESP32 HSPI Communications, Default Configuration, Normal Conversion
//////////////////////////////////////////////////////////////////////////////////////
#include <BMP280_DEV.h> // Include the BMP280_DEV.h library
float temperature, pressure, altitude; // Create the temperature, pressure and altitude variables
//BMP280_DEV bmp280(5); // Create BMP280_DEV object and set-up for VSPI operation, SCK 18, MOSI 23, MISO 19, SS 5
SPIClass SPI1(HSPI); // Create (instantiate) the SPI1 object for HSPI operation
BMP280_DEV bmp280(5, HSPI, SPI1); // Create BMP280_DEV object and set-up for HSPI operation, SCK 14, MOSI 13, MISO 12, SS 5
void setup()
{
Serial.begin(115200); // Initialise the serial port
bmp280.begin(); // Default initialisation, place the BMP280 into SLEEP_MODE
bmp280.setTimeStandby(TIME_STANDBY_1000MS); // Set the standby time to 1 second (1000ms)
bmp280.startNormalConversion(); // Start NORMAL continuous conversion
xTaskCreatePinnedToCore( // Kick-off « TaskOne » pinned to core 1
taskOne,
« TaskOne »,
10000,
NULL,
1,
NULL,
1);
}
void taskOne(void* parameter)
{
while(true)
{
if (bmp280.getMeasurements(temperature, pressure, altitude)) // Check if the measurement is complete
{
Serial.print(temperature); // Display the results
Serial.print(F(« *C « ));
Serial.print(pressure);
Serial.print(F(« hPa « ));
Serial.print(altitude);
Serial.println(F(« m »));
}
}
}
void loop() { delay(1000); } // Add 1 second delay
.
Bonjour Thomas,
Je t’invite à reprendre le code que je t’ai partagé et à l’adapter pour passer de 2 à 5 capteurs. Une seule liaison SPI suffit pour tous les gérer.
Bonsoir Nikko,
Effectivement je n’ai pas essayé cela. Je te tiens au courant.
Merci.
Bonsoir Nikko,
merci pour ton aide.
Tout fonctionne parfaitement