Projet Station Meteo Pro #3 : capteur BME280

J’avais déjà utilisé le BME280 dans la mini station, et je l’ai ré-utilisé ici pour mesurer la température, l’humidité et la pression atmosphérique. Découverte.

Découverte du BME280

Le BME280 est un composant fabriqué par Bosch et permet de mesurer température, humidité, et pression atmosphérique. On le trouve sur des cartes de 3cmx3cm en moyenne.

Il communique en I2C avec les arduino sur l’adresse 0x77 par défaut. On peut le faire communiquer sur l’adresse 0x76 si besoin à l’initialisation dans l’arduino (si utilisation de la librairie Adafruit).

bool status = bme.begin(0x76);

Le câblage s’est effectué sur la platine Grove via le cable Grove. Je l’ai connecté sur le premier port i2c en bas à gauche sur la photo.

Platine Grove

Code source

J’utilise les librairies Adafruit Sensor et BME280 dédiées. Elles contiennent toutes les fonctions nécessaires à récupérer les valeurs facilement.

#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

On créé ensuite les variables nécessaires au programme. On n’oublie pas de définir l’altitude de la station.

#define ALTITUDE  360   //altitude de la station météo
...
float temp(0);        //température moyenne sur 1 min
float hum(0);         //température moyenne sur 1 min
float pressure(0);    //température moyenne sur 1 min
int nbBME280 = 0;     //nb d'occurence d'appel du capteur BME280

Puis on initialise une variable globale

Adafruit_BME280 bme;  //BME280

Dans le setup, on va établir la liaison du capteur sur son adresse i2c. Pour moi, il est en 0x76

void setup()
{
   ...
   bool status = bme.begin(0x76);
   ...
}

Puis on doit ensuite écrire une fonction qui corrige la pression atmosphérique en fonction de l’altitude et de la température. Plus d’info ici et ici.

/* 
 *  Fonction qui corrige la pression atmosphérique (hPa) en fonction de l'altitude et la température
 *  RETURN : pression atmo corrigée
 */
//fonction qui corrige la pression en fonction de l'altitude
double getP(double Pact, double temp) {
  return Pact * pow((1 - ((0.0065 * ALTITUDE) / (temp + 0.0065 * ALTITUDE + 273.15))), -5.257);
}

Dans le programme principal, on va lire les valeurs toutes les 3 sec puis les enregistrer en cumulé sur 1 min. On en fait la moyenne ensuite.

void loop(){ 
  if (currentMillis - previousMillis > delaiAnemometre){
    previousMillis = millis();
  ...
    double val1 = bme.readTemperature();
    temp += val1;
    double P = getP((bme.readPressure() / 100.0F), val1);
    pressure += P;
    double humidity = bme.readHumidity();
    hum += humidity;
    nbBME280++;
  ...
  }
  if (currentMillis - previousMillis2 > delaiProgramme){
    previousMillis2 = millis();
    float avgtemp = temp / nbBME280;
    float avghum = hum / nbBME280;
    float avgpressure = pressure / nbBME280;
    ...
    temp = 0;
    hum = 0;
    pressure = 0;
    nbBME280 = 0;
    ...
 }
}

Fabrication de l’abri de température

L’abri à coupelles a été imprimé en 3D puis monté sur le mât. Le capteur BME280 est relié par un cable RJ11 de 10m avec un cable grove au bout pour se connecter sur l’Arduino.

Les plans de l’abri viennent de Thingiverse et ont été imprimés sur l’imprimante 3D d’Aurélie.

BME280 sur son support collé à la colle chaude

Conclusion

En quelques lignes, ce composant très puissant et très compact est redoutable. Sa précision est bonne et sa fiabilité est certaine. Sa facilité d’usage, aussi grâce à l’i2c et aux bibliothèques Adafruit font que j’ai choisi ce composant. A ce jour, il remplit pleinement ses fonctions.

15 Comments

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.