Où sommes nous ?

Retour

Mesure d'humidité par un DHT22

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.

Connexion

4 pattes sur ce composant, de gauche à droite :

  1. Vcc de 3 à 5 volts donc. Il est souvent indiqué que la précision sera meilleure avec une alimentation de 5v ... ce que nous ne ferons pas comme nous allons le voir avec ...
  2. DT - les données : comme avec un bus 1-wire avec lequel il n'est pas compatible, il s'agit d'une sortie à collecteur ouvert nécessitant donc une résistance de pull-up. En théorie, il est donc possible d'avoir le Vcc à 5 volts et un signal compatible avec l'ESP en connectant la dite  résistance vers le 3v ... sauf que le DHT22 dispose généralement (à vérifier donc) en interne d'une telle résistance. Bref, pour ne pas rajouter un composant externe inutile, et m'assurer par la même de ne jamais dépasser ce qui est acceptable par les GPIOs de l'ESP, tout le monde sera alimenté en 3,3 volts.
  3. broche non utilisée et à ne pas connecter. Dans certain datasheet (mais pas tous), il est indiqué qu'elle est connectée aussi à la masse. Laissons-la en l'air.
  4. GND

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.

Programmons l'ESP

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.

Paramétrage

#include <SimpleDHT.h>	// https://github.com/winlinvip/SimpleDHT

SimpleDHT22 DHT;
int pinDHT = 5;	// Broche sur laquelle est connecté le DHT22

setup()

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
}

loop()

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.

Tarage de la sonde

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.

Pour aller plus loin

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.


Visitez :
La liste de nos voyages
Nos sorties Ski et rando
Copyright Laurent Faillie 2001-2018
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 Nombre de visites au total.

Vous pouvez laissez un commentaire sur cette page.