June 24, 2014

Second project - Temperature + humidity + LCD!

Hello coders, hackers, makers and curious visitors!

   The second project I worked on is a "temperature and humidity sensor with a LCD display" based on Arduino, the DHT11 serial temperature/humidity sensor, the LM35 linear temperature sensor and a 16x2 LCD screen. The project is similar to this one and features readings of temperature and humidity that are shown in a LCD display and sent via Arduino (USB- serial) to any PC terminal. Below I show a picture of the project working:

The prototype, when compared to Google Weather (upper right corner)

   The serial console (on arduino IDE) can be seen below, capturing successive readings from Arduino serial:

Screenshot of data captured through serial

   The complete schematic of this prototype is in the picture below; it was developed using Fritzing; You can download the schematic here

   The project was coded inside the Arduino IDE using some third-part codes, which I put together and made it work. The original codes are: DHT11 Library and LiquidCrystal . My code is available in the box below, as well as in this Github link.

Modified by Clovis Fritzen in June 11th, 2014:
- The original program read the serial temperature/humidity sensor DHT11 (which is still part of this program);
- "Delay" function substituted by a counter (when the counter overflows the program enters the serial routine)
- Added the LM35 (10mV/C temperature sensor) reading via serial, to compare both sensors
Board int.0 int.1 int.2 int.3 int.4 int.5
Uno, Ethernet 2 3
Mega2560 2 3 21 20 19 18
Leonardo 3 2 0 1
Due (any pin, more info http://arduino.cc/en/Reference/AttachInterrupt)

This example, as difference to the other, make use of the new method acquireAndWait()


int idDHT11pin = 2; //Digital pin for comunications
int idDHT11intNumber = 0; //interrupt number (must be the one that use the previus defined pin (see table above)
long count= 0; // counter for spacing the serial writings
long AcqPeriod= 0;
int sensorPin = A5; // input pin for LM35 (10mV/C)
int sensorValue = 0; // variable to store the LM35 temperature
int led= 13;

void dht11_wrapper(); // must be declared before the lib initialization

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(9, 8, 5, 4, 3, 6);

// Lib instantiate
idDHT11 DHT11(idDHT11pin,idDHT11intNumber,dht11_wrapper);

void setup()
pinMode(led, OUTPUT);
Serial.println("DHT11 temp/humidity sensor - Example program");
Serial.print("Lib version: ");
Serial.println("modified by Clovis Fritzen");

// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print(" DHT:|LM35:|HUM:");
// This wrapper is in charge of calling
// mus be defined like this for the lib work
void dht11_wrapper() {
void loop()

AcqPeriod= 400000; // set here the interval in which data is sent into serial

if (count < AcqPeriod) // Still need to make sure what this number represents in terms of
// seconds or cycles of clock
count= count++;

if (count < (AcqPeriod/2)) // just a routine to blink a led :)
digitalWrite(led, HIGH);
} else{
digitalWrite(led, LOW);

//Serial.print("\nRetrieving information from sensor: ");
Serial.print("\nRead sensor: ");
count= '0';

sensorValue = analogRead(sensorPin);
sensorValue= sensorValue/2;

int result = DHT11.acquireAndWait();
switch (result)
Serial.println("Error\n\r\tChecksum error");
Serial.println("Error\n\r\tISR time out error");
Serial.println("Error\n\r\tResponse time out error");
Serial.println("Error\n\r\tData time out error");
Serial.println("Error\n\r\tDelta time to small");
Serial.println("Error\n\r\tNot started");
Serial.println("Unknown error");

lcd.setCursor(7, 1);
// print the number of seconds since reset:

Serial.print("Humidity (%): ");
Serial.println(DHT11.getHumidity(), 0); // ", 0" represents the number of decimal positions after the comma

Serial.print("DHT11 Temp (oC): ");
Serial.println(DHT11.getCelsius(), 0); // ", 0" represents the number of decimal positions after the comma

lcd.setCursor(13, 1);
// print the number of seconds since reset:
lcd.print(DHT11.getHumidity(), 0);

Serial.print("LM35 Temp (oC): ");

//Serial.print("Temperature (oF): ");
//Serial.println(DHT11.getFahrenheit(), 2);

//Serial.print("Temperature (K): ");
//Serial.println(DHT11.getKelvin(), 2);

//Serial.print("Dew Point (oC): ");

//Serial.print("Dew Point Slow (oC): ");

// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(1, 1);
// print the number of seconds since reset:



   I just want to share some notes with you:
- Both the DHT11 and LM35 have a "step" (or resolution) of one degree Celsius, meaning they cannot read something like "26.3"; They a only capable of reading numbers with no decimal (e.g: "26").
- The contrast of the LCD screen can be adjusted by means of the potentiometer; Its backlight is always on (last two pins of the LCD on the schematic above).
- The circuit works independently on the presence of the USB cable on Arduino; it means that it will work on batteries for example!. in this case only the serial readings will be missing.
- The is a blinking led on pin 13 of Arduino (which is assemble on the board); That one is there just for fun.

   I hope you guys are enjoying my posts so far, and trying to validate my projects by doing it yourselves. If you have any suggestions/ recommendations or critics, please feel free to talk to me on Twitter, Google Plus and Facebook, as well as in the comments below. See you all next time!.

No comments:

Post a Comment