Arduino

Arduino LCD DHT11 Temperature – Humidity Sensor


Arduino SainSmart LCD DHT11

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.

DHT11 Pin Diagram

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.

openanalytics 6971 views

I'm a 35 year old UIUC Computer Engineer building mobile apps, websites and hardware integrations with an interest in 3D printing, biotechnology and Arduinos.


View Comments

This site uses Akismet to reduce spam. Learn how your comment data is processed.