#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// LCD I2C address and size
#define LCD_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
// Define pins for buttons and relays
const int startButtonPin = 2;
const int pauseButtonPin = 3;
const int functionButtonPin = 4;
const int relay1Pin = 5; // Lift
const int relay2Pin = 6; // Pause
const int relay3Pin = 7; // Right
const int relay4Pin = 8; // Pause
// Timing constants
const unsigned long waterFillDuration = 30000; // 30 seconds
const unsigned long function1Duration = 4000; // 400 seconds
const unsigned long function2Duration = 5000; // 500 seconds
const unsigned long function3Duration = 6000; // 600 seconds
// State variables
bool running = false;
bool paused = false;
int currentFunction = 1;
unsigned long startTime = 0;
unsigned long waterFillStartTime = 0;
// Function durations
unsigned long currentDuration = function1Duration;
// LCD
LiquidCrystal_I2C lcd(LCD_ADDR, LCD_COLUMNS, LCD_ROWS);
void setup() {
// Initialize pins
pinMode(startButtonPin, INPUT_PULLUP);
pinMode(pauseButtonPin, INPUT_PULLUP);
pinMode(functionButtonPin, INPUT_PULLUP);
pinMode(relay1Pin, OUTPUT);
pinMode(relay2Pin, OUTPUT);
pinMode(relay3Pin, OUTPUT);
pinMode(relay4Pin, OUTPUT);
// Initialize LCD
lcd.init();
lcd.backlight();
// Display initial message
lcd.setCursor(0, 0);
lcd.print("Washing Machine");
lcd.setCursor(0, 1);
lcd.print("Ready");
}
void loop() {
// Button debouncing
if (digitalRead(startButtonPin) == LOW) {
if (!running) {
startCycle();
}
delay(200); // Debounce delay
}
if (digitalRead(pauseButtonPin) == LOW) {
if (running) {
paused = !paused;
delay(200); // Debounce delay
}
}
if (digitalRead(functionButtonPin) == LOW) {
changeFunction();
delay(200); // Debounce delay
}
if (running) {
unsigned long currentTime = millis();
if (!paused) {
if (currentTime - waterFillStartTime < waterFillDuration) {
// Water fill phase
lcd.setCursor(0, 1);
lcd.print("Water Fill ");
} else if (currentTime - startTime < currentDuration) {
// Relay control phase
handleRelays(currentTime);
lcd.setCursor(0, 1);
lcd.print("Cycle Running ");
} else {
// Cycle complete
lcd.setCursor(0, 1);
lcd.print("Cycle Complete");
running = false;
digitalWrite(relay1Pin, LOW);
digitalWrite(relay2Pin, LOW);
digitalWrite(relay3Pin, LOW);
digitalWrite(relay4Pin, LOW);
}
} else {
lcd.setCursor(0, 1);
lcd.print("Paused ");
}
}
}
void startCycle() {
running = true;
paused = false;
startTime = millis();
waterFillStartTime = millis();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Starting Cycle");
delay(1000); // Display message for 1 second
}
void handleRelays(unsigned long currentTime) {
unsigned long elapsed = currentTime - waterFillStartTime - waterFillDuration;
unsigned long cycleTime = elapsed % (20 + 10 + 20 + 10) * 1000;
if (cycleTime < 20000) {
digitalWrite(relay1Pin, HIGH); // Lift
digitalWrite(relay2Pin, LOW);
digitalWrite(relay3Pin, LOW);
digitalWrite(relay4Pin, LOW);
} else if (cycleTime < 30000) {
digitalWrite(relay1Pin, LOW);
digitalWrite(relay2Pin, HIGH); // Pause
digitalWrite(relay3Pin, LOW);
digitalWrite(relay4Pin, LOW);
} else if (cycleTime < 50000) {
digitalWrite(relay1Pin, LOW);
digitalWrite(relay2Pin, LOW);
digitalWrite(relay3Pin, HIGH); // Right
digitalWrite(relay4Pin, LOW);
} else {
digitalWrite(relay1Pin, LOW);
digitalWrite(relay2Pin, LOW);
digitalWrite(relay3Pin, LOW);
digitalWrite(relay4Pin, HIGH); // Pause
}
}
void changeFunction() {
currentFunction++;
if (currentFunction > 3) {
currentFunction = 1;
}
switch (currentFunction) {
case 1:
currentDuration = function1Duration;
break;
case 2:
currentDuration = function2Duration;
break;
case 3:
currentDuration = function3Duration;
break;
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Function ");
lcd.print(currentFunction);
lcd.setCursor(0, 1);
lcd.print("Duration: ");
lcd.print(currentDuration / 1000);
lcd.print("s");
delay(1000); // Display message for 1 second
}