Skip to Content

Comment utiliser les capteurs DHT11 et DHT22 avec Arduino

Comment utiliser les capteurs DHT11 et DHT22 avec Arduino

Dans ce tutoriel, vous apprendrez comment DHT11 et DHT22/AM2302 fonctionnent les capteurs numériques de température et d’humidité, et comment les utiliser avec Arduino. Ces capteurs sont très populaires pour les projets d’électronique DIY et sont parfaits pour les stations météo à distance, les projets de domotique et les systèmes de surveillance des plantes/jardin.

Dans cet article, j’ai inclus des schémas de câblage et plusieurs exemples de code pour que vous puissiez commencer à expérimenter avec votre capteur. Après chaque exemple, j’explique en détail le fonctionnement du code, vous n’aurez donc aucun problème à le modifier selon vos besoins.

Nous commencerons par examiner la bibliothèque Adafruit DHT. Ensuite, je vous montrerai comment combiner le capteur avec un écran LCD 16×2 pour créer une station météo simple.

Fournitures

Composants matériels

4 pin DHT11 sensor× 1Amazon
4 pin DHT22/AM2302 sensor× 1Amazon
3 pin DHT11 sensor (recommandé)× 1Amazon
3 pin DHT22/AM2302 sensor (recommandé)× 1Amazon
5 – 10 kΩ resistor (uniquement pour les capteurs 4 broches)× 1Amazon
Arduino Uno Rev3× 1Amazon
Breadboard× 1Amazon
Jumper wires~ 10Amazon
USB cable type A/B× 1Amazon
16×2 character I2C LCD (optionnel)× 1Amazon

Logiciel

Arduino IDEArduino IDE

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Comment fonctionnent les capteurs de température et d’humidité DHT11 et DHT22/AM2302 ?

Si vous ouvrez un DHT11 ou DHT22/AM2302 capteur, vous verrez qu’il contient deux éléments de détection : un élément de détection d’humidité et un NTC (thermistance).

L’élément de détection d’humidité est composé de deux électrodes avec un substrat absorbant l’humidité entre elles. Le capteur mesure la résistance entre les électrodes, qui varie selon la quantité d’humidité dans l’air.

Au dos du capteur, vous trouverez un petit circuit intégré qui mesure et traite le signal analogique. Il stocke également les coefficients d’étalonnage et effectue la conversion analogique-numérique.

Qu’est-ce que l’humidité relative ?

Lorsque vous consultez la fiche technique des capteurs DHTxx, vous verrez qu’ils mesurent l’humidité relative (HR) de l’air et non l’humidité absolue. Mais quelle est la différence ? L’humidité absolue est la quantité de vapeur d’eau dans l’air (exprimée en g/m³), indépendamment de la température. L’humidité relative tient compte de la température.

L’humidité relative est le rapport entre la quantité réelle de vapeur d’eau présente dans l’air et la quantité maximale de vapeur d’eau que l’air peut contenir à une température donnée.

L’air chaud peut contenir plus d’eau que l’air froid. Cela signifie que pour la même quantité de vapeur d’eau dans l’air, l’humidité relative dans l’air frais sera plus élevée que dans l’air chaud. À 100 % d’humidité relative, l’air est saturé et atteint son point de rosée.

Spécifications du DHT11

Tension de fonctionnement3,3 – 5,5 V
Courant de fonctionnementMesure : 0,3 mA, veille : 60 μA
Plage de mesure d’humidité5 – 95 % HR ± 5 % HR
Plage de mesure de température-20 – 60 °C ± 2 °C
Protocole de communication1-Wire
Période d’échantillonnage> 2 secondes
Dimensions du boîtier15,5 x 12 x 5,5 mm
Dimensions des broches8 mm de longueur, espacement de 2,54 mm
AvantageCoût ultra bas
CoûtCheck price

Pour plus d’informations, vous pouvez consulter la fiche technique ci-dessous :

Spécifications du DHT22/AM2302

