DHT11 Temperature Humidity Sensor

Arduino Using DHT11 Temperature-Humidity Sensor

by Lewis Loflin

This version with a DHT11 temperature-humidity sensor differs from the two earlier pages in the subroutines have changed and new ones introduced.

Use here of the LCD display differs from the video below in that we no longer are using the I2C version LCD controller. Due to changes in the Arduino compiler the original user supplied libraries no longer work. I wrote my own code which anyone can see how it works and modify at will.

A Sn74164 is connected to Arduino to operate the LCD 8-bit date lines. Only four connections, two to the LCD display and two to the Sn74164 are all that's needed to operate the display. The purpose here is to illustrate how to connect electronics to a micro-controller.

The routines enable one to display integers, floats, strings, and characters on the display. I also introduced two functions not even in the Arduino reference such as itoa() and dtostrf().


LCD display with 74164





#define Bit_out 12 // Pin 1-2 Sn74164
#define CLK 11 // Pin 9 Sn74164
#define RS 7  // Pin 4 LCD
#define E 8  // Pin 6 LCD

#include <DHT.h>
#define DHTPIN 6     // what pin we're connected to
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);

#define Line1 0x80  // location LCD row 0 col 0 or line 1 LCD
#define Line2 0x80 + 0x40  // location row 1 col 0 or line 2 LCD

void setup() {
  pinMode(Bit_out, OUTPUT);
  pinMode(CLK, OUTPUT);
  pinMode(RS, OUTPUT);
  pinMode(E, OUTPUT);

  digitalWrite(CLK, LOW); 
  digitalWrite(RS, LOW); // LCD in command mode default
  digitalWrite(E, HIGH);

  initLCD(); // se below
  delay(1000); // delay for DS18B20

}

void loop() {
  // device is slow!
  float h = dht.readHumidity();
  float t = dht.readTemperature();

   // checks for faulty data
  if (isnan(t) || isnan(h)) { 
    typeln("Failed read DHT");
    Home();
  } 
  else {
    setLcd(Line1, 0);
    typeln("Humidity: "); 
    typeFloat(h);
    typeChar('%');
    setLcd(Line2, 0);
    typeln("Temp: "); 
    typeFloat(t);
    typeln(" *C   ");
    Home();
  }


} // end loop


// move cursor on LCD
void   setLcd(int x, int y)   {

  writeCommand(x + y);
}

void   clrLcd(void)   {

  writeCommand(0x01); // clear
  writeCommand(0x02); // home
}


void   Home(void)   {

  writeCommand(0x02); // home
}


void typeFloat(float localFloat)   {

  char myBuffer[16];
  dtostrf(localFloat, 4, 2, myBuffer);
  int i = 0;
  // where is decimal?
  while (myBuffer[i] != '.') { 
    i++; 
  }
  // don't type trailing junk
  // 2 decimal places
  typeln(myBuffer);
}


// location is place on LCD display. 
void typeInt(int k, int location)   {
  char array1[10];
  itoa(k, array1, 10); // int to string
  typeln(array1);
}

void typeChar(byte num1)   {

  ssrWrite(num1);
  digitalWrite(RS, HIGH);
  pulsout(E);
  digitalWrite(RS, LOW);
}

void writeCommand(byte val)   {

  ssrWrite(val); // send byte to 74164
  digitalWrite(RS, LOW); // make sure RS in Com mode
  pulsout(E);
}


// Below we pass a pointer to array1[0].
void typeln(char *s)   {
  delayMicroseconds(1000);
  while (*s)  typeChar(*(s++));
}  // end typeln





// inverts state of pin, delays, then reverts state back
void    pulsout(byte x)   {
  byte z = digitalRead(x);
  delayMicroseconds(10);
  z = !z; // reverse state
  digitalWrite(x, z);
  z = !z; // return to original state
  digitalWrite(x, z);
} // end pulsout()

/*
To shift LSB out first:
 byte  temp = val & B00000001; 
 if (temp == 0x01) digitalWrite(Bit_out, HIGH); 
 else digitalWrite(Bit_out, LOW); 
 pulsout(CLK); 
 val = val >> 1; // shift one place right
 */

void ssrWrite(byte val)  {  // shift data to 74164
  for (int j=1; j<=8; j++)  {   // shift out MSB first
    byte  temp = val & B10000000; // MSB out first
    if (temp == 0x80) digitalWrite(Bit_out, HIGH); 
    else digitalWrite(Bit_out, LOW); 
    pulsout(CLK); 
    val = val << 1; // shift one place left
  }  // next j
}  // end byteWrite


/*
Hd44780 display commands:
 0x0f = initiate display cursor on blinking
 0x0c = initiate display cursor off
 0x01 = clear display fills display with spaces (0x20).
 0x02 = HOME returns to line one first character
 0x38 = 2 lines X 16 char 8 bits mode. Defaults to 1 line mode.
 0x10 = cursor left
 0x14 = cursor right
 0x18 = Shifts entire display left
 0x1c = Shifts entire display right 
 
 One can also go to a specific location.
 writeCommand(0x80); // begin on 1st line
 writeCommand(0x80 + 0x40); // begin on 2nd line 
 
 writeCommand(0x38); // setup for 2 lines
 writeCommand(0x0F); // blinking cursor
 
 writeCommand(0x02); // home
 writeCommand(0x01); // clear
 
 */


void initLCD(void)   {

  writeCommand(0x38); // setup for 2 lines
  writeCommand(0x0F); // blinking cursor
  writeCommand(0x01); // clear
  writeCommand(0x02); // home
}


Added September 20, 2013:

You Tube Arduino Microcontroller Video Series March 2012: