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.
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.
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.
Bonjour, je suis depuis longtemps a la recherche d’éléments me permettant a moindre cout de recréer une gestion climatique pour ma serre horticole. Beaucoup de choses sont actuellement gérées via domoticz (plus simpliste et intuitif pour les divers utilisateurs du système…) Néanmoins il me manque la reprise des éléments météo qui existaient au départ. Les infos de votre superbe site me permettent (enfin) d’avancer sur le sujet. Je reprend et modifie les codes arduino un par un pour le moment afin d’adapter au mieux a mes éléments (GY271 pour la girouette, ils avec aimants circulaire 6 positions etc.) Mais la concernant le BME280, j’avoue planter un peu, et j’aurais besoin de votre dextérité, cela est il possible? Merci d’avance.
Bonjour,
Oui bien sur on peut echanger autour du BME280. Que souhaitez vous faire precisement ?
Je vous envoie un email en parallèle pour converser.
Bonne journée.
Fabien
Bonjour Fabien,
Merci beaucoup pour l’aide apportée, et votre site et décidément une source d’information très précieuse. J’ai, depuis pas mal avancé sur mon projet et toutes les infos remontes désormais a Domoticz sur le Raspberry. Je suis assez surpris car la précision de l’ensemble et plus que satisfaisant, peut être un ajustement nécessaire sur l’anémomètre mais je verrais ça ultérieurement.
Afin d’être précis pour vos lecteurs: je me suis inspiré des codes de ce sites en grande partie, cependant quelques nuances concernant la girouette puisque je travaille avec un GY271.
J’intègre le tout à domoticz en « MySensors USB » et j’envoie toute les minutes un Protocole Série pour chaque donnée.
Bonjour !
Merci pour votre commentaire, et l’aide apportée a été faite avec plaisir !
Content que vous ayez une station météo fonctionnelle et que ce site ai pu vous aider !
Le site évolue avec de nouveaux capteurs dernièrement par exemple, n’hésitez pas à vous en inspirer !
Merci pour tous vos partages !
J’y puise de nombreux renseignements et me conforte sur plusieurs choix autour desquels j’hésitai.
Clair et précis, bravo pour votre pédagogie.
Paul
Bonsoir,
Merci, ca fait plaisir de voir que le travail aide les autres 🙂
Bonne lecture sur le site, n’hésitez pas si vous avez des questions.
Bonsoir Fabien
pourriez vous m aiguiller j ai fabriqué un magic mirror avec le module MMM-BME 280 voir le liens
https://github.com/awitwicki/MMM-BME280 j aimerais savoir ci il est possible de modifier la pression atmosphérique avec latitude et longitude de ma commune
en vous remerciant par avance
cordialement
Patrick
Bonsoir Patrick,
Je ne connais pas les magic mirror mais si il est capable de lire un fichier ou un script, c’est facile d’ecrire un script qui le fera. Restera qu’à l’afficher.
Sur mon site meteo, je donne les url et api pour recuperer des données meteo (https://meteo-four38.fr/sources.php).
Et je sais qu’avec darksky on peut en fonction de la localisation recuperer ces infos.
Pourquoi ne pas afficher la pression du bme280 ? Fiabilité ?
Bonjour Fabien
Merci de votre retour et vos commentaires , la valeur affiché par mon BME n est pas fiable il me donne 991,8 hPa alors que la valeur et de 1008 hPa .
j aimerais connaitre la bonne valeur pour raison de santé (pression de l oreille interne)
pour le script puis je me servir de celui trouvé sur votre site ,j utilise un Raspbery pi 3B+
Cordialement
Bonjour Patrick,
désolé du retard de ma réponse.
Avez vous bien fait la compensation avec l’altitude de chez vous ?
Et aussi est-ce que la température du BME est correcte (car elle est incluse dans la compensation de l’altitude) ?
Je ne vois que ces deux points à vérifier.
Avez vous utilisez mon script dans cet article ?
Merci
Fabien
Bonjour,
est-ce que le code complet est disponible sur vote github. La correction de la pression est intéressante
merci
Bonjour
Desole du retard de reponse.
Oui le code complet de la station est dispo sur mon github : https://github.com/doddyfab
La station complete : https://github.com/doddyfab/Arduino_StationMeteoPro/blob/master/station_meteo_pro/station_meteo_pro.ino
Bonjour, je viens de voir dans votre code sur github qu’il y a à un moment ou vous utilisez le bmp.get et à un autre endroit le bme.read.
Est-ce normal?
Le get permet d’initialiser la connexion au module et le read de lire la valeur.