#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 16 char and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int RELAY_PIN = 8; // Relay connected to pin 8
const int GREEN_LED_PIN = 9; // Green LED connected to pin 9
const int RED_LED_PIN = 10; // Red LED connected to pin 10
const int BUZZER_PIN = 11; // Buzzer connected to pin 11
const unsigned long RELAY_ON_DURATION = 10000; // 10 seconds
const unsigned long RELAY_OFF_DURATION = 20000; // 20 seconds
unsigned long relayOnStartTime = 0;
unsigned long relayOffStartTime = 0;
unsigned long lastUpdate = 0;
unsigned long blinkTimer = 0;
bool isRelayOn = false;
int blinkCount = 0;
void setup() {
pinMode(RELAY_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
pinMode(RED_LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW); // Turn off the relay initially
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(RED_LED_PIN, HIGH);
noTone(BUZZER_PIN);
lcd.begin(16, 2); // Initialize the LCD with 16 columns and 2 rows
lcd.backlight();
lcd.clear();
}
void loop() {
unsigned long currentMillis = millis();
if (!isRelayOn && currentMillis - relayOffStartTime >= RELAY_OFF_DURATION) {
// Turn on the relay, green LED, and buzzer
digitalWrite(RELAY_PIN, HIGH);
tone(BUZZER_PIN, 2000, 500);
// Display "Valve Open" and the timer
lcd.clear();
lcd.print("Valve Open");
// Update the relay on start time and state
relayOnStartTime = currentMillis;
isRelayOn = true;
blinkCount = 0; // Reset blink count
blinkTimer = currentMillis;
}
if (isRelayOn && currentMillis - relayOnStartTime >= RELAY_ON_DURATION) {
// Turn off the relay, green LED, and buzzer
digitalWrite(RELAY_PIN, LOW);
noTone(BUZZER_PIN);
// Display "Valve Close" and the timer
lcd.clear();
lcd.print("Valve Close");
// Update the relay off start time and state
relayOffStartTime = currentMillis;
isRelayOn = false;
blinkCount = 0; // Reset blink count
blinkTimer = currentMillis;
}
// Blink LEDs in a 3-blink pattern with slower intervals
if (isRelayOn) {
if (currentMillis - blinkTimer >= 500) { // Every 500ms
digitalWrite(GREEN_LED_PIN, HIGH);
delay(200); // On duration for each blink
digitalWrite(GREEN_LED_PIN, LOW);
blinkTimer = currentMillis;
blinkCount++;
}
} else {
if (currentMillis - blinkTimer >= 500) { // Every 500ms
digitalWrite(RED_LED_PIN, HIGH);
delay(200); // On duration for each blink
digitalWrite(RED_LED_PIN, LOW);
blinkTimer = currentMillis;
blinkCount++;
}
}
// Reset blinkCount after 3 blinks
if (blinkCount >= 3) {
blinkTimer = currentMillis + 1000; // Add delay for pause
blinkCount = 0;
}
// Update the timer display every second
if (currentMillis - lastUpdate >= 1000) {
lastUpdate = currentMillis;
if (isRelayOn) {
updateTimer(relayOnStartTime, RELAY_ON_DURATION);
} else {
updateTimer(relayOffStartTime, RELAY_OFF_DURATION);
}
}
}
void updateTimer(unsigned long startTime, unsigned long duration) {
unsigned long currentMillis = millis();
unsigned long elapsedTime = currentMillis - startTime;
unsigned long secondsRemaining = (duration - elapsedTime) / 1000;
unsigned long minutes = secondsRemaining / 60;
unsigned long seconds = secondsRemaining % 60;
lcd.setCursor(0, 1);
lcd.print("Timer: ");
lcd.print(minutes);
lcd.print(":");
if (seconds < 10) {
lcd.print("0");
}
lcd.print(seconds);
}