Baromètre et altimètre de grande précision


Composants utilisés
- 1 capteur de pression BMP-85
- 1 carte Arduino Uno
- Câbles de branchement mâle / femelle Dupont
- on peut lui ajouter un écran LCD à 2 lignes et quelques boutons
Principe de fonctionnement
Ce capteur de haute précision à basse consommation peut mesurer la pression atmosphérique de 300 à 1100 hPa avec une précision absolue de 0.03 hPa.
Ceci correspond à des altitudes de -500 m à +9000 m.
Ce module mesure également la température.
Il fonctionne avec une technologie de mesure piezzo-résistive. Une E²PROM stocke 176 bits de calibrage, chaque capteur étant calibré individuellement en usine. Un convertisseur analogique/numérique retourne la pression (16 à 19 bits) et la température (16 bits).
L'interfaçage se fait sur un bus I2C vers un micro contrôleur, avec 2 fils.
Alimentation entre 1.8 et 3.6V.
Calcul de l'altitude à partir de la pression
Une baisse de pression de 1 hPa correspond à un changement de 8.43m d'altitude au niveau de la mer.
Réciproquement, 10 m de dénivelée correspondent à 1.2 hPa.
La relation pression / altitude n'est pas linéaire.
On utilise la formule suivante
Altitude = 44330 *[1-(p/p0)^(1/5.255)] en m

Ceci permet d'utilise ce module en altimètre.
Quelques ordres de grandeur usuels
La pression normale au niveau de la mer est de p0=1013.245 hPa (soit environ 1000 mBar = 1 bar)..
Dans un parapente, la sur-pression est d'environ 5kg/m2 soit 0.5 mbar (= 50 Pa).
1 Pa = 0.01 hPa = 1 N/m2 ( = 0.01 mBar ) ( = 8.43 cm d'altitude)
1 Bar = 10^5 Pascal = 100 kPa =100 kN/m2 = 10 N/cm2
1 bar correspond environ à 1 kgf/cm2 (à 2% près).
Tableau de conversion des unités de pression

http://www.atomer.fr/1/1_Unites-de-pression.html
Caractéristiques techniques
- Basse consommation 5 µA avec 1 mesure/sec en mode standard
- Forte précision (calibrage en usine) :
0.06 hPa (0.5m) en mode très basse consommation (6 PA)
0.03 hPa (0.25m) en mode très haute résolution (3 PA) - Durée de conversion de la température 3ms, de la pression de 4.5 à 25.5 ms selon la résolution demandée.
- Résolution d'affichage de 0.01 mPa et 0.1°C
Réglage du mode

On peut échantillonner à 128 /sec (mode standard), mais une mesure de température par seconde suffit.
Commande du module
lire : 0xEF , ou écrire : 0xEE.
Utilisations
Dans les GPS (altimètre), téléphones mobiles, sports de plein air, stations météorologiques, baromètres, altimètres et variomètres de parapente


Branchements
- Résistances de pull up de 4.7k pour l'I2C (SDA bidirectionnel, et SCL entrée horloge).
- Le reset XCLR est low active (pull up interne 120k), il peut être laissé flottant si non utilisé. Il peut servir à éteindre un capteur si on utilise deux en même temps (leur adresse i2c étant fixe).
- La broche de sortie EOC (End Of Conversion) passe à 1 quand c'est prêt.


- VCC --> Alimentation 1.8 à 3.6V (attention, pas en 5V !)
- GND --> Gnd
- EOC Output, End Of Conversion -->nc
- XCLR master clear, low active --> nc
- SCL Serial Clock I/O --> pin A5
- SDA Serial Data I/O --> pin A4


Code de programmation
Ce programme mesure la pression et la température et les affiche (utilisation fixe en baromètre)
Il convertit en altitude les données (utilisation mobile en altimètre)
- Code: Tout sélectionner
//************************************************
// Demo du capteur de pression BMP085
// Mesure de pression et de température (baromètre)
// Conversion en altitude (altimètre)
// Rolland - tiptopboards.com mars 2013
// modif 06 09 2013
//************************************************
#include "Wire.h"
#include "Adafruit_BMP085.h"
Adafruit_BMP085 bmp;
//==== Branchements du module BMP085 avec 4 fils :
// GND sur la masse de l'Arduino
// +3.3 sur le +3.3 de l'Arduino
// SDA (=data) vers AnalogPin4
// SCL (=clock) vers AnalogPin5
//
// Pas besoin de brancher CLR (reset) ni OEC (end of conversion)
// Mais EOC peut servir si on cherche à accélérer son code Arduino
void setup() {
Serial.begin(9600); //Port série
bmp.begin();
}
void loop() {
Serial.print("Temperature = "); //En degrés Celsius (SI)
Serial.print(bmp.readTemperature());
Serial.print(" *C");
Serial.print(" Pression = "); //En Pascal (SI)
//Serial.print(bmp.readPressure());
// Serial.print(" Pa ");
//Pour convertir vers d'autres unités de pression voir
//http://www.engineeringtoolbox.com/pressure-units-converter-d_569.html
// 1 Pa = 10-5 bar = 0.0075 mm Hg = 9.87.10-6 atm
float PressionPascal;
float PressionAtm;
float PressionHg;
PressionPascal = bmp.readPressure(); //Lire le capteur
PressionAtm = PressionPascal*9.81*0.000001;
PressionHg = PressionPascal*0.0075;
Serial.print(PressionPascal);
Serial.print(" Pa ");
Serial.print(PressionAtm);
Serial.print(" Atm ");
Serial.print(PressionHg);
Serial.print(" mm Hg ");
Serial.print(" Altitude = ");
//On présume avoir 1013,25 hPa au niveau de la mer
Serial.print(bmp.readAltitude(101325));
Serial.println(" metres");
delay(500); //2 mesures par seconde
}
Exemple de mesures
Dans le serial monitor, on affiche pression et altitude:

Grande précision de ce capteur
Dans cet exemple le capteur est utilisé en altimètre.
Il est posé sur un tabouret, puis tenu en hauteur, puis posé au sol, puis remis en hauteur, et reposé au sol.

On voit qu'il mesure très précisément ces micro-changements d'altitude (la hauteur du tabouret 46 cm est clairement distinguée du niveau du sol !)
Références
Le datasheet du BMP085 (fabriquant Bosh)
http://dlnmh9ip6v2uc.cloudfront.net/dat ... 000-06.pdf
Le tuto de sparkfun (en anglais)
https://www.sparkfun.com/tutorials/253
Exemple (en anglais)
http://bildr.org/2011/06/bmp085-arduino/