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 :

avant de la carte BME280, avec le capteur visible (le carré métallique avec un trou)

avant de la carte BME280, avec le capteur visible (le carré métallique avec un trou)

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 :

sortie du programme read_BME280 dans un terminal

sortie du programme read_BME280 dans un terminal

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)"
Réseaux sociaux