#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ----- Pin definitions -----
#define DHTPIN 4
#define DHTTYPE DHT22
#define RED_PIN 26
#define GREEN_PIN 27
#define BLUE_PIN 14
#define RELAY_PIN 33
#define BUZZER_PIN 25
// ----- Temperature thresholds (°C) -----
#define TOO_COLD 2
#define SAFE_MAX 5
#define CRITICAL_TEMP 8
// ----- Humidity thresholds (%) -----
#define LOW_HUMIDITY 70
#define OPTIMAL_HUMIDITY_MIN 80
#define OPTIMAL_HUMIDITY_MAX 90
#define HIGH_HUMIDITY 95
// ----- Objects -----
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(115200);
dht.begin();
lcd.init();
lcd.backlight();
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
float temp = dht.readTemperature();
float hum = dht.readHumidity();
if (isnan(temp) || isnan(hum)) {
Serial.println("Sensor Error!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sensor Failure");
digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
digitalWrite(RELAY_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
delay(2000);
return;
}
// ----- TEMPERATURE CHECK -----
if (temp <= TOO_COLD) {
digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, HIGH);
digitalWrite(RELAY_PIN, LOW);
digitalWrite(BUZZER_PIN, HIGH);
}
else if (temp > SAFE_MAX && temp <= CRITICAL_TEMP) {
digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
}
else if (temp > CRITICAL_TEMP) {
digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
delay(500);
digitalWrite(RED_PIN, LOW);
delay(500);
}
// ----- HUMIDITY CHECK -----
if (hum < LOW_HUMIDITY) {
digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, LOW);
}
else if (hum >= OPTIMAL_HUMIDITY_MIN && hum <= OPTIMAL_HUMIDITY_MAX) {
digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, HIGH);
}
else if (hum > OPTIMAL_HUMIDITY_MAX && hum <= HIGH_HUMIDITY) {
digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, HIGH);
}
else if (hum > HIGH_HUMIDITY) {
digitalWrite(RED_PIN, HIGH);
digitalWrite(BLUE_PIN, HIGH);
delay(500);
digitalWrite(RED_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
delay(500);
}
// ----- LCD Alternating Display -----
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temp);
lcd.print("C");
delay(2000); // Show temperature for 2 seconds
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hum: ");
lcd.print(hum);
lcd.print("%");
delay(2000); // Show humidity for 2 seconds
}