Dans ce billet, nous poursuivons la construction de notre station météo. Cette fois ci, nous ajouterons la lecture de l’hygrométrie, à savoir le taux d’humidité dans l’air. Pour cela, l’un des composants les moins chers que j’ai pu trouver est le DHT11. Ce composant regroupe à la fois une sonde de température et un capteur d’humidité. Il existe une autre version, le DHT22 qui est plus précise et possède une plus large plage de fonctionnement, mais qui coûte environ le double du prix. Il existe également un capteur portant la référence AM2302, qui est en fait un DHT22 avec des fils au lieu de broches, et une résistance pull-up. Dans tous les cas, le montage présenté ici sera valable pour les trois, et le code similaire.
Avant tout, voyons rapidement les caractéristiques principales de ces capteurs :
Le DHT11
- Supporte une alimentation et des signaux de 3.3V ou de 5V;
- Consommation maximale de 2.5mA (lors de la collecte de données);
- Efficace pour 20-80% d’humidité, avec une précision de 5%;
- Efficace sur la plage 0 à 50°C avec une précision de 2°C;
- Fréquence maximale d’échantillonnage : 1Hz;
- Dimensions : 15.5mm x 12mm x 5.5mm.
Le DHT22
- Supporte une alimentation et des signaux de 3.3V ou de 5V;
- Consommation maximale de 2.5mA (lors de la collecte de données);
- Efficace pour 0-100% d’humidité, avec une précision de 2-5%;
- Efficace sur la plage -40 à 80°C avec une précision de 0.5°C;
- Fréquence maximale d’échantillonnage : 0.5Hz (une fois toutes les 2s);
- Dimensions : 27mm x 59mm x 13.5mm.
Le montage
Le programme
Code basique
Dans tous les cas, vous pourrez ouvrir l’exemple fourni en cliquant sur Fichier/Exemples/DHT Sensor Library/DHT tester, puis ajuster le fichier à votre montage:
// Basé sur le code de LadyAda traduit et modifie par moi, domaine public #include "DHT.h" #define DHTPIN 8 // broche ou l'on a branche le capteur // de-commenter le capteur utilise //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTPIN, DHTTYPE);//déclaration du capteur void setup() { Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); } void loop() { delay(2000); // La lecture du capteur prend 250ms // Les valeurs lues peuvet etre vieilles de jusqu'a 2 secondes (le capteur est lent) float h = dht.readHumidity();//on lit l'hygrometrie float t = dht.readTemperature();//on lit la temperature en celsius (par defaut) // pour lire en farenheit, il faut le paramère (isFahrenheit = true) : float f = dht.readTemperature(true); //On verifie si la lecture a echoue, si oui on quitte la boucle pour recommencer. if (isnan(h) || isnan(t) || isnan(f)) { Serial.println("Failed to read from DHT sensor!"); return; } // Calcul de l'indice de temperature en Farenheit float hif = dht.computeHeatIndex(f, h); // Calcul de l'indice de temperature en Celsius float hic = dht.computeHeatIndex(t, h, false); //Affichages : Serial.print("Humidite: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.print(" *C "); Serial.print(f); Serial.print(" *F\t"); Serial.print("Indice de temperature: "); Serial.print(hic); Serial.print(" *C "); Serial.print(hif); Serial.println(" *F"); }
Il suffit alors de compiler et téléverser, puis ouvrir le moniteur série (Outils/Moniteur série) et d’observer les mesures.
Mini projet avec un écran LCD
A ce point, il est facile de faire un mini projet, en rajoutant un écran LCD pour afficher les informations. Dans cet exemple, j’utilise un écran LCD de deux lignes de 40 caractères chacune, mais le principe est le même pour toutes les tailles, et les schémas utilisent un écran 2×16.
Bibliothèques
Nous continuerons à utiliser la bibliothèque DHT d’Adafruit, mais nous en rajouterons deux autres :
Vous pouvez chercher ces termes dans le gestionnaire de bibliothèques de l’IDE Arduino (Croquis/Include Library/Manage Libraries…) ou télécharger les archives et les ajouter à la main (Croquis/Include Library/Add .ZIP Library…). Ces bibliothèques nous apporteront une méthode unifiée d’accès aux capteurs, ce qui pourra servir par la suite si nous souhaitons ajouter d’autres capteurs à ce mini projet.
On utilisera également la bibliothèque LiquidCrystal qui est déjà fournie avec l’IDE Arduino.
Le câblage du LCD
Nous reprenons le schéma suivant, auquel nous ajoutons les connections vers l’écran LCD :
Pour plus d’explication, voir l’article sur l’écran LCD 40×2 utilisé ici, ou l’article sur le câblage d’un écran LCD sur un Arduino ou un ATMega328p.
Le code
// DHT Temperature & Humidity Sensor // Unified Sensor Library Example // Written by Tony DiCola for Adafruit Industries // Released under an MIT license. // Depends on the following Arduino libraries: // - Adafruit Unified Sensor Library: https://github.com/adafruit/Adafruit_Sensor // - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library #include <Adafruit_Sensor.h> #include <DHT.h> #include <DHT_U.h> #define DHTPIN 8 // Pin which is connected to the DHT sensor. #include <LiquidCrystal.h> //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) // See guide for details on sensor wiring and usage: // https://learn.adafruit.com/dht/overview DHT_Unified dht(DHTPIN, DHTTYPE); uint32_t delayMS; LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // on a remplace la ligne de depart qui etait LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { Serial.begin(9600); lcd.begin(40, 2); lcd.print(" www.nagashur.com/blog/ "); dht.begin();// Initialize device. Serial.println("DHTxx Unified Sensor Example"); // Print temperature sensor details. sensor_t sensor; dht.temperature().getSensor(&sensor); Serial.println("------------------------------------"); Serial.println("Temperature"); Serial.print ("Sensor: "); Serial.println(sensor.name); Serial.print ("Driver Ver: "); Serial.println(sensor.version); Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id); Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" *C"); Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" *C"); Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" *C"); Serial.println("------------------------------------"); // Print humidity sensor details. dht.humidity().getSensor(&sensor); Serial.println("------------------------------------"); Serial.println("Humidity"); Serial.print ("Sensor: "); Serial.println(sensor.name); Serial.print ("Driver Ver: "); Serial.println(sensor.version); Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id); Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println("%"); Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println("%"); Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println("%"); Serial.println("------------------------------------"); // Set delay between sensor readings based on sensor details. delayMS = sensor.min_delay / 1000; } void loop() { lcd.setCursor(0, 1); // Delay between measurements. delay(delayMS); // Get temperature event and print its value. sensors_event_t event; dht.temperature().getEvent(&event); if (isnan(event.temperature)) { Serial.println("Error reading temperature!"); } else { Serial.print("Temperature: "); Serial.print(event.temperature); Serial.println(" *C"); lcd.print("temperature : "); lcd.print(event.temperature); } // Get humidity event and print its value. dht.humidity().getEvent(&event); if (isnan(event.relative_humidity)) { Serial.println("Error reading humidity!"); } else { Serial.print("Humidity: "); Serial.print(event.relative_humidity); Serial.println("%"); lcd.print(" humidity : "); lcd.print(event.relative_humidity); } }
Dans mon cas, l’écran LCD est large (40 caractères) donc j’ai la place pour tout afficher, mais sur un 2×16, il faudra compresser les affichages, et/ou probablement afficher les données sur les deux lignes.
Voici le résultat obtenu :
Cela constituera une bonne base pour une mini station météo, ou un projet plus complet comme le projet Milapli. N’hésitez donc pas à rajouter des capteurs et des fonctionnalités! 🙂
Bonjour, c’est assez urgent, c’est pour mon projet de terminal,
j’ai suivit le même câblage et le même programme, j’ai bien installé la librarie, mais le message d’erreur s’affiche : “failed to read from dht sensor”
J’en appelle donc à votre aide, merci bcp.
super!
Bonjour, Tout d’abord, merci pour le tutoriel.
Je travaille présentement sur un projet qui sera installé à l’extérieur et j’ai pensé utiliser un DHT22 comme thermostat afin d’activer un relais de puissance qui a son tour activera un élément chauffant. Je voudrais donc inclure à la programmation un code ” if (la température est sous 0, actionner le relais). Comme je suis débutant dans le domaine, j’ai fais des essais mais sans résultats. Pensez-vous que vous pourriez m’aider ?
J’utilise un Arduino UNO.
Merci d’avance et bonne journée
Jacques
@Jacques Bedard :
Bonjour, c’est assez simple à faire. Le relais dispose généralement de 3 broches (en dehors du côté 220V).
On aura VCC, à connecter au 5V, GND à connecter à la masse, et signal à connecter à un GPIO.
On pourra ajouter en haut du code, dans les #define la ligne suivante (par ex, après la ligne 21) :
#define RELAY_PIN 2
Dans la fonction setup, on ajoutera la ligne suivante (par ex, après la ligne 35) :
pinMode(RELAY_PIN, OUTPUT);
et dans la loop, par exemple après la ligne 91 (avant l’accolade) :
if(event.temperature<0)//si moins de 0 degrés
{digitalWrite(RELAY_PIN, HIGH);}//allumage du chauffage
if(event.temperature>1)//si plus de 1 degré,
{digitalWrite(RELAY_PIN, LOW);} extinction du chauffage
Ainsi, on allume l’élément chauffant quand on passe en dessous de 0°C, et on l’éteint quand on repasse au dessus de 1°C.
On pourrait se contenter de couper le chauffage immédiatement au dessus de 0°C, mais généralement il faut une petite marge,
pour éviter que si la température oscille autour de la valeur seuil, l’appareil ne s’allume et s’éteigne en permanence.
Si le but est d’éviter le gel d’un système, alors il serait préférable d’augmenter les valeurs de quelques degrés, en fonction de l’inertie
thermique du système, par exemple de 2-3°C, pour que le chauffage s’active AVANT 0° et fasse en sorte que le système n’atteigne
jamais cette température. En restant le plus bas possible, on réduit la conso énergétique, mais on augmente le risque de gel.
Bonne continuation!
Bonjour, j’ai réalisé le cablâge et le code fourni mais j’ai le message d’erreur suivant :
In file included from C:\Users\jorda\OneDrive\Documents\Arduino\Code_DHT_22\Code_DHT_22.ino:2:0:
C:\Users\jorda\OneDrive\Documents\Arduino\libraries\arduino_349683/DHT_U.h:25:29: fatal error: Adafruit_Sensor.h: No such file or directory
#include
^
compilation terminated.
exit status 1
Erreur de compilation pour la carte Arduino/Genuino Uno
bonjour, dans le datashhet de adafruit ( https://cdn-shop.adafruit.com/datasheets/Digital+humidity+and+temperature+sensor+AM2302.pdf ), ils donnent une valeur de 1k a la resistance entre vcc et data, hors, dans quasiment ( si ce n’est tous) les tutos sur le cablage des dht22/am2302, la resistance est donné pour 4.7k.
serais pour une question de longueur de cable ( pour ma part, j’ai mis 1k comme valeur et il y a une legere difference de temperature ( 1°C)/humidité ( 4% ) par rapport mes sonde de reference (innovaley) )?
merci de m’eclairer de vos lumieres 🙂
Hello vincent,
En fait, la résistance c’est une pull-up. Le but, c’est de mettre VCC à l’état logique haut par défaut.
Le micro contrôleur fera alors une action pour passer l’état logique de haut à bas.
Du coup la valeur entre 1K, 4.7K et 10K n’a pas grande importance dans la plupart des cas, simplement ça aura un impact selon la capacitance du fil, mais sur les longueurs qu’on utilise ça n’aura pas d’impact.
Pour la différence de température de 1°C, et la diff d’humidité de 4%, il faut prendre en compte la précision du capteur.
Le DHT22 est donné pour + ou – 0.5°C, donc il est facile d’avoir 1°C d’écart avec une autre sonde, selon la précision de celle ci.
Idem, la précision sur l’hygrométrie est environ de 2-5%, donc 4% d’écart, ce n’est pas choquant, c’est dans la plage spécifiée…
Par contre, je vous invite grandement à vous intérésser à un autre capteur, le BME280, qui est plus compact, plus précis, fiable, et fonctionne en I2C : http://nagashur.com/blog/2017/06/25/bme280-sur-raspberry-pi-temperature-pression-et-humidite-en-i2c/
Le lien au dessus, c’est pour un Raspi, mais sous arduino c’est ultra-simple : il suffit de charger la bibliothèque adafruit BME280 ou celle de sparkfun, et l’exemple fonctionne tout de suite.
Gros avantage, ce capteur donne température, humidité ET pression atmosphérique. En théorie, les DHT22 sont bien, mais en pratique, j’ai constaté de fortes différences entre plusieurs exemplaires, ce que je n’ai pas avec les BME280… (meilleure répétabilité)
Et comme c’est de l’I2C, ça marche sur arduino, esp8266, esp32, raspberry pi, bref, partout, et ça ne bloque pas de GPIO, on peut donc mettre d’autres sondes I2C!
merci de votre reponse tres claire 🙂 je vais voir les bme280
ok
Bonjour Wilthien Jordan, le problème vient surement de ta librairie, pour remedier à ce problème j’ai du téléchargé la bibliothèque DHT mais avec une version antérieure, car avec les versions actuelles cela ne marche pas, bonne continuation !
Bonjour,
Ayant les mêmes besoins, je suis tombé sur votre page bien utile …. mais pour répondre @sky99 : j’ai testé les 2 : bme280 et dht22 et je fais le même constat quant à la “stabilité” des valeurs. Problème : J’ai besoin de plusieurs capteurs, or je ne vois pas comment mettre plusieurs bme280 sur le même bus i2c, ils ont tous la même adresse. Ai je une autre solution à laquelle je n’ai pas pensé ?
Michel
Hello michel,
Il y a sur les modules bme280 de petits pads qu’on peut souder pour les relier, qui permettent de changer l’adresse (voir la fiche produit bme280 sur adafruit, les explications s’y trouvent, et les chinois ont cloné leur cartes, donc valable aussi pour les versions aliexpress).
Sinon il existe des multiplexeurs I2C, qui permettent d’avoir plusieurs fois le même élément I2C avec la même adresse (voir ici par ex : https://learn.adafruit.com/adafruit-tca9548a-1-to-8-i2c-multiplexer-breakout/wiring-and-test )
[…] http://nagashur.com/blog/2013/06/18/lire-la-valeur-dune-sonde-de-temperature-et-d%e2%80%99hygrometri… […]
Bonjour, c’est assez urgent, c’est pour mon projet de terminal,
j’ai suivit le même câblage et le même programme, j’ai bien installé la librarie, mais le message d’erreur s’affiche : “failed to read from dht sensor”
help !!!!!!!!
seum
on ma fiche une erreur arduino/geuino uno pouvais vous maider sil vous plait
bonjour, j’ai monté un circuit pour activer l’arrosage de mon jardin, il fonctionne bien avec un microcontroleur Arduino. Je veux maintenant créer un circuit imprimé avec kicad. Mon problème, je n’arrive pas à trouver Arduino dans la bibliothèque kicad pouvez-vous m’aider? Merci par avance.
B. Fournier
Bonjour,
Pour ce projet, je ne trouve pas les bibliothèques ç ajouter, pouvez-vous me dire comment faire s’il vous plaît.
Très cordialement,
Alain