DHT22 et DTHT11 de face

DHT22 et DTHT11 de face

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

DHT11 en gros plan de face

DHT11 en gros plan de face

  • 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

DHT22 en gros plan de face

DHT22 en gros plan de face

  • 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 AM2302 possède 3 fils de 23mm au lieu des 4 connecteurs, et est un peu plus gros.

 

Le montage

Dans les trois cas, le câblage est très simple , il suffit de reproduire le schéma suivant :
connexion DHT11/22 arduino

connexion DHT11/22 arduino

Quand vous tenez le capteur face à vous (la partie avec la grille en face de vous), la broche la plus à gauche devra être connectée à l’alimentation du capteur, ici 5V (fil rouge), mais cela peut être 3.3V également. La seconde broche en partant de la gauche est la broche de données. Elle sera connectée à l’entrée utilisée pour lire les données sur le Arduino. Sur le schéma ici c’est la broche 8 (fil vert). Cette broche sera également connectée à une résistance de 4700 Ohms qui sera ensuite connectée à l’alimentation  du capteur (ici 5V). La troisième broche est laissée inutilisée. Enfin, la dernière broche, la plus à droite, sera connectée à la masse du circuit (fil noir). Il s’agit du même branchement pour un DHT11 et un DHT22.

Le programme

Il faudra tout d’abord installer la bibliothèque. Pour cela, deux solutions. Si vous avez une version récente de Arduino, vous pouvez utiliser le gestionnaire de bibliothèques. Il faudra cliquer sur Croquis dans l’IDE arduino, puis Include Library, puis Manage Libraries… pour ouvrir le gestionnaire. Dès lors vous pouvez chercher le paquet DHT sensor library, puis cliquer sur Install.
Une autre solution est de vous rendre sur le github de Adafruit dédié au capteurs DHT, puis cliquez sur Download ZIP avant de cliquer dans l’IDE Arduino sur Croquis, puis Include Library, puis Add .ZIP Library… et sélectionner l’archive téléchargée.

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 :

  1. Adafruit Unified Sensor Driver;
  2. Adafruit DHT Unified.

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 :

connexion DHT11/22 arduino avec LCD

connexion DHT11/22 arduino avec 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 :

montage DHT22 sur arduino avec LCD

montage DHT22 sur arduino avec LCD

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! 🙂

 

Réseaux sociaux