#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// LCD Configuration (16x4 display)
LiquidCrystal_I2C lcd(0x27, 16, 4); // Use 0x3F if address doesn't work
// DHT22 Configuration
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Update interval
const unsigned long readInterval = 2000;
unsigned long previousMillis = 0;
void setup() {
Serial.begin(9600);
// Initialize LCD
lcd.init();
lcd.backlight();
lcd.clear();
// Start DHT sensor
dht.begin();
// Display header
lcd.setCursor(0, 0);
lcd.print("Environment Monitor");
lcd.setCursor(0, 1);
lcd.print("----------------");
}
void loop() {
if (millis() - previousMillis >= readInterval) {
previousMillis = millis();
// Read sensor data
float humidity = dht.readHumidity();
float tempC = dht.readTemperature();
// Check if readings are valid
if (isnan(humidity) || isnan(tempC)) {
displayError();
return;
}
// Convert Celsius to Fahrenheit
float tempF = (tempC * 9.0 / 5.0) + 32;
// Update display
updateDisplay(tempC, tempF, humidity);
// Serial output for debugging
printSerial(tempC, tempF, humidity);
}
}
void updateDisplay(float tempC, float tempF, float humidity) {
// Clear previous readings
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(" ");
// Line 2: Temperature
lcd.setCursor(0, 2);
lcd.print("Temp: ");
lcd.print(tempC, 1);
lcd.write(223); // Degree symbol
lcd.print("C ");
lcd.print(tempF, 1);
lcd.write(223);
lcd.print("F");
// Line 3: Humidity
lcd.setCursor(0, 3);
lcd.print("Humidity: ");
lcd.print(humidity, 1);
lcd.print("% RH");
}
void displayError() {
lcd.setCursor(0, 2);
lcd.print(" Sensor Error! ");
lcd.setCursor(0, 3);
lcd.print(" Check Connection ");
}
void printSerial(float tempC, float tempF, float humidity) {
Serial.print("Temperature: ");
Serial.print(tempC);
Serial.print("°C / ");
Serial.print(tempF);
Serial.print("°F\t");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println("%");
}