Station météorologique BME280

1.1.1        La théorie

Le BME280 est un circuit développé par Bosch, il concentre dans un même mini boitier un thermomètre, un mesureur de pression atmosphérique et un mesureur d’humidité. Il est surtout utilisé dans les stations météo intérieures et extérieures, des petits altimètres, l’automatisation de la ventilation ou de l’air conditionné, le sport…

Il peut mesurer la température entre -40 et  85° Celsius avec une précision d’un degré, la pression entre 300hPa et 1100hPa à +/- 1hPa et l’humidité entre 0 et 100%.

On peut le trouver comme d’habitude sur EBay pour moins de 5€.

1.1.2        L’électronique

JPEG - 99.3 ko

Il peut se connecter en SPI ou en I2C, accepte une tension d’alimentation jusqu’à 3.6V et consomme très peu de courant. Bosch fourni une documentation très complète avec Datasheet et même une librairie en C pour l’utilisation de l’appareil.

Les connections seront les suivantes :

Pour le SPI

BME280

Raspberry

VCC

3.3V : Pin 1 ou 17 (surtout pas le 5V)

GND

Masse : Pin 6, 9, 14, 30, 34 ou 39

SDI

SPI MOSI : Pin 19

SCK

SPI SCLK : Pin 23

CSB

SPI CE0/CE1 : Pin 24 ou 26

SDO

SPI MISO : Pin 21

 


 

Pour l’I2C

BME280

Raspberry

VCC

3.3V : Pin 1 ou 17 (surtout pas le 5V)

GND

Masse : Pin 6, 9, 14, 30, 34 ou 39

SDI

SDA : Pin 3

SCK

SCL : Pin 5

CSB

3.3V Pin 1 ou 17

SDO

Masse : adresse 0x76 ou 3.3V : adresse 0x77

 

Le positionnement entre l’I2C et le SPI se fait au démarrage par la broche CSB. Si CSB est à 0 au démarrage, c’est le SPI qui est activé, si CSB est à 1 ou en l’air, c’est l’I2C qui est activé. Il n’est pas possible de changer de mode en cour de fonctionnement.

1.1.3        Le logiciel

Le module comprend un certain nombre de registres afin d’assurer son fonctionnement.

Ces registres sont décrits dans le Datasheet.


 

Le Datasheet indique également les méthodes de lecture et d’écriture du module.

·         Ecriture I2C

Il faut envoyer :

·         Un octet comprenant l’adresse du module (0x76 ou 0x77) dans les 7 premiers bits et un 0 dans le dernier bit indiquant que nous voulons écrire.

·         Puis autant de fois que l’on veut des donner, deux octets comprenant le registre que l’on veut écrire et la valeur à écrire.

Lecture I2C

Il faut envoyer :

·         Un octet comprenant l’adresse du module (0x76 ou 0x77) dans les 7 premiers bits et un 0 dans le dernier bit indiquant que nous voulons écrire.

·         Un octet comprenant le premier registre à lire

·         Un octet comprenant l’adresse du module (0x76 ou 0x77) dans les 7 premiers bits et un 1 dans le dernier bit indiquant que nous voulons lire.

Puis lire autant d’octet que voulu.

 


 

Ecriture SPI

Il faut envoyer :

·         Un octet comprenant un premier bit à 0 pour indiquer que l’on veut écrire puis les sept derniers bits du numéro du registre dans lequel on veut écrire.

·         L’octet de donnée à écrire

Faire cela autant de fois qu’il y a de registres à écrire

 

Lecture SPI

Il faut envoyer :

·         Un octet comprenant un premier bit à 1 pour indiquer que l’on veut lire puis les sept derniers bits du numéro du registre dans lequel on veut lire.

Puis lire autant d’octet que voulu.

Les méthodes permettant d’avoir la température, la pression et l’humidité avec la compensation mémorisée dans le module sont très complexes et sont données dans le Datasheet au chapitre 10.

En pratique, les librairies permettant la gestion du module comprendront une partie commune pour les fonctionnalités et deux parties spécifiques pour la lecture du module en I2C et en SPI.

La partie commune sera une classe abstraite qui ne sera pas utilisable seule, elle devra obligatoirement être étendue par l’un des modules I2C ou SPI qui contiendront les fonctions de lecture et d’écriture dans les registres du module ainsi que les constructeurs.

Les principales fonctions disponibles seront les suivantes :

-          Des fonctions permettant de lire l’identifiant du module, de faire un Reset, de régler la finesse des mesures en fonction de l’utilisation.

-          Une fonction permettant de lire toutes les mesures en même temps afin d’avoir des mesures de température, pression et humidité cohérente entre elles. Cette fonction devra être appelée avant tout utilisation ou affichage des mesures (getAllMesures).

-          Une fonction donnant la température (getTemperature).

-          Deux fonctions donnant directement la pression mesurée (getPressurePa, getpressureHectoPa).

-          Une fonction donnant l’humidité (getHumidity).

-          Une fonction donnant l’altitude. Toutefois, cette fonction n’est valable que si la pression au niveau de la mer est de 1013hPa (getAltitude).

-          Une fonction donnant l’altitude en fonction de la pression au niveau de la mer (getCompensedAltitude). C’est cette fonction qui peut être employée pour utiliser le module en altimètre.

-          Deux fonctions donnant la pression au niveau de la mer en fonction de l’altitude de votre point de mesure. C’est cette pression qui est donnée dans les bulletins météo.


Par exemple lorsqu’on voit une carte comme celle-ci, il est impossible qu’une ville à plus de 1000m d’altitude ait une pression de 1017,5hPa. Cette pression est celle qu’aurait la ville si elle était au niveau de la mer.

-         
Pour comprendre les formules utilisées, deux sites l’un en français, l’autre en anglais, m’ont bien aidé.

Voici la liste des fichiers sources et leur utilité.

Fichier

Utilité

GestionBME280.h

Entête de la librairie des fonctions principales

GestionBME280.cpp

Librairie des fonctions principales

GestionSPI.h

Entête de gestion des fonctionnalités SPI

GestionBME280Spi.h

Entête de la librairie des fonctions spécifiques pour le SPI

GestionBME280Spi.cpp

Librairie des fonctions spécifiques pour le SPI

GestionBME280I2c.h

Entête de la librairie des fonctions spécifiques pour l’I2C

GestionBME280I2c.cpp

Librairie des fonctions spécifiques pour l’I2C

tstBME280Spi.cpp

Programme de test pour le câblage en SPI

tstBME280I2c.cpp

Programme de test pour le câblage en I2C

 

Voici les deux commandes permettant la compilation des programmes de test, suivant que le module est câblé en SPI ou en I2C

En le résultat de l’exécution :

 


 

1.1.4        Liste des programmes

https://github.com/montotof123/raspberry/blob/master/291_BME280/GestionBME280.h

https://github.com/montotof123/raspberry/blob/master/291_BME280/GestionBME280.cpp

https://github.com/montotof123/raspberry/blob/master/291_BME280/GestionSPI.h

https://github.com/montotof123/raspberry/blob/master/291_BME280/GestionBME280Spi.h

https://github.com/montotof123/raspberry/blob/master/291_BME280/GestionBME280Spi.cpp

https://github.com/montotof123/raspberry/blob/master/291_BME280/GestionBME280I2c.h

https://github.com/montotof123/raspberry/blob/master/291_BME280/GestionBME280I2c.cpp

https://github.com/montotof123/raspberry/blob/master/291_BME280/tstBME280I2c.cpp

https://github.com/montotof123/raspberry/blob/master/291_BME280/tstBME280Spi.cpp

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Lien vers la base du site.