Mise en oeuvre du baromètre et thermomètre LPS22HH et programmation d’un altimètre barométrique

Cet exemple montre comment mesurer la température et la pression toutes les cinq secondes avec le capteur MEMS LPS22HH de STMicroelectronics.

Matériel requis

  1. La carte NUCLEO-WB55
  2. Une carte d’extension I2C équipée du capteur MEMS LPS22HH (par exemple la X-NUCLEO-IKS01A3)

Le code MicroPython

Les scripts présentés ci-après sont disponibles dans la zone de téléchargement

Le fichier lps22.py est la bibliothèque contenant les classes pour gérer ce capteur. Il doit être copié dans le répertoire du disque USB virtuel associé à la NUCLEO-WB55 : PYBFLASH.

Éditez maintenant le script main.py et copiez-y le code qui suit :

# Objet du script :
# Mesure la température et la pression toutes les cinq secondes. 
# Rapporte la pression au niveau de la mer sur la base de l'altitude du lieu.
# Cet exemple nécessite un shield X-NUCLEO IKS01A3 pour le baromètre MEMS LPS22.

from machine import I2C
import lps22 # Pilote du baromètre
import pyb # Pour piloter les LED
from time import sleep_ms

altitude_locale = 485 # en mètres

# Pression corrigée au niveau de la mer
def SeaLevelPressure(pressure, altitude):
	return pressure * pow(1.0 - (altitude * 2.255808707E-5), -5.255)
	
# On utilise l'I2C n°1 de la carte NUCLEO-WB55 pour communiquer avec le capteur
i2c = I2C(1)

# Pause d'une seconde pour laisser à l'I2C le temps de s'initialiser
sleep_ms(1000)

# Instanciation du capteur 
sensor = lps22.LPS22(i2c)

led_bleu = pyb.LED(1)
led_vert = pyb.LED(2)
led_rouge = pyb.LED(3)

while True:

	temp = round(sensor.temperature())
	press = round(SeaLevelPressure(sensor.pressure(),altitude_locale))

	print("Température : " + str(temp) + "°C, Pression : " + str(press) + " hPa : ", end = '')

	if temp > 25 :
		led_rouge.on()
		print("chaud")
	elif temp > 18 and temp <= 25 :
		led_vert.on()
		print("confortable")
	else:
		led_bleu.on() 
		print("froid")

	led_rouge.off()
	led_vert.off()
	led_bleu.off()
	
	sleep_ms(5000)

Programmer un altimètre avec le LPS22HH

Le baromètre intégré au LPS22HH est très précis et peut être utilisé pour estimer l’altitude ; nous allons donc montrer comment programmer un altimètre avec ce MEMS. La discussion et l’exemple qui suivent sont inspirés de cette source.

