Abordons le grand classique qu'est la mesure de l'humidité et de la température à l'aide de sondes DHT.
Ces sondes existent en 2 modèles :
Les deux peuvent être alimentés à une tension allant de 3 à 5,5 volts avec une consommation maximum de 2,5mA pendant les acquisitions.
4 pattes sur ce composant, de gauche à droite :
Comme je l'ai déjà dit, le protocole utilisé ressemble au 1-wire par pas mal d'aspects mais ... est parfaitement incompatible avec ce dernier. De plus, pas d'adressage donc une seule sonde par broche : si vous voulez utiliser 2 sondes, il faudra 2 broches.
Il existe plusieurs librairies pour l'Arduino pour lire ce protocole : le plus connu étant le DHT.h d'Adafruit. Évidemment, je ne l'ai pas utilisé : non pas pour faire le rebelle, mais simplement car elle nécessite une couche d'abstraction qui me sera parfaitement inutile étant la seule sonde gérée par Adafruit. Je suis donc parti sur SimpleDHT qui se suffit à elle-même.
#include <SimpleDHT.h> // https://github.com/winlinvip/SimpleDHT SimpleDHT22 DHT; int pinDHT = 5; // Broche sur laquelle est connecté le DHT22
Rien de particulier à faire si ce n'est de paramétrer la console
void setup(){ Serial.begin(115200); // débuging delay(1000); // Le temps que ça se stabilise }
void loop(){ float temperature = 0; float humidite = 0; int err; if((err = DHT.read2(pinDHT, &temperature, &humidite, NULL)) != SimpleDHTErrSuccess){ Serial.print("Erreur de lecture, err="); Serial.println(err); } else { Serial.print("Sample OK: "); Serial.print(temperature); Serial.print(" *C, "); Serial.print(humidite); Serial.println(" RH%"); } ESP.deepSleep(3 * 1e6); }
Si on a la flemme de relier le GPIO16 avec la broche reset (ou si on utile un ESP-01), on peut remplacer le DeepSleep par un simple delay().
Le code complet sur mon github.
Afin de vérifier la qualité des mesures fournies et accessoirement de tarer la sonde par rapport à ma référence, j'ai modifié le source pour y inclure une sonde DS18B20 et publier le tout par MQTT. Les mesures ont duré un peu plus de 12 heures et j'ai supprimé les valeurs extrêmes faussées par les manipulations que je faisais sur le montage.
DHT22 | DS18B20 | Hum | delta | Corrigé | Delta corrigé | |
Moyenne | 19,1851851852 | 19,3168783069 | 35,1968253968 | -0,1316931217 | 19,3168783052 | -1,69312083694759E-09 |
Erreur standard | 0,0925696245 | 0,0921524017 | 0,0499290545 | 0,0067398428 | 0,0925696245 | 0,0067398428 |
Mode | 20,1 | 20,29 | 34,8 | -0,19 | 20,23169312 | -0,05830688 |
Médiane | 19,4 | 19,6 | 34,9 | -0,13 | 19,53169312 | 0,00169312 |
Premier quartile | 17,9 | 18,04 | 34,7 | -0,19 | 18,03169312 | -0,05830688 |
Troisième quartile | 20,2 | 20,35 | 35,8 | -0,05 | 20,33169312 | 0,08169312 |
Variance | 1,6195665879 | 1,6050003096 | 0,4711600811 | 0,008585416 | 1,6195665879 | 0,008585416 |
Écart type | 1,2726219344 | 1,2668860681 | 0,6864110147 | 0,0926575197 | 1,2726219344 | 0,0926575197 |
Kurtosis | -1,4410391472 | -1,5029614956 | 0,7858373792 | -0,6079688943 | -1,4410391472 | -0,6079688943 |
Asymétrie | 0,0052244863 | -0,0934248594 | 1,075834551 | -0,1935277207 | 0,0052244863 | -0,1935277207 |
Plage | 4 | 3,88 | 3,3 | 0,44 | 4 | 0,44 |
Minimum | 17,2 | 17,35 | 34,1 | -0,34 | 17,33169312 | -0,20830688 |
Maximum | 21,2 | 21,23 | 37,4 | 0,1 | 21,33169312 | 0,23169312 |
Somme | 3626 | 3650,89 | 6652,2 | -24,89 | 3650,88999968 | -0,00000032 |
Nombre | 189 | 189 | 189 | 189 | 189 | 189 |
Avec une plage d'erreur de 0,44°C par rapport à ma référence, le résultat n'est pas mal. J'ai peut-être juste remarqué qu'il y avait un peu plus d'inertie par rapport à une DS18B20 mais sinon, c'est correct.
La technologie de mesure d'humidité nécessite une compensation en température : les DHT font cette compensation ce qui fait que la valeur envoyée est directement utilisable.
J'ai trouvé plusieurs datasheets ... parfois avec des informations contradictoires : ainsi, il en va du bus qui, selon les sources, peut aller jusqu'à 20 ... ou 100 mètres !
Ajouter une capa de 100nF entre Vcc et la masse filtrera l'alimentation.
Après quelques mois d'utilisation en situation réelle et d'expérimentation, mon opinion sur ce circuit est plutôt mitigée :
Il faut faire très attention avec la mesure de l'humidité : si par malheur, de l'eau venait à s'introduire, le capteur est détruit et les mesures sont soit bloquées à 100%, soit completement foireuses (on "saute" quasiment de 20% d'humidité à 90% sans rapport avec l'humidité réelle). Evidement, rien n'indique de défaillance dans ce cas.
Par contre, la mesure de température reste fiable ... mais un DS18B20 est à la fois plus pratique et moins cher.
Le protocole utilisé est très pointilleux sur les timings : si ce n'est pas gênant avec des puces aussi rapides qu'un ESP8266, les lectures sont aléatoires avec un UNO (nombreuses erreurs de checksum) voir impossible avec un Tiny85.
Un SHT31 est du coup plus pratique et efficace.
Visitez : Nos sorties Ski et rando |
Copyright Laurent Faillie
2001-2024
N'oubliez pas d'entrer le mot de passe pour voir aussi les photos perso. |
Contactez moi si vous souhaitez réutiliser ces photos et pour les obtenir avec une plus grande résolution. |
Visites durant les 7 derniers jours au total. |
Vous pouvez
laissez un commentaire
sur cette page.