dimanche 1 novembre 2020

Mesurer la température et l'humidité relative avec un DHT22 (AM2302) et un Raspberry Pi

Le capteur DHT22 (aussi appelé AM2302) permet de mesurer l'humidité relative de l'air ainsi que la température ambiante. Nous l'utilisons aujourd'hui avec un Raspberry Pi programmé en Python. 


Le capteur comporte un condensateur dont la capacité dépend de l'humidité. Puisqu'il faut également connaître la température pour pouvoir calculer l'humidité relative, le DHT22 comporte également un capteur de température intégré.

J'ai utilisé un DHT22 qui est incorporé à un module comportant 3 broches: + , out et -. Ce module comporte déjà une résistance de tirage entre les broches + et OUT. Si ce n'est pas le cas pour le capteur que vous utilisez, il est recommandé de placer une résistance de 4,7 kΩ ou 10 kΩ environ entre DATA et VCC.

Pour ma part, j'ai branché mon module au Raspberry Pi de la façon suivante:
  • Broche + du DHT22: sortie 3,3 V du Raspberry Pi
  • Broche out du DHT22: broche GPIO 4 du Raspberry Pi
  • Broche - du DHT22: broche GND du Raspberry Pi

J'ai ensuite installé la bibliothèque d'Adafruit en tapant les 3 lignes suivantes dans le terminal:

pip3 install adafruit-blinka
pip3 install adafruit-circuitpython-dht
sudo apt-get install libgpiod2

Le script ci-dessous, inspiré d'un exemple fourni par Adafruit, affiche la température, l'humidité relative, le point de rosée et l'indice humidex.

-
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Mesure de la température et de l'humidité avec
un capteur DHT22 branché à un Rasbperry Pi.
Nécessite la bibliothèque d'Adafruit.
Pour plus d'infos:
https://electroniqueamateur.blogspot.com/2020/11/mesurer-la-temperature-et-lhumidite.html
'''
import time
import board
import adafruit_dht
import math
dhtDevice = adafruit_dht.DHT22(board.D4, use_pulseio=False)
while True:
try:
temperature = dhtDevice.temperature
humidite = dhtDevice.humidity
# calcul du point de rosée (formule de Heinrich Gustav Magnus-Tetens)
alpha = math.log(humidite / 100.0) + (17.27 * temperature) / (237.3 + temperature)
rosee = (237.3 * alpha) / (17.27 - alpha)
#calcul de l'humidex
humidex = temperature + 0.5555 * (6.11 * math.exp(5417.753 * (1 / 273.16 - 1 / (273.15 + rosee))) - 10)
print("Temperature: {:.1f} C Humidite: {}% Rosee: {:.1f} C Humidex: {:.1f}"
.format(temperature , humidite, rosee , humidex))
except RuntimeError as error:
#print(error.args[0])
continue
except Exception as error:
dhtDevice.exit()
raise error
time.sleep(2.0)
-

Si vous décommentez la ligne 38, un message d'erreur sera affiché en cas d'échec de la lecture du capteur. Dans mon cas, j'ai eu la surprise de constater qu'environ une lecture sur quatre échouait avec une de ces deux mentions: "A full buffer was not returned. Try again." ou encore "Checksum did not validate. Try again.".  Après avoir vainement tenté de trouver une façon d'éviter ces erreurs, j'ai fini par me résigner et à simplement ne pas afficher le message d'erreur. De toute façon, la température et l'humidité sont des paramètres qui varient lentement, on a donc tout le temps de reprendre notre mesure si elle a échoué.

À lire également:

J'ai déjà utilisé un DHT22 avec un Arduino Uno


Yves Pelletier (TwitterFacebook)

1 commentaire: