This is a quick project which uses Arduino and two sensors DHT11 and BMP180 to display humidity, temperature and atmospheric pressure to on a small LCD screen.
I first proofed the setup and code on Arduino Uno and then tried to shift it to a cheap Arduino Nano clone for final setup. But after facing some reliability issues with the buggy clone, switched back to Uno.
COMPONENTS
- DHT11: It measures temperature from 0°C to 50°C and humidity from 20% to 90%. Accuracy is within ±1%. 3 pins
- BMP180: It measures barometric pressure between 300hp to 1100hP and temperature -40°C to 80°C. 4 pins
- Arduino Uno
- LCD 16 columns and 2 rows. 16 pins. There are models which have I2C interface making connections easier.
- Connecting wires, bread board, power supply.
As both sensors have temperature measuring capability, I decided to use both. But later realised that readings provided by both differ by 1-1.5 degrees. I tried calibrating using a potentiometer, but it didn’t work. So left it as it is as it’s not going to be used for something very important or sensitive. Pressure settings for BMP180 came pre-calibrated and it’s possible to finetune it more. But for this project, I’ve left it untouched.
Power to Arduino can be provided via a USB cable attached to a spare phone charger or 9V barrel connector. 5V and GND (Ground) mentioned are the power output of Arduino, not any external supply.
CONNECTIONS
LCD | CONNECTION |
1. VSS | GND |
2. VDD | 5V |
3.V0 | GND (You can add a potentiometer to control LCD brightness) |
4. RS | 13 Arduino |
5.RW | GND |
6.E | 12 Arduino |
7.D0 | Disconnected |
8.D1 | Disconnected |
9.D2 | Disconnected |
10.D3 | Disconnected |
11.D4 | 11 Arduino |
12.D5 | 10 Arduino |
13.D6 | 9 Arduino |
14.D7 | 8 Arduino |
15.A | 5V |
16.K | GND |
BMP180 | CONNECTION |
Vin | 5V |
GND | GND |
SCL | A0 Arduino |
SCA | A1 Arduino |
DHT11 | CONNECTION |
Vcc | 5V |
OP | 3 Arduino |
GND | GND |
If you face problems like program not starting, blank or garbage display, then short TX1 and RX0 pins of Arduino.
After proofing the design on breadboard, I made a messy job of soldering the sensors and LCD on a perfboard. Didn’t have proper casing and too poor for a 3D printer, so used a transparent plastic box which originally had chocolates inside to house the whole setup. Picture was taken before closing and sealing the box.
The basic code was copied from Arduino site but heavily modified to meet my requirements.
CODE
/* DHT-11 and BMP180 sensors with Arduino Uno
for Temperature, Pressure and Humidity sensor
//Libraries
#include <Adafruit_BMP085.h>
#include <Wire.h>
#include <DHT.h>
#include <DHT_U.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);//RS,EN,D4,D5,D6,D7
//DHT11 start
//Constants
#define DHTPIN 3 // what pin we're connected to
#define DHTTYPE DHT11 // DHT 11 (AM2302)
// Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);
//Variables
int chk;
float hum; //Stores humidity value
float temp; //Stores temperature value
//DHT11 end
//bmp085 start
char PRESSURESHOW[4];// initializing a character of size 4 for showing the result
char TEMPARATURESHOW[4];// initializing a character of size 4 for showing the temparature result
Adafruit_BMP085 bmp;
//bmp085 end
void setup()
{
lcd.begin(16, 2);
dht.begin();
lcd.clear();//clear display
Serial.begin(9600);
if (!bmp.begin())
{
Serial.println("ERROR");///if there is an error in communication
while (1) {}
}
}
void loop()
{
//bmp085 start
lcd.print("P="); // print name
String PRESSUREVALUE = String(bmp.readPressure()); // convert the reading to a char array
PRESSUREVALUE.toCharArray(PRESSURESHOW, 4);
lcd.print(PRESSURESHOW);
lcd.print("hPa ");
lcd.setCursor(9, 0);
lcd.print("T1=");// print name
String TEMPARATUREVALUE = String(bmp.readTemperature());
// convert the reading to a char array
TEMPARATUREVALUE.toCharArray(TEMPARATURESHOW, 4);
lcd.print(TEMPARATURESHOW);
lcd.print("C ");
lcd.setCursor(8, 0);
//bmp085 end
//DHT11 start
//Read data and store it to variables hum and temp
hum = dht.readHumidity();
temp= dht.readTemperature();
//Print temp and humidity values
lcd.setCursor(0, 1);
lcd.print("H:");
lcd.print(hum);
lcd.print("%");
lcd.setCursor(9, 1);
lcd.print("T:");
lcd.print(temp);
lcd.println("C");
//DHT11 end
delay(2000); //Delay 2 sec.
}