Les altimètres barométriques ne souffrent pas de la concurrence du GPS, ils sont majoritairement utilisés dans les instruments de vol des avions et par les alpinistes. On pourrait penser que l’altitude fournie par un GPS est plus précise que celle déduite d’un baromètre, mais, comme toujours ce n’est pas aussi simple. Les deux technologies ont des limites et des atouts qu’il convient de connaître pour sélectionner la plus appropriée selon votre projet.

  • L’erreur verticale rapportée par le système GPS peut atteindre jusqu’à 45 mètres du fait de perturbations diverses !
    Mais ce n’est pas tout. Pour déterminer votre altitude au-dessus du niveau de la mer ou du sol, le GPS se réfère à un modèle pour la forme de la surface terrestre, le plus utilisé étant WGS 84 (World Geodetic System - créé en 1984). Avec WGS 84 la Terre est approximée par un sphéroïde qui, comme toute approximation, introduit des erreurs. Ainsi, au Royaume Uni, WFS 84 vous placera en moyenne 70 m au-dessus du sol et en Inde, 100 m au-dessous !

    Le principal avantage du GPS, c’est que les informations qu’il rapporte ne sont pas perturbées par les conditions météo. Si vous mesurez l’altitude en un lieu donné par beau temps, vous obtiendrez peu ou prou le même résultat qu’un jour de tempête. Et, bien évidemment, si vous fournissez à votre récepteur GPS une carte d’élévation locale précise (une carte topographique IGN par exemple) pour se substituer à WGS 84, il vous donnera l’altitude exacte déterminée à partir la position (x, y) qu’il obtient sur celle-ci.

    La principale limitation des récepteurs GPS pour les applications embarquées est leur consommation. Un module GPS a besoin d’un courant de 45 mA alors qu’un baromètre MEMS ne nécessitera que 4 µA ; cela fait quand même un rapport 11250 en sa défaveur si on ne s’intéresse qu’à la détermination de l’altitude !

    Enfin, souvenez-vous qu’un récepteur GPS ne fonctionnera correctement que s’il est à l’extérieur et/ou équipé d’une antenne assez efficace pour recevoir les signaux d’au moins quatre satellites de sa constellation. C’est une contrainte très forte. Les altimètres barométriques, eux, fonctionnent aussi bien en intérieur qu’en extérieur, y compris dans des espaces clos et métalliques (à condition qu’ils ne soient pas pressurisés, comme l’est l’intérieur d’un avion de ligne).

  • L’erreur verticale déduite d’un baromètre MEMS est bien inférieure aux 45 mètres du GPS. Dans le cas du LPS22HH, la précision absolue est de 0.5 hPa, ce qui correspond à +/- 6 mètres d’erreur. Mais il est possible d’être encore plus précis en calibrant le baromètre avec la pression rapportée au niveau de la mer mise à disposition par les aérodromes de votre région.

    Un altimètre barométrique ne présente cependant pas que des avantages sur le GPS. Puisqu’il déduit l’altitude de la pression atmosphérique (ie du poids de la colonne d’air au-dessus de nos têtes) il est fortement perturbé par les conditions météorologiques. Si la météo devient mauvaise, la pression chutera et l’altimètre indiquera des valeurs surestimées. C’est pour compenser les variations rapides de la météo que les alpinistes recalibrent régulièrement leurs altimètres par référence à une carte topographique.

Le code MicroPython

Les scripts présentés ci-après sont disponibles dans la zone de téléchargement

Voici le script main.py qui pemettra de mesurer l’altitude avec le LPS22HH, en utilisant la “bonne formule” et la valeur du moment pour la pression de référence au niveau de la mer du lieu, donnée dans LocalSeaLevelPress et recupérée sur un site Internet. Cette formule donne une estimation correcte de l’altitude locale à quelques dizaines de centimètres près ! Bien sûr, cette précision bluffante ne peut être maintenue que si on met à jour LocalSeaLevelPress tout au long de la journée.

# Objet du script :
# Mesure l'altitude toutes les cinq secondes.
# Cet exemple utilise comme paramètre la valeur de la pression atmosphérique rapportée au niveau de la
# mer pour le lieu où vous vous trouvez au cours de la dernière heure (variable LocalSeaLevelPress).
# Cette valeur n'est pas constante et il sera nécessaire de l'ajuster d'heure en heure pour intégrer 
# l'évolution des conditions météorologiques locales et les compenser dans l'estimation de l'altitude.
# URL d'un site Internet qui donne les valeurs de LocalSeaLevelPress toutes les 10 minutes en France :
# https://www.infoclimat.fr/cartes/observations-meteo/temps-reel/pression-au-niveau-de-la-mer/france.html
# Cet exemple nécessite un shield X-NUCLEO IKS01A3 pour le baromètre MEMS LPS22.

from machine import I2C
import lps22
from time import sleep_ms

# Pression au niveau de la mer dans la région "en ce moment"
LocalSeaLevelPress = 1014.1 # en hPa

# Calcul de l'altitude
def getAltitude(pressure, sea_lvl_press ):
	return 44330.0*(1-pow((pressure)/(sea_lvl_press),1.0/5.255));
	
# On utilise l'I2C n°1 de la carte NUCLEO-WB55 pour communiquer avec le capteur
i2c = I2C(1)

# Pause d'une seconde pour laisser à l'I2C le temps de s'initialiser
sleep_ms(1000)

# Instanciation du capteur 
sensor = lps22.LPS22(i2c)

while True:

	# Temporisation de 5 secondes
	sleep_ms(5000)
	
	# Calcul de l'altitude intégrant la correction de pression
	altitude = getAltitude(sensor.pressure(), LocalSeaLevelPress)
	
	# Affichage sur le port série de l'USB USER
	print("Altitude : %.1f m" % altitude)