Tension de fonctionnement3,3 – 5,5 V
Courant de fonctionnementMesure : 0,5 mA, veille : 15 μA
Plage de mesure d’humidité0 – 99,9 % HR ± 2 % HR
Plage de mesure de température-40 – 80 °C ± 1 °C
Protocole de communicationProtocole bus 1-Wire
Période d’échantillonnage2 secondes
Dimensions du boîtier25 x 15 x 7 mm, trou de montage Ø 3 mm
Dimensions des broches7 mm de longueur, espacement de 2,54 mm
AvantagePlus précis
CoûtCheck price

Vous pouvez télécharger la fiche technique du DHT22/AM2302 ci-dessous :

Notez que le AM2302 est simplement une version câblée du capteur DHT22 avec 3 fils.

AM2302 Sensor
AM2302 Capteur

Comme vous pouvez le voir, les spécifications du DHT11 et du DHT22/AM2302 sont assez similaires. La principale différence est que le DHT22 est plus précis et possède une plage de mesure plus large. Le DHT11 est un peu plus petit que le DHT22 et est aussi moins cher.

L’avantage de ces capteurs est qu’ils sont interchangeables, ce qui signifie que vous pouvez simplement remplacer un DHT11 par un DHT22 ou inversement, le câblage est exactement le même. Vous n’aurez qu’à faire un petit changement dans le code, comme vous le verrez plus tard.

Câblage – Connexion des capteurs DHT11 et DHT22/AM2302 à Arduino Uno

Les schémas de câblage ci-dessous montrent comment connecter des capteurs de température et d’humidité à 3 ou 4 broches à l’Arduino Uno. Une résistance de tirage de 10 kΩ est nécessaire entre la ligne de signal et le 5 V pour garantir que le niveau du signal reste haut par défaut (voir la fiche technique pour plus d’informations).

DHT11-with-Arduino-UNO-wiring-diagram-schematic
Câblage du capteur DHT11 4 broches à Arduino Uno
DHT22-with-Arduino-UNO-wiring-diagram-schematic
Câblage du capteur DHT22 4 broches à Arduino Uno

Notez que le capteur DHT22/AM2302 est connecté exactement de la même manière que le DHT11. Les connexions sont également indiquées dans le tableau ci-dessous. J’ai numéroté les broches de 1 à 4 de gauche à droite lorsque les trous du capteur sont face à vous.

Connexions 4 broches DHT11 et DHT22

DHT11/DHT22Arduino
Broche 15 V
Broche 2Connecter à la broche digitale 2 et au 5 V via une résistance de 10 kΩ
Broche 3Non connecté
Broche 4GND

Vous pouvez aussi acheter les capteurs montés sur un petit PCB (capteurs 3 broches). Ces cartes breakout facilitent la connexion du capteur à l’Arduino et incluent déjà une résistance de tirage. Assurez-vous de vérifier l’étiquette du capteur, l’ordre des broches peut varier selon le fabricant.

DHT11-3-pin-with-Arduino-UNO-wiring-diagram-schematic
Câblage du capteur DHT11 3 broches à Arduino Uno

Connexions 3 broches DHT11

DHT11 3 brochesArduino
sBroche digitale 2
+5 V
GND

Les exemples de code ci-dessous utilisent la broche digitale 2 pour recevoir les données du capteur, mais vous pouvez la changer pour n’importe quelle broche digitale de votre choix.

DHT22-3-pin-with-Arduino-UNO-wiring-diagram-schematic
Câblage du capteur DHT22 3 broches à Arduino Uno

Connexions 3 broches DHT22/AM2302

DHT22 3 brochesArduino
DATBroche digitale 2
VCC5 V
GNDGND

Installation des bibliothèques Arduino requises

Le code ci-dessous utilise la bibliothèque Adafruit DHT sensor que vous pouvez télécharger depuis GitHub. Cette bibliothèque ne fonctionne que si vous avez également installé la bibliothèque Adafruit Unified Sensor qui est aussi disponible sur GitHub.

Vous pouvez aussi télécharger les deux bibliothèques en cliquant sur les boutons ci-dessous :

