#include <LiquidCrystal.h>
//Defining the led pins
int wash_led_pin = 2;
int rinse_led_pin = 3;
int spin_led_pin = 4;
int wash_button_pin = 7;
int rinse_button_pin = 8;
int spin_button_pin = 9;
unsigned long startTime = 0;
unsigned long elapsedTime = 0;
unsigned long countdownTime = 0;
bool isPaused = false;
bool isRunning = false;
int toggle_start_pause_pin = 5;
int last_toggle_start_pause_pin_state = LOW;
int cur_toggle_start_pause_pin_state = LOW;
int toggle_on_off_pin = 6;
int last_toggle_on_off_pin_state = LOW;
int cur_toggle_on_off_pin_state = LOW;
bool stop_flag = false;
bool toggle_start_pause_flag = false ;
bool toggle_on_off_flag = false;
bool is_button_pressed = false;
bool wash_button_flag = false;
bool rinse_button_flag = false;
bool spin_button_flag = false;
unsigned long remainingTime = 0;
unsigned long seconds = 0;
unsigned long minutes = 0;
LiquidCrystal lcd(10, 11, 12, 13, 14, 15);
void setup() {
//LED pins
pinMode(wash_led_pin, OUTPUT);
digitalWrite(wash_led_pin, LOW);
pinMode(rinse_led_pin, OUTPUT);
digitalWrite(rinse_led_pin, LOW);
pinMode(spin_led_pin, OUTPUT);
digitalWrite(spin_led_pin, LOW);
//Button pins
pinMode(toggle_start_pause_pin, INPUT_PULLUP);
pinMode(toggle_on_off_pin, INPUT_PULLUP);
pinMode(wash_button_pin, INPUT_PULLUP);
pinMode(rinse_button_pin, INPUT_PULLUP);
pinMode(spin_button_pin, INPUT_PULLUP);
//initialize lcd
lcd.begin(16, 2);
lcd.print("START");
}
int debounce(int last, int button_port)
{
int current = digitalRead(button_port);
if (last != current)
{
delay(10);
current = digitalRead(button_port);
}
return current;
}
void loop() {
//check if start/pause button is pressed
last_toggle_start_pause_pin_state = cur_toggle_start_pause_pin_state;
cur_toggle_start_pause_pin_state = debounce(last_toggle_start_pause_pin_state, toggle_start_pause_pin);
if (last_toggle_start_pause_pin_state == HIGH && cur_toggle_start_pause_pin_state == LOW)
{
isPaused = !isPaused;
toggle_start_pause_flag = !toggle_start_pause_flag;
is_button_pressed = !is_button_pressed;
}
if (toggle_start_pause_flag)
{
isPaused = false;
isRunning = true;
}
// start timer countdown when wash cycle is selected
if (wash_button_pin == LOW && rinse_button_pin == HIGH && spin_button_pin == HIGH)
{
if (is_button_pressed){
wash_button_flag = !wash_button_flag;
}
else {
wash_button_flag = true;
}
if (wash_button_flag && is_button_pressed) {
digitalWrite(wash_led_pin, HIGH);
countdownTime = 300000; //5minutes for regular wash
startTime = millis();
}
}
if (wash_button_pin == HIGH && rinse_button_pin == LOW && spin_button_pin == HIGH)
{
//start countdown when rinse cycle is selected
if (is_button_pressed){
rinse_button_flag = !rinse_button_flag;
}
else {
rinse_button_flag = true;
}
if (rinse_button_flag && is_button_pressed) {
digitalWrite(rinse_led_pin, HIGH);
countdownTime = 300000; //5minutes for regular rinse cycle
startTime = millis();
}
digitalWrite(rinse_led_pin, digitalRead(rinse_button_pin));
}
if (wash_button_pin == HIGH && rinse_button_pin == HIGH && spin_button_pin == LOW)
{
//start countdown when spin cycle is selected
if (is_button_pressed){
spin_button_flag = !spin_button_flag;
}
else {
spin_button_flag = true;
}
if (spin_button_flag && is_button_pressed) {
digitalWrite(spin_led_pin, HIGH);
countdownTime = 180000;
startTime = millis();
}
digitalWrite(spin_led_pin, digitalRead(spin_button_pin));
}
//pause button
if (toggle_start_pause_flag && !is_button_pressed)
{
if (isPaused) {
isPaused = true;
isRunning = false;
//display "paused"
lcd.setCursor (0, 1);
lcd.print("Paused");
is_button_pressed = true;
}
//resume operation
if (!isPaused)
{
//display timer countdown on lcd
lcd.setCursor(0, 1);
lcd.print("Time left: ");
elapsedTime - millis() - startTime;
remainingTime = countdownTime - elapsedTime;
seconds = remainingTime / 1000;
minutes = seconds / 60;
seconds = seconds % 60;
lcd.print(minutes);
lcd.print(":");
lcd.print(seconds);
}
else if (remainingTime <= 0) {
isRunning = false;
//turn off all leds and clear lcd when the machine is turned off
digitalWrite(wash_led_pin, HIGH);
digitalWrite(rinse_led_pin, HIGH);
digitalWrite(spin_led_pin, HIGH);
lcd.clear();
lcd.print("END");
isRunning = false;
isPaused = false;
}
}
}
//on/off button