#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 16x2 display
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pin definitions
const int relayPin = 8;
const int redLEDPin = 10;
const int greenLEDPin = 11;
void setup() {
// Initialize the LCD
lcd.begin(16, 2);
lcd.backlight();
// Initialize the pins
pinMode(relayPin, OUTPUT);
pinMode(redLEDPin, OUTPUT);
pinMode(greenLEDPin, OUTPUT);
// Initialize the relay and LEDs off
digitalWrite(relayPin, LOW);
digitalWrite(redLEDPin, LOW);
digitalWrite(greenLEDPin, LOW);
}
void loop() {
// Relay off for 1 hour (3600 seconds)
controlRelayAndDisplay(false, 3600);
// Relay on for 10 seconds
controlRelayAndDisplay(true, 10);
}
void controlRelayAndDisplay(bool relayState, int duration) {
unsigned long startTime = millis();
while (millis() - startTime < duration * 1000) {
unsigned long currentTime = millis();
int elapsedTime = (currentTime - startTime) / 1000;
int remainingTime = duration - elapsedTime;
if (relayState) {
// Relay on, green LED slower blink
digitalWrite(relayPin, HIGH);
digitalWrite(greenLEDPin, millis() % 400 < 200 ? HIGH : LOW); // Blink every 200ms
digitalWrite(redLEDPin, LOW);
lcd.setCursor(0, 0);
lcd.print("Valve Open ");
} else {
// Relay off, red LED slow blink
digitalWrite(relayPin, LOW);
digitalWrite(greenLEDPin, LOW);
digitalWrite(redLEDPin, millis() % 1000 < 500 ? HIGH : LOW); // Blink every 500ms
lcd.setCursor(0, 0);
lcd.print("Valve Closed ");
}
// Display remaining time in hours and minutes
int hours = remainingTime / 3600;
int minutes = (remainingTime % 3600) / 60;
int seconds = remainingTime % 60;
lcd.setCursor(0, 1);
lcd.print("Time: ");
lcd.print(hours);
lcd.print("h ");
lcd.print(minutes);
lcd.print("m ");
lcd.print(seconds);
lcd.print("s ");
}
}