#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// I2C LCD address and dimensions
LiquidCrystal_I2C lcd(0x27, 16, 2); // Address 0x27 or 0x3F
// DHT22 Sensor pin and type
#define DHT_PIN 15 // GPIO 15
#define DHT_TYPE DHT22 // DHT22 sensor type
// Relay Pins
#define RELAY_TEMP_PIN 33 // GPIO 33 - Relay for temperature control
#define RELAY_HUMID_PIN 32 // GPIO 32 - Relay for humidity control
#define RELAY_FAN_PIN 25 // GPIO 25 - Fan control relay
#define RELAY_LDR_PIN 26 // GPIO 26 - Relay control for light intensity
// LDR pin
#define LDR_PIN 34 // GPIO 34 - Analog pin for light intensity
// Thresholds
#define TEMP_THRESHOLD_LOW 28.0 // Fan low speed threshold (28°C)
#define TEMP_THRESHOLD_HIGH 35.0 // Fan high speed threshold (35°C)
#define HUMIDITY_THRESHOLD 50.0 // Humidity threshold for relay control
#define LIGHT_THRESHOLD 500 // Light intensity threshold for relay control
// Initialize DHT sensor
DHT dht(DHT_PIN, DHT_TYPE);
void setup() {
// Start Serial Monitor
Serial.begin(115200);
// Initialize the LCD
lcd.init();
lcd.backlight();
// Initialize DHT sensor
dht.begin();
// Set relay pins as outputs
pinMode(RELAY_TEMP_PIN, OUTPUT);
pinMode(RELAY_HUMID_PIN, OUTPUT);
pinMode(RELAY_FAN_PIN, OUTPUT);
pinMode(RELAY_LDR_PIN, OUTPUT);
// Ensure relays are initially off
digitalWrite(RELAY_TEMP_PIN, LOW);
digitalWrite(RELAY_HUMID_PIN, LOW);
digitalWrite(RELAY_FAN_PIN, LOW);
digitalWrite(RELAY_LDR_PIN, LOW);
// LCD initialization message
lcd.setCursor(0, 0);
lcd.print("Initializing...");
delay(2000); // 2 second delay for initialization
lcd.clear();
}
void loop() {
// Read sensor values
float humidity = dht.readHumidity();
float temperatureC = dht.readTemperature();
int lightIntensity = analogRead(LDR_PIN); // Read light intensity from LDR
// Check for sensor failure
if (isnan(humidity) || isnan(temperatureC)) {
lcd.setCursor(0, 0);
lcd.print("Sensor Error");
return;
}
// Control temperature relay
if (temperatureC > TEMP_THRESHOLD_LOW) {
digitalWrite(RELAY_TEMP_PIN, HIGH); // Temperature control relay ON
} else {
digitalWrite(RELAY_TEMP_PIN, LOW); // Temperature control relay OFF
}
// Control humidity relay
if (humidity > HUMIDITY_THRESHOLD) {
digitalWrite(RELAY_HUMID_PIN, HIGH); // Humidity control relay ON
} else {
digitalWrite(RELAY_HUMID_PIN, LOW); // Humidity control relay OFF
}
// Control LDR relay based on light intensity
if (lightIntensity < LIGHT_THRESHOLD) {
digitalWrite(RELAY_LDR_PIN, HIGH); // Light intensity control relay ON
} else {
digitalWrite(RELAY_LDR_PIN, LOW); // Light intensity control relay OFF
}
// Fan control (simulating different speeds by toggling HIGH/LOW for Wokwi)
if (temperatureC > TEMP_THRESHOLD_LOW && temperatureC <= TEMP_THRESHOLD_HIGH) {
// Simulating low speed by turning fan on for a short time
digitalWrite(RELAY_FAN_PIN, HIGH);
delay(1000); // Fan ON for 1 second (simulated low speed)
digitalWrite(RELAY_FAN_PIN, LOW);
} else if (temperatureC > TEMP_THRESHOLD_HIGH) {
// Fan runs continuously at high speed (ON)
digitalWrite(RELAY_FAN_PIN, HIGH);
} else {
// Turn off the fan when temperature is below the threshold
digitalWrite(RELAY_FAN_PIN, LOW);
}
// Display data on LCD
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temperatureC, 1); // Temperature with 1 decimal
lcd.print("C H:");
lcd.print(humidity, 0); // Humidity as an integer
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("L:");
lcd.print(lightIntensity); // Display light intensity
lcd.print(" Fan:");
if (temperatureC > TEMP_THRESHOLD_HIGH) {
lcd.print("High ");
} else if (temperatureC > TEMP_THRESHOLD_LOW) {
lcd.print("Low ");
} else {
lcd.print("Off ");
}
// Serial output for debugging
Serial.print("Temp: ");
Serial.print(temperatureC);
Serial.print("C, Humidity: ");
Serial.print(humidity);
Serial.print("%, Light Intensity: ");
Serial.print(lightIntensity);
Serial.print(", Fan: ");
if (temperatureC > TEMP_THRESHOLD_HIGH) {
Serial.println("Full Speed");
} else if (temperatureC > TEMP_THRESHOLD_LOW) {
Serial.println("Low Speed");
} else {
Serial.println("Off");
}
delay(2000); // 2-second delay before next sensor reading
}