Vous pouvez installer la bibliothèque en allant dans Sketch > Include Library > Add .ZIP Library dans l’IDE Arduino.

Une autre option est de naviguer vers Tools > Manage Libraries… ou de taper Ctrl + Shift + I sous Windows. Le gestionnaire de bibliothèques s’ouvrira et mettra à jour la liste des bibliothèques installées.

Installing an Arduino library step 1 open Library Manager
Gestionnaire de bibliothèques

Vous pouvez rechercher ‘dht’ et ‘adafruit unified sensor’ et chercher la bibliothèque d’Adafruit. Sélectionnez la dernière version puis cliquez sur Installer.

Installing an Arduino library step 2 DHT Adafruit
Installation de la bibliothèque DHT Adafruit

Exemple de code Arduino pour capteur de température et d’humidité DHT11/DHT22

Vous pouvez téléverser le code exemple suivant sur votre Arduino avec l’IDE Arduino. Ensuite, j’expliquerai le fonctionnement du code.

Vous pouvez copier le code en cliquant sur le bouton en haut à droite du champ de code.

/* Arduino example code for DHT11, DHT22/AM2302 
   and DHT21/AM2301 temperature and humidity sensors. 
   www.www.makerguides.com */

#include "Adafruit_Sensor.h"
#include "DHT.h"

// Set DHT pin:
#define DHTPIN 2

// Set DHT type, uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Initialize DHT sensor for normal 16mhz Arduino:
DHT dht = DHT(DHTPIN, DHTTYPE);

void setup() {
  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);

  // Setup sensor:
  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements:
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

  // Read the humidity in %:
  float h = dht.readHumidity();
  // Read the temperature as Celsius:
  float t = dht.readTemperature();
  // Read the temperature as Fahrenheit:
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again):
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Compute heat index in Fahrenheit (default):
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius:
  float hic = dht.computeHeatIndex(t, h, false);


  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" % ");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" \xC2\xB0");
  Serial.print("C | ");
  Serial.print(f);
  Serial.print(" \xC2\xB0");
  Serial.print("F ");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" \xC2\xB0");
  Serial.print("C | ");
  Serial.print(hif);
  Serial.print(" \xC2\xB0");
  Serial.println("F");
}

Vous devriez voir la sortie suivante dans le moniteur série (Ctrl + Shift + M) :

DHT11 temperature and humidity sensor Serial Monitor output
Sortie du moniteur série

Explication du code

La première étape est d’inclure les bibliothèques Adafruit DHT et Unified Sensor.

#include "Adafruit_Sensor.h"
#include "DHT.h"

Ensuite, il faut définir la broche de connexion du DHT à l’Arduino et aussi spécifier le type de capteur DHT. Dans notre exemple, nous utilisons un capteur DHT11 connecté à la broche 2.

L’instruction #define sert à donner un nom à une valeur constante. Le compilateur remplacera toutes les références à cette constante par la valeur définie lors de la compilation du programme. Ainsi, partout où vous mentionnez DHTPIN, le compilateur le remplacera par la valeur 2 lors de la compilation.

// Set DHT pin:
#define DHTPIN 2

// Set DHT type, uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

Ensuite, vous devez créer une nouvelle instance de la classe DHT avec le type DHT approprié et la connexion. Pour cela, nous utilisons la fonction DHT(pin,type).

Dans ce cas, j’ai appelé le capteur ‘dht’ mais vous pouvez utiliser d’autres noms, comme ‘temperature_sensor’ ou ‘dht11’, etc. DHT temperature_sensor = DHT(DHTPIN, DHTTYPE);. Vous pouvez créer plusieurs instances de la classe DHT avec des noms, broches et types différents. Cela vous permet d’utiliser facilement 2 capteurs ou plus en même temps.

// Initialize DHT sensor for normal 16mhz Arduino:
DHT dht = DHT(DHTPIN, DHTTYPE);

Fonction setup

Dans la setup(), nous démarrons la communication série à un débit de 9600 bauds. Assurez-vous que le Moniteur Série est aussi réglé sur 9600 ! Nous initialisons aussi le capteur avec dht.begin().

