/*
* Arduino Weather Station
* DHT22 Temperature & Humidity Sensor with LCD Display
* Created for Wokwi Simulator
*/
#include <LiquidCrystal.h>
#include <DHT.h>
// DHT22 Sensor Configuration
#define DHTPIN 2 // DHT22 data pin connected to Arduino pin 2
#define DHTTYPE DHT22 // DHT 22 (AM2302)
// Initialize DHT sensor
DHT dht(DHTPIN, DHTTYPE);
// LCD Configuration (RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
// Custom characters for degree symbol
byte degreeSymbol[8] = {
0b00110,
0b01001,
0b01001,
0b00110,
0b00000,
0b00000,
0b00000,
0b00000
};
// Custom character for humidity drop
byte dropSymbol[8] = {
0b00100,
0b00100,
0b01010,
0b01010,
0b10001,
0b10001,
0b10001,
0b01110
};
void setup() {
// Initialize serial communication for debugging
Serial.begin(9600);
Serial.println("Weather Station Initializing...");
// Initialize DHT sensor
dht.begin();
// Initialize LCD (16x2 display)
lcd.begin(16, 2);
// Create custom characters
lcd.createChar(0, degreeSymbol);
lcd.createChar(1, dropSymbol);
// Display welcome message
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Weather Station");
lcd.setCursor(0, 1);
lcd.print("Initializing...");
delay(2000);
lcd.clear();
}
void loop() {
// Wait a few seconds between measurements
delay(2000);
// Read humidity
float humidity = dht.readHumidity();
// Read temperature in Celsius
float temperatureC = dht.readTemperature();
// Read temperature in Fahrenheit
float temperatureF = dht.readTemperature(true);
// Check if any reads failed
if (isnan(humidity) || isnan(temperatureC) || isnan(temperatureF)) {
Serial.println("Failed to read from DHT sensor!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sensor Error!");
lcd.setCursor(0, 1);
lcd.print("Check Connection");
return;
}
// Calculate heat index in Fahrenheit
float heatIndexF = dht.computeHeatIndex(temperatureF, humidity);
// Calculate heat index in Celsius
float heatIndexC = dht.computeHeatIndex(temperatureC, humidity, false);
// Print to Serial Monitor for debugging
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print("% Temperature: ");
Serial.print(temperatureC);
Serial.print("°C / ");
Serial.print(temperatureF);
Serial.print("°F Heat Index: ");
Serial.print(heatIndexC);
Serial.println("°C");
// Display on LCD - Line 1: Temperature
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperatureC, 1); // 1 decimal place
lcd.write(byte(0)); // Degree symbol
lcd.print("C ");
lcd.print(temperatureF, 1);
lcd.write(byte(0));
lcd.print("F");
// Display on LCD - Line 2: Humidity
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(humidity, 1);
lcd.print("%");
lcd.write(byte(1)); // Drop symbol
// Alternate display every 5 seconds to show heat index
delay(5000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Heat Index:");
lcd.setCursor(0, 1);
lcd.print(heatIndexC, 1);
lcd.write(byte(0));
lcd.print("C / ");
lcd.print(heatIndexF, 1);
lcd.write(byte(0));
lcd.print("F");
delay(3000);
}