Pression et température en Bluetooth avec Arduino
Ce projet utilise un petit montage Arduino pour mesurer la température, la pression et envoyer ces données à son smartphone pour qui puisse les afficher sous forme graphique. Nous terminerons par un exemple avec la mesure de la température d’un congélateur.
Matériel utilisé
Vous trouverez l’ensemble des produits nécessaires à la réalisation de ce projet directement sur la boutique.
et pour une plus grande facilité d’utilisation, je vous recommande également :
Montage
Le capteur BMP280 mesure la pression atmosphérique et la température ambiante sous forme numérique étalonnée. Il peut être piloté par interface SPI ou I2C au choix. Ce capteur est pré-calibré, aucun composant supplémentaire n’est requis pour l’étalonnage ou le fonctionnement.
ESP32-DevKit et platine d’essais (Breadboard)
Si vous n’arrivez pas à insérer l’ESP32-DevKit C sur votre platine d’essais, vous trouverez mon astuce à l’article : Enregistrer sa voix au format WAV avec Arduino et le SPH0645
Le câblage du BMP280 et de l’ESP32 par liaison SPI
L’une des deux interfaces proposées par le capteur BMP280 est la liaison SPI (Serial Peripheral Interface) avec 4 signaux logiques pour l’échange de données : SCL, SDO, SDA et CSB.

Pour l’alimentation du BMP280:
- Fil rouge, la broche 3V3 est à relier au 3V3 de l’ESP32.
- Fil noir, la broche GND est à brancher à la masse (GND) de l’ESP32.
Pour les échanges d’informations entre le capteur BMP280 et l’ESP32 :
- Fil marron, la broche CSB (Chip Select Bar) du capteur à la sortie 5 (SS de l’interface SPI) de l’ESP32. C’est pour la sélection du destinataire.
- Fil vert, la broche SDA (Serial Data Line) à la sortie 23 (MOSI de l’interface SPI) de l’ESP32. Ce sont les données envoyées par l’ESP32 au BMP280.
- Fil jaune, la broche SCL (Serial Clock Line) à la sortie 18 (SCK de l’interface SPI) de l’ESP32. C’est pour le signal de synchronisation.
- Fil blanc, la broche SDO (Serial Data Output) à l‘entrée 19 (MISO de l’interface SPI) de l’ESP32. Ce sont les données que l’ESP32 reçoit du capteur BMP280.
Le câblage du BMP280 et de l’ESP32 par liaison I2C
L’interface I2C (Inter-Integrated Circuit), la deuxième proposée par ce capteur, est plus simple à câbler puisque seulement 2 fils sont nécessaires pour l’échange des données : broches SCL et SDA.

Pour l’alimentation du BMP280:
- Fil rouge, la broche 3V3 est à relier au 3V3 de l’ESP32.
- Fil noir, la broche GND est à brancher à la masse (GND) de l’ESP32.
Pour les échanges d’informations entre le capteur BMP280 et l’ESP32 :
- Fil vert, la broche de données SDA (Serial Data Line) à la broche 21 de l’ESP32. Cette liaison est utilisée pour l’envoi de données dans les 2 sens par l’ESP32 et le BMP280.
- Fil jaune, la broche SCL (Serial Clock Line) à la sortie 22 de l’ESP32. C’est pour le signal de synchronisation.
Le câblage de la batterie lithium-ion et son chargeur à l’ESP32
L’utilisation d’une batterie lithium-ion permet d’obtenir un module de température utilisable sans câble d’alimentation. La recharge de la batterie s’effectue par le port USB C de la carte électronique.

Les connexions sont les suivantes :
- Fil orange, la broche B+ du chargeur à la borne + de la batterie 18650.
- Fil gris, la broche B- du chargeur à la borne – de la batterie 18650.
- Fil rouge, la broche OUT+ du chargeur à la broche 3V3 de l’ESP32.
- Fil noir, la broche OUT- du chargeur à la broche GND de l’ESP32.
Décomposition du tutoriel
Ce projet est décomposé en 2 étapes :
- L’utilisation du capteur BMP280 et ses 2 interfaces de connexions (page 2).
- L’installation d’une application graphique sur son smartphone et la communication Bluetooth (page 3).
Commençons par la gestion du capteur de température et de pression à la page suivante.








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