void setup() {
  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);

  // Setup sensor:
  dht.begin();
}

Fonction loop

La loop() partie du code commence par un délai de 2 secondes. Ce délai permet au capteur de prendre les mesures. La fréquence maximale de mesure du DHT22 est toutes les 2 secondes, et celle du DHT11 est une fois par seconde.

// Wait a few seconds between measurements:
delay(2000);

Prendre des mesures de température et d’humidité est très simple car la bibliothèque inclut plusieurs fonctions. Pour obtenir une mesure d’humidité en ‘%’, vous pouvez utiliser la fonction readHumidity(). Ici, nous sauvegardons la mesure dans la variable ‘h’. Notez qu’elle est de type float.

Pour utiliser une fonction sur l’objet DHT, vous devez d’abord spécifier le nom que vous avez donné au capteur. Dans notre cas, c’est ‘dht’.

// Read the humidity in %:
float h = dht.readHumidity();

Prendre une mesure de température est tout aussi simple avec la fonction readTemperature().

// Read the temperature as Celsius:
float t = dht.readTemperature();

Si vous souhaitez obtenir la température en Fahrenheit au lieu de Celsius, vous avez deux options. Vous pouvez passer true à la fonction readTemperature, ou utiliser la fonction convert :

// Read the temperature as Fahrenheit:
float f = dht.readTemperature(true);
// Alternative, use convert function:
float f = dht.convertCtoF(t);

Ensuite, il y a une petite section de code qui vérifie si le capteur est correctement connecté et renvoie une mesure. Sinon, un message d’erreur s’affichera dans le Moniteur Série.

// Check if any reads failed and exit early (to try again):
if (isnan(h) || isnan(t) || isnan(f)) {
  Serial.println("Failed to read from DHT sensor!");
  return;
}

La bibliothèque inclut aussi une fonction qui calcule l’indice de chaleur en combinant les mesures de température et d’humidité. L’heat index est aussi appelé “température ressentie” ou “température apparente”.

// Compute heat index in Fahrenheit (default):
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius:
float hic = dht.computeHeatIndex(t, h, false);

Enfin, les mesures sont affichées sur le Moniteur Série. Notez que la ligne Serial.print(" \xC2\xB0"); sert à afficher le symbole degré.

Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(f);
Serial.print(" \xC2\xB0");
Serial.print("F ");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(hif);
Serial.print(" \xC2\xB0");
Serial.println("F");

Exemple de code pour capteur de température et d’humidité DHT11 et DHT22/AM2302 avec écran LCD I2C et Arduino

En combinant un capteur de température et d’humidité avec un petit écran LCD, vous pouvez créer une station météo économique.

Dans l’exemple suivant, j’utiliserai un écran LCD caractère I2C. Vous devrez faire quelques connexions supplémentaires à l’Arduino pour contrôler l’écran LCD 16×2. Le capteur DHT11 ou DHT22/AM2302 est connecté de la même manière qu’avant.

Le schéma de câblage ci-dessous montre comment connecter un écran LCD I2C à l’Arduino.

DHT11-with-I2C-LCD-and-Arduino-UNO-wiring-diagram-schematic
Schéma de câblage du capteur DHT11 avec écran LCD caractère 16×2 I2C et Arduino

Les connexions sont aussi indiquées dans le tableau suivant :

Connexions écran LCD I2C

Écran LCD I2CArduino
GNDGND
VCC5 V
SDAA4
SCLA5

Si vous n’utilisez pas un Arduino Uno, les broches SDA et SCL peuvent être à un autre emplacement. Un Arduino UNO avec la disposition R3 (brochage 1.0) possède aussi les broches SDA (ligne de données) et SCL (ligne d’horloge) près de la broche AREF. Consultez le tableau ci-dessous pour plus de détails.

CarteSDASCL
Arduino UnoA4A5
Arduino NanoA4A5
Arduino Micro23
Arduino Mega 25602021
Arduino Leonardo23
Arduino Due2021
Emplacements des broches I2C pour différentes cartes Arduino

