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()
*/
#include
#include
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;
//declaration
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.begin(9600);
Serial.println("DHT11 temp/humidity sensor - Example program");
Serial.print("Lib version: ");
Serial.println(IDDHT11LIB_VERSION);
Serial.println("modified by Clovis Fritzen");
Serial.println("---------------");
// 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() {
DHT11.isrCallback();
}
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);
}
}
else
{
//Serial.print("\nRetrieving information from sensor: ");
Serial.print("\nRead sensor: ");
//delay(100);
count= '0';
sensorValue = analogRead(sensorPin);
sensorValue= sensorValue/2;
int result = DHT11.acquireAndWait();
switch (result)
{
case IDDHTLIB_OK:
Serial.println("done");
break;
case IDDHTLIB_ERROR_CHECKSUM:
Serial.println("Error\n\r\tChecksum error");
break;
case IDDHTLIB_ERROR_ISR_TIMEOUT:
Serial.println("Error\n\r\tISR time out error");
break;
case IDDHTLIB_ERROR_RESPONSE_TIMEOUT:
Serial.println("Error\n\r\tResponse time out error");
break;
case IDDHTLIB_ERROR_DATA_TIMEOUT:
Serial.println("Error\n\r\tData time out error");
break;
case IDDHTLIB_ERROR_ACQUIRING:
Serial.println("Error\n\r\tAcquiring");
break;
case IDDHTLIB_ERROR_DELTA:
Serial.println("Error\n\r\tDelta time to small");
break;
case IDDHTLIB_ERROR_NOTSTARTED:
Serial.println("Error\n\r\tNot started");
break;
default:
Serial.println("Unknown error");
break;
}
lcd.setCursor(7, 1);
// print the number of seconds since reset:
lcd.print(sensorValue);
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.println(sensorValue);
//Serial.print("Temperature (oF): ");
//Serial.println(DHT11.getFahrenheit(), 2);
//Serial.print("Temperature (K): ");
//Serial.println(DHT11.getKelvin(), 2);
//Serial.print("Dew Point (oC): ");
//Serial.println(DHT11.getDewPoint());
//Serial.print("Dew Point Slow (oC): ");
//Serial.println(DHT11.getDewPointSlow());
// 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:
lcd.print(DHT11.getCelsius(),0);
}
}
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!.