Le capteur DHT11 permet de mesurer la température et l’humidité ambiantes d’une pièce. Nous allons voir ici comment récupérer les mesures de ce capteur avec une carte Arduino.
Matériel
- Ordinateur
- Arduino UNO
- câble USB pour connecter l’Arduino à l’ordinateur
- Capteur DHT11
Câblage du capteur DHT11
Code
Le code pour récupérer les informations du capteur est compliqué et nécessite un peu de travail. Dans ce genre de cas, le plus simple est d’utiliser des librairies proposées par Arduino ou d’autres utilisateurs. Ces librairies peuvent être récupérées sur différents sites, notamment sur GitHub qui est la plateforme de partage par référence. Dans notre cas, nous récupérons la librairie sur le site Arduino.
Créer la librairie
Les librairies sont souvent disponibles en téléchargement libre sous forme de fichier ZIP qu’il faut extraire dans le dossier contenant les librairies de l’IDE Arduino ( le plus souvent .\Documents\Arduino\librairies). Pour utiliser le code brut d’une librairie copiée à partir d’un site, il nous faut créer deux fichiers .h et .cpp, dans un dossier DHT11Lib, dans lesquels nous allons copier les parties de code correspondantes.
dht11.h
// // FILE: dht11.h // VERSION: 0.4.1 // PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino // LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html) // // DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf // // URL: http://playground.arduino.cc/Main/DHT11Lib // // HISTORY: // George Hadjikyriacou - Original version // see dht.cpp file // #ifndef dht11_h #define dht11_h #if defined(ARDUINO) && (ARDUINO >= 100) #include <Arduino.h> #else #include <WProgram.h> #endif #define DHT11LIB_VERSION "0.4.1" #define DHTLIB_OK 0 #define DHTLIB_ERROR_CHECKSUM -1 #define DHTLIB_ERROR_TIMEOUT -2 class dht11 { public: int read(int pin); int humidity; int temperature; }; #endif // // END OF FILE //
dht11.cpp
// // FILE: dht11.cpp // VERSION: 0.4.1 // PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino // LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html) // // DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf // // HISTORY: // George Hadjikyriacou - Original version (??) // Mod by SimKard - Version 0.2 (24/11/2010) // Mod by Rob Tillaart - Version 0.3 (28/03/2011) // + added comments // + removed all non DHT11 specific code // + added references // Mod by Rob Tillaart - Version 0.4 (17/03/2012) // + added 1.0 support // Mod by Rob Tillaart - Version 0.4.1 (19/05/2012) // + added error codes // #include "dht11.h" // Return values: // DHTLIB_OK // DHTLIB_ERROR_CHECKSUM // DHTLIB_ERROR_TIMEOUT int dht11::read(int pin) { // BUFFER TO RECEIVE uint8_t bits[5]; uint8_t cnt = 7; uint8_t idx = 0; // EMPTY BUFFER for (int i=0; i< 5; i++) bits[i] = 0; // REQUEST SAMPLE pinMode(pin, OUTPUT); digitalWrite(pin, LOW); delay(18); digitalWrite(pin, HIGH); delayMicroseconds(40); pinMode(pin, INPUT); // ACKNOWLEDGE or TIMEOUT unsigned int loopCnt = 10000; while(digitalRead(pin) == LOW) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; loopCnt = 10000; while(digitalRead(pin) == HIGH) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT for (int i=0; i<40; i++) { loopCnt = 10000; while(digitalRead(pin) == LOW) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; unsigned long t = micros(); loopCnt = 10000; while(digitalRead(pin) == HIGH) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; if ((micros() - t) > 40) bits[idx] |= (1 << cnt); if (cnt == 0) // next byte? { cnt = 7; // restart at MSB idx++; // next byte! } else cnt--; } // WRITE TO RIGHT VARS // as bits[1] and bits[3] are always zero they are omitted in formulas. humidity = bits[0]; temperature = bits[2]; uint8_t sum = bits[0] + bits[2]; if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM; return DHTLIB_OK; } // // END OF FILE //
Utilisation de la librairie
Puis nous créons un fichier .ino afin d’utiliser la librairie que nous venons d’ajouter dans notre IDE. Nous modifions légèrement l’exemple proposé sur le site Arduino car notre montage et usage sont un peu différents.
#include <dht11.h> dht11 DHT11; #define DHT11PIN 4 void setup() { Serial.begin(9600); Serial.println("DHT11 TEST PROGRAM "); Serial.print("LIBRARY VERSION: "); Serial.println(DHT11LIB_VERSION); Serial.println(); } void loop() { Serial.println("\n"); int chk = DHT11.read(DHT11PIN); Serial.print("Read sensor: "); switch (chk) { case DHTLIB_OK: Serial.println("OK"); Serial.print("Humidity (%): "); Serial.println((float)DHT11.humidity, 2); Serial.print("Temperature (°C): "); Serial.println((float)DHT11.temperature, 2); Serial.print("Temperature (°F): "); Serial.println(Fahrenheit(DHT11.temperature), 2); Serial.print("Temperature (°K): "); Serial.println(Kelvin(DHT11.temperature), 2); Serial.print("Dew PointFast (°C): "); Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity)); break; case DHTLIB_ERROR_CHECKSUM: Serial.println("Checksum error"); break; case DHTLIB_ERROR_TIMEOUT: Serial.println("Time out error"); break; default: Serial.println("Unknown error"); break; } delay(2000); } //Celsius to Fahrenheit conversion double Fahrenheit(double celsius) { return 1.8 * celsius + 32; } //Celsius to Kelvin conversion double Kelvin(double celsius) { return celsius + 273.15; } // dewPoint function NOAA // reference (1) : http://wahiduddin.net/calc/density_algorithms.htm // reference (2) : http://www.colorado.edu/geography/weather_station/Geog_site/about.htm double dewPointFast(double celsius, double humidity) { double a = 17.271; double b = 237.7; double temp = (a * celsius) / (b + celsius) + log(humidity*0.01); double Td = (b * temp) / (a - temp); return Td; }
N.B.: Lorsque vous récupérez des programmes sur internet, vérifiez bien que votre version de composant et votre montage sont identiques à l’exemple pour éviter des problèmes de compatibilité.
N.B.: Il existe d’autres versions du capteur DHT11. Si vous possédez un autre de ces capteurs, vous pouvez regarder la librairie DHTLib.
Application
- Créer une station météo avec un capteur DHT11 et un écran LCD
Sources
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie
Appreciate this. Let me try it out.
Simple et efficace.
testé et validé sur arduino Uno
Merci
Merci pour votre commentaire
je deviens ouf j’ai une erreur de compilation! à la dernière ligne
return td; (stray ‘\302’ in program) j’arrive a rien avec ce capteur d’humidité
please Help!!
Bonjour, il y a un caractère invisible qui s’est inséré dans le code. Tu peux copier le code dans un éditeur de texte comme Notepad2 pour repérer les caractères non reconnus