You are currently viewing Pression et température en Bluetooth avec Arduino
Pression et température en Bluetooth avec Arduino

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:

Affichage sur le Moniteur série de la température et de la pression mesurées par le BMP280
Affichage sur le Moniteur série de la température et de la pression mesurées par le 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.

S’abonner
Notification pour
guest
6 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
Thomas Puthod
Thomas Puthod
19 jours il y a

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.

Thomas Puthod
Thomas Puthod
Répondre à  Nikko
10 jours il y a

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

.

Thomas Puthod
Thomas Puthod
Répondre à  Nikko
9 jours il y a

Bonsoir Nikko,
Effectivement je n’ai pas essayé cela. Je te tiens au courant.
Merci.

tputhod
tputhod
Répondre à  Thomas Puthod
4 jours il y a

Bonsoir Nikko,
merci pour ton aide.
Tout fonctionne parfaitement

Screenshot_20251210_222729_Bluetooth-Electronics