#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// Pin Definitions
#define LDR_PIN 3 // Digital pin for LDR
#define DHT_PIN 2 // Digital pin for DHT11
#define RAIN_SENSOR_PIN 4 // Digital pin for Rain Sensor
// DHT11 setup
// #define DHT_TYPE DHT11
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
// LCD setup
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Weather thresholds
const int lightThreshold = HIGH; // LDR threshold for "dark"
const int rainThreshold = HIGH; // Rain sensor threshold for "rain"
const float highHumidity = 60.0; // Humidity threshold for "very high"
const float mediumHumidity = 40.0; // Humidity threshold for "medium"
const float lowTemp = 20.0; // Low temperature threshold
const float mediumTemp = 30.0; // Medium temperature threshold
const float highTemp = 40.0; // High temperature threshold
// Variables for sensor readings
int ldrValue;
bool isRaining;
float temperature;
float humidity;
String weatherStatus;
void setup() {
// Initialize serial monitor
Serial.begin(9600);
// Initialize DHT sensor
dht.begin();
// Initialize LCD
lcd.init();
lcd.backlight();
// Set pin modes
pinMode(LDR_PIN, INPUT);
pinMode(RAIN_SENSOR_PIN, INPUT);
// Initial message
lcd.setCursor(0, 0);
lcd.print("Weather Sensor");
lcd.setCursor(0, 1);
lcd.print("Initializing...");
delay(2000);
lcd.clear();
}
void loop() {
// Read sensor values
ldrValue = digitalRead(LDR_PIN);
isRaining = digitalRead(RAIN_SENSOR_PIN) == rainThreshold;
temperature = dht.readTemperature();
humidity = dht.readHumidity();
// Error handling for DHT sensor
if (isnan(temperature) || isnan(humidity)) {
lcd.setCursor(0, 0);
lcd.print("Sensor Error");
delay(2000);
return;
}
// Determine weather status
if (ldrValue == lightThreshold && temperature < lowTemp && humidity > highHumidity && isRaining) {
weatherStatus = "Very Cold Weather";
} else if (ldrValue == lightThreshold && temperature >= lowTemp && temperature <= mediumTemp && humidity > mediumHumidity && isRaining) {
weatherStatus = "Cold Weather";
} else if (temperature >= lowTemp && temperature <= mediumTemp && humidity <= mediumHumidity && !isRaining) {
weatherStatus = "Normal Weather";
} else if (temperature > mediumTemp && humidity <= mediumHumidity) {
weatherStatus = "Hot Weather";
} else if (temperature > highTemp && humidity < mediumHumidity) {
weatherStatus = "Very Hot Weather";
} else {
weatherStatus = "----";
}
// Display values on LCD
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temperature, 1);
lcd.print((char)223); // Degree symbol
lcd.print("C ");
lcd.print("H:");
lcd.print(humidity, 1);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("L:");
lcd.print(ldrValue == lightThreshold ? "Dark" : "Light");
lcd.print(" R:");
lcd.print(isRaining ? "Rain" : "NoRain");
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Status:");
lcd.setCursor(0, 1);
lcd.print(weatherStatus);
// Print to serial monitor for debugging
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print(" C, Humidity: ");
Serial.print(humidity);
Serial.print(" %, LDR: ");
Serial.print(ldrValue == lightThreshold ? "Dark" : "Light");
Serial.print(", Rain: ");
Serial.println(isRaining ? "Yes" : "No");
Serial.print("Weather Status: ");
Serial.println(weatherStatus);
delay(7000); // Total delay = 10 seconds
}