#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
// LCD setup
LiquidCrystal_I2C lcd(0x27, 20, 4); // I2C address 0x27, 20x4 LCD
// DS1307 RTC setup
RTC_DS1307 rtc;
// DHT22 setup
#define DHTPIN 13 // Pin for DHT22 data
#define DHTTYPE DHT22 // Define the DHT sensor type (DHT22)
DHT dht(DHTPIN, DHTTYPE);
// LED pin assignments
const int ledPins[] = {4, 16, 17, 5};
// Relay pin assignments
#define FAN_RELAY 12
#define PUMP_RELAY 14
#define LAMP_RELAY 27
// Variable to store whether the lamp has been turned on at 11:10
bool lampTurnedOn = false;
unsigned long lampTurnOnTime = 0;
void setup() {
// Initialize serial communication
Serial.begin(115200);
// Initialize LCD
lcd.init();
lcd.backlight();
// Initialize I2C for RTC and LCD
Wire.begin(21, 22); // SDA on GPIO21, SCL on GPIO22
// Initialize RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC is not running, setting the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Initialize DHT sensor
dht.begin();
// Set LED pins as output
for (int i = 0; i < 4; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW); // Start with all LEDs off
}
// Set Relay pins as output
pinMode(FAN_RELAY, OUTPUT);
pinMode(PUMP_RELAY, OUTPUT);
pinMode(LAMP_RELAY, OUTPUT);
// Initialize all relays as off
digitalWrite(FAN_RELAY, LOW);
digitalWrite(PUMP_RELAY, LOW);
digitalWrite(LAMP_RELAY, LOW);
}
void loop() {
// Get temperature and humidity from DHT22
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Get current time from RTC
DateTime now = rtc.now();
// Display information on the LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time: ");
// Display time with leading zeros
if (now.hour() < 10) lcd.print("0");
lcd.print(now.hour(), DEC);
lcd.print(":");
if (now.minute() < 10) lcd.print("0");
lcd.print(now.minute(), DEC);
lcd.print(":");
if (now.second() < 10) lcd.print("0");
lcd.print(now.second(), DEC);
lcd.setCursor(0, 1);
lcd.print("Date: ");
lcd.print(now.day(), DEC);
lcd.print("/");
lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.year() + 543, DEC); // Add 543 to the year
lcd.setCursor(0, 2);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C");
lcd.setCursor(0, 3);
lcd.print("Humidity: ");
lcd.print(humidity);
lcd.print(" %");
// Blink LEDs based on temperature
for (int i = 0; i < 4; i++) {
digitalWrite(ledPins[i], (temperature > (i * 5 + 20)) ? HIGH : LOW); // Control LEDs by temp
}
// Control FAN_RELAY: On over 30°C, off under 30°C
if (temperature > 30) {
digitalWrite(FAN_RELAY, HIGH); // Turn on FAN if temperature > 30°C
} else {
digitalWrite(FAN_RELAY, LOW); // Turn off FAN if temperature <= 30°C
}
// Control PUMP_RELAY: On under 80% humidity, off over 80% humidity
if (humidity < 80) {
digitalWrite(PUMP_RELAY, HIGH); // Turn on PUMP if humidity < 80%
} else {
digitalWrite(PUMP_RELAY, LOW); // Turn off PUMP if humidity >= 80%
}
// Control LAMP_RELAY: Turn on for 2 minutes at exactly 11:10
if (now.hour() == 11 && now.minute() == 30 && !lampTurnedOn) {
digitalWrite(LAMP_RELAY, HIGH); // Turn on the lamp
lampTurnedOn = true; // Flag that the lamp has been turned on
lampTurnOnTime = millis(); // Record the time the lamp was turned on
}
// Turn off the lamp after 2 minutes (120,000 milliseconds)
if (lampTurnedOn && (millis() - lampTurnOnTime >= 120000)) {
digitalWrite(LAMP_RELAY, LOW); // Turn off the lamp
lampTurnedOn = false; // Reset the flag for the next day
}
delay(1000); // Wait for 0.5 seconds before updating
}