Arduino LCD DHT11 Temperature – Humidity Sensor
As a first useful project on Arduino, a DHT11 sensor is a great place to start.
The DHT11 is a simple digital temperature/humidity sensor that easily connects to any Arduino. Most sample programs just take the reading and output it to the serial port. This example code will let you connect a LCD screen and track the min and max temp/humidity readings.
PARTS
It doesn’t take much to put this all together. Place the SainSmart LCD Shield over the Arduino and connect the headers together. I then used 3 male to female breadboard wires to connect the sensor into the A5 (Analog 5) port. Then write/copy the software and you are ready to go.
Simplest DHT11 Sensor Code
If you just want the quickest way to get your sensor reading, copy and paste the box below:
#include <Wire.h> // builtin library
#include <LiquidCrystal.h> // builtin library
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // sainsmart 1602 lcd
#include <dht11.h> // download this from http://playground.arduino.cc/main/DHT11Lib
dht11 DHT;
void setup(){
lcd.begin(16, 2);
}
void loop() {
DHT.read(A5);
lcd.print((DHT.temperature * (9.0/5)) + 32); // Converts C to F
delay(1000); // DHT11 can't poll faster than 1x a second
}
More Complex Code with Min/Max and Humidity
#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // sainsmart 1602 lcd
#include "dht11.h"
#define dht_dpin A5 // Set to channel sensor is on
dht11 DHT;
int i;
int tmin=0;
int tmax=0;
int temp=0;
int hmin=0;
int hmax=0;
int humid=0;
void setup(){
lcd.begin(16, 2);
lcd.print("starting");
// Get the initial values for min/max values
DHT.read(dht_dpin);
tmin=int((DHT.temperature * (9.0/5.0)) + 32.0);
tmax=tmin;
hmin=int(DHT.humidity+22);
hmax=hmin;
}
/* LCD SCREEN -- to show where the cursors correlates on the LCD
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
0: T E M P L 6 7 6 8 H 6 9
1:
*/
void loop(){
DHT.read(dht_dpin);
//Process Temperature -------------------------------
temp=int((DHT.temperature * (9.0/5.0)) + 32.0); // F to C
lcd.setCursor (0,0);
lcd.print("TEMP L");
lcd.print(tmin);
lcd.setCursor(9,0);
lcd.print(temp);
lcd.setCursor(12,0);
lcd.print("H");
lcd.print(tmax);
if(temp > tmax){ tmax=temp; }
if(temp < tmin){ tmin=temp; }
// Process Humidity ---------------------------------
humid=int(DHT.humidity+22); // includes calibration constant
lcd.setCursor(0,1);
lcd.print("HUM L");
lcd.print(hmin);
lcd.setCursor(9,1);
lcd.print(humid);
lcd.setCursor(12,1);
lcd.print("H");
lcd.print(hmax);
if(humid > hmax){ hmax=humid; }
if(humid < hmin){ hmin=humid; }
// This blinks a period at the top right LCD to show it is running
lcd.setCursor(15,0);
if(i==1){
lcd.print(" ");
i=0;
}else{
lcd.print(".");
i=1;
}
delay(800); // DHT11 can't poll faster than 1x a second
}
Results
After building this I have one complaint, is the data from the DHT11 even realistic. The temperature result is an easy one to check but the relative humidity can seem more like a predictable random number. In the project, you will see various fudge factors to align the DHT11 to a more realistic number. The question raises, does the DHT11 need a constant calibration factor or does it need varying amounts of correction at different temperatures and humidity.
The DHT11 has an accuracy of 1 degree in Celsius, which after conversion gives you about 2 degree accuracy in Fahrenheit. For most applications, it’s probably not a big deal, but it leaves you wanting more resolution. The reason for decimal points in the 9.0/5.0 (C to F conversion) is to force the compiler to treat 9/5 as a floating point [1.88] instead of an integer [1].
The RH (relative humidity) is a whole other issue. I have 3 different RH meters and none of them seem to agree. And unlike the temperature where you can use a space heater to quickly heat a small room to different temperatures, RH is a hard one to change for testing.
Feel free to leave comments and questions below.
Trihakni putra ( )
its quite simple instruction i ever read. ok. what about the accuration of DHT11, is this better than DHT22?. and what about if i using LCD Shield from another company such as, dfrobot?. did i need changing the code or not? thanks.
Jason ( )
I know this is an older post, but for what it’s worth your sketch to display the MIN/CUR/MAX temp was awesome for me. Have it up and running perfectly – thanks!
Charles Parsons ( )
I know this is an old article but it just helped me a great deal. Thanks. As for the DHT11 being a bit off, i have a real thermometer on the wall which is pretty accurate and I just changed “32” to 29 and now it reads correctly.
Thank You!