#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define UP_BUTTON 2
#define DOWN_BUTTON 3
#define ENTER_BUTTON 4
#define BACK_BUTTON 5
#define BUZZER 6
#define RELAY_WATER 7
#define RELAY_DRAIN 8
#define RELAY_WASH 9
#define RELAY_DRYER 10
LiquidCrystal_I2C lcd(0x27, 16, 2);
int menuIndex = 0;
int washCycles = 1;
int washTime = 1;
int waterLevel = 1;
int dryerTime = 1;
bool inProcess = false;
void setup() {
pinMode(UP_BUTTON, INPUT_PULLUP);
pinMode(DOWN_BUTTON, INPUT_PULLUP);
pinMode(ENTER_BUTTON, INPUT_PULLUP);
pinMode(BACK_BUTTON, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
pinMode(RELAY_WATER, OUTPUT);
pinMode(RELAY_DRAIN, OUTPUT);
pinMode(RELAY_WASH, OUTPUT);
pinMode(RELAY_DRYER, OUTPUT);
lcd.init();
lcd.backlight();
showWelcomeScreen();
}
void loop() {
if (!inProcess) {
showMenu();
}
}
void showWelcomeScreen() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Washing Machine");
lcd.setCursor(0, 1);
lcd.print("V1.0 Press Enter");
waitForButton(ENTER_BUTTON);
showMenu();
}
void showMenu() {
menuIndex = 0;
while (true) {
lcd.setCursor(0, 0);
lcd.print(menuIndex == 0 ? "> Wash Timer " : " Wash Timer ");
lcd.setCursor(0, 1);
lcd.print(menuIndex == 1 ? "> Dryer " : " Dryer ");
int btn = getButtonPress();
if (btn == UP_BUTTON && menuIndex > 0) menuIndex--;
if (btn == DOWN_BUTTON && menuIndex < 1) menuIndex++;
if (btn == ENTER_BUTTON) {
if (menuIndex == 0) setupWashTimer();
else setupDryer();
}
if (btn == BACK_BUTTON) return; // Implementing back button functionality
}
}
void setupWashTimer() {
lcd.clear();
lcd.print("Select Cycles:");
while (true) {
lcd.setCursor(0, 1);
lcd.print("Cycles: ");
lcd.print(washCycles);
lcd.print(" ");
int btn = getButtonPress();
if (btn == UP_BUTTON && washCycles < 4) washCycles++;
if (btn == DOWN_BUTTON && washCycles > 1) washCycles--;
if (btn == ENTER_BUTTON) break;
if (btn == BACK_BUTTON) return;
}
setupWashTime();
}
void setupWashTime() {
lcd.clear();
lcd.print("Set Wash Time");
while (true) {
lcd.setCursor(0, 1);
lcd.print("Time: ");
lcd.print(washTime);
lcd.print(" min ");
int btn = getButtonPress();
if (btn == UP_BUTTON && washTime < 10) washTime++;
if (btn == DOWN_BUTTON && washTime > 1) washTime--;
if (btn == ENTER_BUTTON) break;
if (btn == BACK_BUTTON) return;
}
setupWaterLevel();
}
void setupWaterLevel() {
lcd.clear();
lcd.print("Set Water Level");
while (true) {
lcd.setCursor(0, 1);
lcd.print("Level: ");
lcd.print(waterLevel);
lcd.print(" ");
int btn = getButtonPress();
if (btn == UP_BUTTON && waterLevel < 7) waterLevel++;
if (btn == DOWN_BUTTON && waterLevel > 1) waterLevel--;
if (btn == ENTER_BUTTON) break;
if (btn == BACK_BUTTON) return;
}
startWashingProcess();
}
void startWashingProcess() {
lcd.clear();
lcd.print("Begin Wash?");
lcd.setCursor(0, 1);
lcd.print("Press Enter");
waitForButton(ENTER_BUTTON);
for (int i = 0; i < washCycles; i++) {
lcd.clear();
lcd.print("Filling Water...");
digitalWrite(RELAY_WATER, HIGH);
delay(waterLevel * 2000);
digitalWrite(RELAY_WATER, LOW);
lcd.clear();
lcd.print("Washing...");
digitalWrite(RELAY_WASH, HIGH);
delay(washTime * 60000);
digitalWrite(RELAY_WASH, LOW);
lcd.clear();
lcd.print("Draining...");
digitalWrite(RELAY_DRAIN, HIGH);
delay(5000);
digitalWrite(RELAY_DRAIN, LOW);
}
digitalWrite(BUZZER, HIGH);
delay(3000);
digitalWrite(BUZZER, LOW);
showMenu();
}
void setupDryer() {
lcd.clear();
lcd.print("Set Dryer Time");
while (true) {
lcd.setCursor(0, 1);
lcd.print("Time: ");
lcd.print(dryerTime);
lcd.print(" min ");
int btn = getButtonPress();
if (btn == UP_BUTTON && dryerTime < 10) dryerTime++;
if (btn == DOWN_BUTTON && dryerTime > 1) dryerTime--;
if (btn == ENTER_BUTTON) break;
if (btn == BACK_BUTTON) return;
}
startDryingProcess();
}
void startDryingProcess() {
lcd.clear();
lcd.print("Drying...");
digitalWrite(RELAY_DRYER, HIGH);
for (int i = dryerTime; i > 0; i--) {
lcd.setCursor(0, 1);
lcd.print(i);
lcd.print(" min left ");
delay(60000);
}
digitalWrite(RELAY_DRYER, LOW);
digitalWrite(BUZZER, HIGH);
delay(3000);
digitalWrite(BUZZER, LOW);
showMenu();
}
int getButtonPress() {
while (true) {
if (!digitalRead(UP_BUTTON)) return debounceButton(UP_BUTTON);
if (!digitalRead(DOWN_BUTTON)) return debounceButton(DOWN_BUTTON);
if (!digitalRead(ENTER_BUTTON)) return debounceButton(ENTER_BUTTON);
if (!digitalRead(BACK_BUTTON)) return debounceButton(BACK_BUTTON);
}
}
int debounceButton(int button) {
delay(200);
while (!digitalRead(button));
return button;
}
void waitForButton(int button) {
while (digitalRead(button));
delay(200);
}