Le code utilise la bibliothèque LiquidCrystal_I2C que vous pouvez télécharger depuis GitHub. Il inclut aussi la bibliothèque Wire.h qui permet de communiquer avec les périphériques I2C. Cette bibliothèque est généralement préinstallée avec l’IDE Arduino.

Le code ci-dessous est presque identique à celui d’avant, mais cette fois nous affichons la température et l’humidité sur l’écran LCD au lieu du Moniteur Série.

Vous pouvez copier le code en cliquant sur le bouton en haut à droite du champ de code.

/* Arduino example code for DHT11, DHT22/AM2302 
  and DHT21/AM2301 temperature and humidity sensors 
  with I2C LCD. More info: www.www.makerguides.com */

#include "Adafruit_Sensor.h"
#include "DHT.h"
#include "Wire.h"
#include "LiquidCrystal_I2C.h"

// Set DHT pin:
#define DHTPIN 2

// Define SDA and SCL pin for LCD:
#define SDAPin A4 // Data pin
#define SCLPin A5 // Clock pin

// Set DHT type, uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Initialize DHT sensor for normal 16mhz Arduino:
DHT dht = DHT(DHTPIN, DHTTYPE);

// Connect to LCD via I2C, default address 0x27 (A0-A2 not jumpered):
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); //Change to (0x27,20,4) for 2004 LCD

void setup() {
  // Setup sensor:
  dht.begin();

  // Initiate the LCD:
  lcd.init();
  lcd.backlight();
}

void loop() {
  // Wait a few seconds between measurements:
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

  // Read the humidity in %:
  float h = dht.readHumidity();
  // Read the temperature as Celsius:
  float t = dht.readTemperature();
  // Read the temperature as Fahrenheit:
  float f = dht.readTemperature(true);

  // Compute heat index in Fahrenheit (default):
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius:
  float hic = dht.computeHeatIndex(t, h, false);


  // Print the temperature and the humidity on the LCD:
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(t);
  lcd.print(" " "\xDF" "C");
  lcd.setCursor(0, 1);
  lcd.print("Humid: ");
  lcd.print(h);
  lcd.print(" %");
}

Guide de dépannage DHT11/DHT22

Lorsque vous travaillez avec ces capteurs, vous pouvez rencontrer les messages d’erreur suivants :

“Failed to read from DHT sensor!”

Ce message peut apparaître dans le moniteur série lorsque le capteur ne renvoie pas de mesure. Cela peut avoir plusieurs causes :

  • Type de capteur : Assurez-vous d’avoir décommenté le bon DHTTYPE dans le code. Vérifiez l’exemple ci-dessus.
  • Fréquence d’échantillonnage : Les capteurs DHT sont assez lents, la fréquence maximale d’échantillonnage est d’environ 2 secondes. Augmenter le délai entre les mesures peut résoudre cette erreur.
  • Alimentation : Bien que les capteurs DHTxx fonctionnent de 3,3 à 5 V, le fabricant recommande 5 V. Dans certains cas, alimenter le capteur en 5 V résout le problème. Assurez-vous que votre microcontrôleur supporte aussi 5 V sur les broches GPIO.

« Fatal error: Adafruit_Sensor.h: No such file or directory »

Vous pouvez obtenir cette erreur lors de la compilation du code. Cela signifie que vous n’avez pas (correctement) installé la bibliothèque Adafruit Unified Sensor .

Remontez un peu dans ce post pour voir où et comment télécharger et installer la bibliothèque.

Conclusion

Dans cet article, je vous ai montré comment fonctionnent les capteurs de température et d’humidité DHT11 et DHT22/AM2302 et comment les utiliser avec Arduino.

J’espère que vous l’avez trouvé utile et instructif. Pour d’autres capteurs de température, consultez nos LM35 analog temperature sensor with Arduino et TMP36 analog temperature sensor with Arduino tutoriels.

Si vous avez des questions, des suggestions ou si vous pensez que certains points manquent dans ce tutoriel, n’hésitez pas à laisser un commentaire ci-dessous.