#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 2 // Pin where your DHT sensor is connected.
#define DHTTYPE DHT22 // Type of DHT sensor.
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(DHTPIN, DHTTYPE);
int ledY = 3; // Yellow LED for Freezing
int ledO = 4; // Orange LED for Very Cold
int ledDG = 5; // Dark Green LED for Normal
int ledP = 6; // Purple LED for Hot
int ledR = 7; // Red LED for Very Hot
void setup() {
Serial.begin(9600); // Start serial communication
Wire.begin(); // Initialize the I2C communication for the LCD
dht.begin();
lcd.init(); // Initialize the LCD
lcd.backlight(); // Turn on the backlight
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
// Set up the LED pins as output
pinMode(ledY, OUTPUT);
pinMode(ledO, OUTPUT);
pinMode(ledDG, OUTPUT);
pinMode(ledP, OUTPUT);
pinMode(ledR, OUTPUT);
// Turn off all LEDs initially
digitalWrite(ledY, LOW);
digitalWrite(ledO, LOW);
digitalWrite(ledDG, LOW);
digitalWrite(ledP, LOW);
digitalWrite(ledR, LOW);
}
void loop() {
delay(5000); // Delay to prevent rapid readings
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
int lightIntensity = analogRead(A0); // Read LDR value from pin A0
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read data from DHT sensor!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sensor Error");
return;
}
// Determine weather status (Good/Bad)
String weatherStatus = "Bad";
if (temperature > 16 && temperature <= 30 && humidity > 40 && humidity <= 60 && lightIntensity > 300 && lightIntensity < 700) {
weatherStatus = "Good";
}
// Output to Serial Monitor for data logging
Serial.print("Temperature: ");
Serial.print(temperature, 1);
Serial.print(" C, Humidity: ");
Serial.print(humidity, 1);
Serial.print(" %, Light Intensity: ");
Serial.print(lightIntensity);
Serial.print(", Weather: ");
Serial.println(weatherStatus);
// Log data to CSV format
Serial.print(temperature);
Serial.print(",");
Serial.print(humidity);
Serial.print(",");
Serial.print(lightIntensity);
Serial.print(",");
Serial.println(weatherStatus == "Good" ? "1" : "0"); // "1" for Good, "0" for Bad
// LCD Display
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature, 1);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(humidity, 1);
lcd.print(" %");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Light: ");
lcd.print(lightIntensity);
lcd.setCursor(0, 1);
lcd.print("Weather: ");
lcd.print(weatherStatus);
delay(2000); // Adjust the delay based on your preference
// LED Indicators based on temperature
if (temperature <= 0) {
digitalWrite(ledY, HIGH); // Freezing (Yellow LED)
digitalWrite(ledO, LOW);
digitalWrite(ledDG, LOW);
digitalWrite(ledP, LOW);
digitalWrite(ledR, LOW);
} else if (temperature > 0 && temperature <= 16) {
digitalWrite(ledY, LOW);
digitalWrite(ledO, HIGH); // Very Cold (Orange LED)
digitalWrite(ledDG, LOW);
digitalWrite(ledP, LOW);
digitalWrite(ledR, LOW);
} else if (temperature > 16 && temperature <= 25) {
digitalWrite(ledY, LOW);
digitalWrite(ledO, LOW);
digitalWrite(ledDG, HIGH); // Normal (Dark Green LED)
digitalWrite(ledP, LOW);
digitalWrite(ledR, LOW);
} else if (temperature > 25 && temperature <= 37) {
digitalWrite(ledY, LOW);
digitalWrite(ledO, LOW);
digitalWrite(ledDG, LOW);
digitalWrite(ledP, HIGH); // Hot (Purple LED)
digitalWrite(ledR, LOW);
} else {
digitalWrite(ledY, LOW);
digitalWrite(ledO, LOW);
digitalWrite(ledDG, LOW);
digitalWrite(ledP, LOW);
digitalWrite(ledR, HIGH); // Very Hot (Red LED)
}
}