Le BME280 est le successeur du BMP185 et du BMP85. Ce composant permet de mesurer la température, la pression atmosphérique et l’hygrométrie (taux d’humidité dans l’air). La communication avec ce composant passe par l’omniprésent et très pratique bus I2C. Nous verrons ici comment utiliser le BME280 sur Raspberry pi.
La carte BME280 I2C
La carte en elle même est disponible sous de nombreuses formes, dont certaines très compactes.
Soudure/câbles
Voyons maintenant comment assembler la carte en un module utilisable. Pour cela, nous aurons besoin de quatre câbles de couleur (du 26AWG suffira largement), et d’un connecteur adapté. Une autre solution est d’utiliser des câbles dupont (jumper wire) femelle-femelle et d’en couper une moitié qu’on soudera sur la carte. Pour ma part j’utilise des KF2510 à 4 broches que je sertis sur mes câbles, car j’ai fait des cartes ayant les connecteurs correspondants.
On utilise l’I2C, donc reprenons notre convention habituelle :
- rouge (rouge) pour le VCC;
- noir (noir)pour la masse;
- jaune (jaune) pour SCL;
- vert (vert) pour SDA.
Les couleurs sont écrites une seconde fois entre parenthèses en noir pour les personnes ayant des difficultés à lire le texte coloré.
Il suffit donc de souder les câbles sur la carte comme indiqué au dessus. On obtient ainsi le résultat ci-dessous :
BME280 sur Raspberry pi : la pratique
Nous pouvons maintenant passer à l’utilisation du BME280 sur Raspberry pi, c’est à dire la partie spécifique : le logiciel. Comme d’habitude, nous utiliserons notre langage de prédilection : python. Au moment de l’écriture de ce billet, nous sommes en 2017, nous allons donc utiliser python3, bien que tout ceci fonctionne également avec python2.
Pour plus d’informations sur le programme read_bme280, je vous invite à consulter le projet github kbrownlees/bme280.
Installation des logiciels nécessaires
Nous aurons donc besoin de quelques logiciels :
- python3, l’interpréteur python 3
- pip3, un gestionnaire de paquets python 3
- python-smbus
- read_bme280, le programme qui communique avec le capteur.
Pour les trois premiers (python3,pip3 et python-smbus), c’est simple, il suffit d’un apt-get :
sudo apt install python3-pip python3-smbus
Pour python2 ce serait simplement ceci :
sudo apt install python-pip python-smbus
Dès lors, pour installer le programme read_bme280, rien de plus simple :
sudo pip3 install bme280
De même, pour python2, ce serait simplement ceci :
sudo pip install bme280
Utilisation de read_bme280 pour lire les valeurs du capteur
Maintenant que le programme est installé, son utilisation est très simple, puisqu’il suffit de lancer la commande read_bme280 :
read_bme280
On obtient ainsi une sortie affichant la température, pression et humidité.
Il est en outre possible de passer les paramètres –temperature, –pressure ou encore –humidity pour obtenir respectivement la température, pression et humidité uniquement.
Nous obtenons alors le résultat suivant :
Pour la version du programme que j’ai utilisée, il y a un caractère bizarre avec l’option –humidity, ce qui peut poser problème à certains programmes qui attendent une sortie ascii, je vais donc proposer un correctif à l’auteur.
Scripts munin
Munin est un outil de monitoring qui permet de collecter les mesures retournées par des sondes, et d’en faire des graphes. Il tourne très bien sur le Raspberry pi, et si on veut lire des sondes telles que le bme 280, il faut pour cela écrire des plugins. Je vous propose donc, suite à une requête dans les commentaires, mes plugins munin pour ce programme.
Les plugins ci dessous sont utilisés dans le cadre du projet Rlieh, un contrôleur d’écosystème fermé (aquarium, terrarium, vivarium, paludarium, etc…)
Humidité : plugin rlieh-bme280-humidity
#!/bin/sh case $1 in config) cat <<'EOM' graph_title Hygrometry graph_vlabel hygrometry hygrometry.label hygrometry hygrometry.info Ambiant air humidity graph_category Sensors graph_info Ambiant air humidity EOM exit 0;; esac CMD="/usr/local/bin/read_bme280" if [ -n "${I2C_ADDRESS}" ]; then CMD="${CMD} --i2c-address ${I2C_ADDRESS}" fi if [ -n "${I2C_BUS}" ]; then CMD="${CMD} --i2c-bus ${I2C_BUS}" fi printf "hygrometry.value " /usr/local/bin/read_bme280 | tail -n 2 | head -n 1 | cut -d' ' -f3
Pression : plugin rlieh-bme280-pressure
#!/bin/sh case $1 in config) cat <<'EOM' graph_title Atmospheric pressure graph_vlabel hPa pressure.label pressure graph_args --upper-limit 1050 --lower-limit 965 --base 1000 --rigid graph_scale no graph_category Sensors graph_info Atmospheric pressure in the room, measured by a BME280. pressure.info Atmospheric presure. EOM exit 0;; esac CMD="sudo /usr/local/bin/read_bme280 --pressure" if [ -n "${I2C_ADDRESS}" ]; then CMD="${CMD} --i2c-address ${I2C_ADDRESS}" fi if [ -n "${I2C_BUS}" ]; then CMD="${CMD} --i2c-bus ${I2C_BUS}" fi printf "pressure.value $(${CMD} | xargs | cut -d' ' -f1)"
Temperature: plugin rlieh-bme280-temperature
Ce dernier plugin, dans mon cas, ne retourne pas de valeurs, quand j’aurai trouvé pourquoi, je mettrai à jour (une autre version à fonctionné par le passé, donc c’est possible!).
#!/bin/sh case $1 in config) cat <<'EOM' graph_title Air temperature graph_vlabel celsius airtemp.label airtemp graph_args --base 1000 --lower-limit 21 --upper-limit 32 --rigid graph_scale no graph_category Sensors airtemp.warning 28 airtemp.critical 30 graph_data_size custom 1d, 1m for 3d, 5m for 1t, 15m for 1y update_rate 60 graph_info Air temperature in the air conditionned room EOM exit 0;; esac CMD="/usr/local/bin/read_bme280 --temperature" if [ -n "${I2C_ADDRESS}" ]; then CMD="${CMD} --i2c-address ${I2C_ADDRESS}" fi if [ -n "${I2C_BUS}" ]; then CMD="${CMD} --i2c-bus ${I2C_BUS}" fi printf "airtemp.value $(${CMD} | xargs | cut -d' ' -f1)"
pip3 n’existe pas sur Jessie. C’est quoi qu’il faut installer stp?
Hello,
sudo apt install python3-pip
et après pour lancer c’est simplement pip3 install nom_paquet
Super merci beaucoup ! C’est ce que j’avais fait !
Autre question : peux-tu me donner le numéro des PINs sur lesquels tu te connectes stp ? GND et 3,3V je vois mais SLD et SCA, je veux etre certain. Je vois :
– soit PIN 3 et PIN 5
– soit PIN 27 et PIN 28
du connecteur.
MErci
Effectivement, SDA et SCL sont sur les broches physiques numéro 3 et 5,
cad du côté de la carte µSD, la seconde et troisième broche de la rangée intérieure du connecteur de GPIO (en tenant la carte face à soi, µSD à gauche, HDMI vers soi, du coup seconde et troisième broche à gauche de la rangée la plus proche
comme ceci :
. . . . . . . . .
. x x . . . . . .
Salut,
C’est fait ayé et j’au maintenant cela comme erreur quand je lance le script :
Traceback (most recent call last):
File “/usr/local/bin/read_bme280”, line 11, in
sys.exit(main())
File “/usr/local/lib/python3.4/dist-packages/bme280/bme280.py”, line 212, in main
setup()
File “/usr/local/lib/python3.4/dist-packages/bme280/bme280.py”, line 187, in setup
bme280_i2c.write_byte_data(0xF2, ctrl_hum_reg)
File “/usr/local/lib/python3.4/dist-packages/bme280/bme280_i2c.py”, line 38, in write_byte_data
return bus.write_byte_data(i2c_address, cmd, value)
OSError: [Errno 121] Remote I/O error
Sais-tu pourquoi ?
Merci
Salut,
C’est bon j’ai réussi a faire ce que je voulais ! Par contre impossible d’en faire un script munin. Aurais-tu une idée de comment faire cela à partir de read_bme280 ?
Hello!
Content que tu aies pu faire ce que tu voulais!
Pour le script munin, tu as de la chance, je l’ai déjà fait 🙂
Donc je modifie l’article pour ajouter ça; par contre,je le mets quand même, mais la collecte de la température déconne, je le modifierai quand j’aurai trouvé pourquoi.
Je n’ai aucun soucis de la collecte de température me concernant…. On peut comparer nos scripts si tu veux.
Hello, j’ai posté mes scripts à la fin de l’article, ci dessus, je veux bien voir ton script pour la température, j’ai sans doute une connerie dans le mien (que j’ai également posté au dessus)
Salut,
Après réflexion, tu n’as pas de soucis avec –humidity et Munin ?
salut j’ai besoin trop urgent avec i2c et phyton une communication entre 4 capteurs et unité(carte arduino mega) avec lecture des valeurs de differents capteurs et avant la lecture il faut que chaque capteur identifie par code binaire sur 3 bits je sais pas comment faire aidez moi
salut j’ai besoin trop urgent avec i2c et phyton une communication entre 4 capteurs et unité(carte arduino mega) avec lecture des valeurs de differents capteurs et avant la lecture il faut que chaque capteur identifie par code binaire sur 3 bits je sais pas comment faire aidez moi
Hello
J’esssaye d’integrer une sonde bme280 et je n’y arrive pas. Elle n’est pas reconnue dans domoticz, du coup j’essaye programme et j’ai les memes erreurs que titibadevil qui avait trouvé la solution…. Un peu d’aide? Merci d’avance
pi@raspberrypi:~ $ read_bme280
Traceback (most recent call last):
File “/usr/local/bin/read_bme280”, line 11, in
sys.exit(main())
File “/usr/local/lib/python3.5/dist-packages/bme280/bme280.py”, line 212, in main
setup()
File “/usr/local/lib/python3.5/dist-packages/bme280/bme280.py”, line 187, in setup
bme280_i2c.write_byte_data(0xF2, ctrl_hum_reg)
File “/usr/local/lib/python3.5/dist-packages/bme280/bme280_i2c.py”, line 41, in write_byte_data
return bus.write_byte_data(i2c_address, cmd, value)
OSError: [Errno 121] Remote I/O error
uw7lat
863kh4
0lfrvw
fou2mb
ef1gm4
05g50v
gpm9vo
otm2ps
v254rj