#include <LiquidCrystal.h>
//Defining the led pins
int wash_led_pin = 2;
int rinse_led_pin = 3;
int spin_led_pin = 4;
int drain_led_pin = 16;
int release_water_led_pin = 17;
int wash_button_pin = 5;
int last_toggled_wash_button_state = LOW;
int cur_toggled_wash_button_state = LOW;
int rinse_button_pin = 6;
int last_toggled_rinse_button_state = LOW;
int cur_toggled_rinse_button_state = LOW;
int spin_button_pin = 7;
int last_toggled_spin_button_state = LOW;
int cur_toggled_spin_button_state = LOW;
int start_pause_pin = 8;
int last_toggled_start_pause_button_state = LOW;
int cur_toggled_start_pause_button_state = LOW;
int on_off_pin = 9;
int last_toggled_on_off_button_state = LOW;
int cur_toggled_on_off_button_state = LOW;
LiquidCrystal lcd(10, 11, 12, 13, 14, 15);
bool release_water_flag = false;
bool drain_flag = false;
bool wash_button_flag = false;
bool rinse_button_flag = false;
bool spin_button_flag = false;
bool start_pause_button_flag = false;
bool on_off_button_flag = false;
int start_pause_button_count = 0;
unsigned long timer = 0;
unsigned long wash_minutes_timer = 4;
unsigned long rinse_minutes_timer = 21;
unsigned long spin_minutes_timer = 6;
int hours = 0;
int minutes = 0;
int seconds = 0;
int lcd_on_count = 0;
int release_water_duration_max = 0;
int release_water_duration = 2;
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(start_pause_pin, INPUT_PULLUP);
pinMode(on_off_pin, INPUT_PULLUP);
pinMode(wash_button_pin, INPUT_PULLUP);
pinMode(rinse_button_pin, INPUT_PULLUP);
pinMode(spin_button_pin, INPUT_PULLUP);
Serial.begin(9600);
}
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() {
// ON/OFF BUTTON
cur_toggled_on_off_button_state = debounce(last_toggled_on_off_button_state, on_off_pin);
if (last_toggled_on_off_button_state == HIGH && cur_toggled_on_off_button_state == LOW)
{
on_off_button_flag = !on_off_button_flag;
Serial.println(on_off_button_flag);
}
last_toggled_on_off_button_state = cur_toggled_on_off_button_state;
// START BUTTON
cur_toggled_start_pause_button_state = debounce(last_toggled_start_pause_button_state, start_pause_pin);
if (last_toggled_start_pause_button_state == HIGH && cur_toggled_start_pause_button_state == LOW)
{
if(wash_button_flag || rinse_button_flag || spin_button_flag) {
start_pause_button_flag = !start_pause_button_flag;
Serial.println(start_pause_button_flag);
start_pause_button_count += 1;
}
}
last_toggled_start_pause_button_state = cur_toggled_start_pause_button_state;
// START/PAUSE BUTTON
cur_toggled_start_pause_button_state = debounce(last_toggled_start_pause_button_state, start_pause_pin);
if (last_toggled_start_pause_button_state == HIGH && cur_toggled_start_pause_button_state == LOW)
{
start_pause_button_flag = !start_pause_button_flag;
Serial.println(start_pause_button_flag);
start_pause_button_count += 1;
}
last_toggled_start_pause_button_state = cur_toggled_start_pause_button_state;
// WASH BUTTON
cur_toggled_wash_button_state = debounce(last_toggled_wash_button_state, wash_button_pin);
if (last_toggled_wash_button_state == HIGH && cur_toggled_wash_button_state == LOW)
{
if(!start_pause_button_flag && !rinse_button_flag && !spin_button_flag) {
wash_button_flag = !wash_button_flag;
Serial.println(wash_button_flag);
}
if(wash_button_flag && !start_pause_button_flag) {
lcd.clear();
lcd.print(" WASH MODE");
}
}
last_toggled_wash_button_state = cur_toggled_wash_button_state;
// RINSE BUTTON green
cur_toggled_rinse_button_state = debounce(last_toggled_rinse_button_state, rinse_button_pin);
if (last_toggled_rinse_button_state == HIGH && cur_toggled_rinse_button_state == LOW)
{
if(!start_pause_button_flag && !wash_button_flag && !spin_button_flag) {
rinse_button_flag = !rinse_button_flag;
Serial.println(rinse_button_flag);
}
if(rinse_button_flag && !start_pause_button_flag) {
lcd.clear();
lcd.print(" RINSE MODE");
}
}
last_toggled_rinse_button_state = cur_toggled_rinse_button_state;
// SPIN BUTTON
cur_toggled_spin_button_state = debounce(last_toggled_spin_button_state, spin_button_pin);
if (last_toggled_spin_button_state == HIGH && cur_toggled_spin_button_state == LOW)
{
if(!start_pause_button_flag && !rinse_button_flag && !wash_button_flag) {
spin_button_flag = !spin_button_flag;
Serial.println(spin_button_flag);
}
if(spin_button_flag && !start_pause_button_flag) {
lcd.clear();
lcd.print(" SPIN MODE");
}
}
last_toggled_spin_button_state = cur_toggled_spin_button_state;
if(!on_off_button_flag) {
digitalWrite(wash_led_pin, LOW);
digitalWrite(rinse_led_pin, LOW);
digitalWrite(spin_led_pin, LOW);
wash_button_flag = false;
rinse_button_flag = false;
spin_button_flag = false;
start_pause_button_flag = false;
seconds = 0;
start_pause_button_count = 0;
lcd_on_count = 0;
lcd.noDisplay();
}
else {
if(lcd_on_count == 0) {
//initialize lcd
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print(" WELCOME!");
lcd.setCursor(0, 1);
lcd.print(" SELECT MODE");
lcd_on_count +=1;
}
//release water
if (release_water_flag) {
digitalWrite(release_water_led_pin, HIGH);
}
if(!release_water_flag){
digitalWrite(release_water_led_pin, LOW);
}
if(wash_button_flag && start_pause_button_flag) {
wash_helper_func();
// rinse_helper_func();
// spin_helper_func();
}
if(wash_button_flag && !start_pause_button_flag && start_pause_button_count > 0) {
digitalWrite(wash_led_pin, LOW);
delay(100);
digitalWrite(wash_led_pin, HIGH);
delay(100);
}
if(rinse_button_flag && start_pause_button_flag) {
rinse_helper_func();
spin_helper_func();
}
if(rinse_button_flag == HIGH && start_pause_button_flag == LOW && start_pause_button_count !=0) {
digitalWrite(rinse_led_pin, LOW);
delay(100);
digitalWrite(rinse_led_pin, HIGH);
delay(100);
}
if(spin_button_flag == HIGH && start_pause_button_flag == HIGH) {
spin_helper_func();
}
if(spin_button_flag == HIGH && start_pause_button_flag == LOW && start_pause_button_count !=0) {
digitalWrite(spin_led_pin, LOW);
delay(100);
digitalWrite(spin_led_pin, HIGH);
delay(100);
}
//drain water
if(drain_flag) {
digitalWrite(drain_led_pin, HIGH);
}
}
}
void wash_helper_func(){
if(digitalRead(wash_led_pin) == LOW) {
digitalWrite(wash_led_pin, HIGH);
release_water_duration_max = wash_minutes_timer;
}
if(wash_minutes_timer <=release_water_duration_max && wash_minutes_timer > release_water_duration_max-release_water_duration && seconds <=0 ) {
release_water_flag = true;
}
if (wash_minutes_timer <= release_water_duration_max - release_water_duration){
release_water_flag = false;
}
if(seconds > 0) {
if ( millis() - timer >= 962)
{
timer = timer + 963;
seconds -= 1;
Serial.println(seconds);
delay(10);
}
}
if ( seconds <= 0) {
if ( millis() - timer >= 962)
{
timer = timer + 962;
seconds = 59;
wash_minutes_timer = wash_minutes_timer - 1;
}
}
if(wash_minutes_timer > 0 && wash_minutes_timer <= 2 && seconds <= 0) {
drain_flag = true;
}
if (wash_minutes_timer <= 0 && seconds <= 0) {
timer = timer + 962;
if ( millis() - timer >= 962)
{
start_pause_button_count = 0;
wash_button_flag = LOW;
start_pause_button_flag = LOW;
drain_flag = false;
rinse_helper_func();
}
}
lcd.setCursor(0, 0);
lcd.print("WASH MINS REMAINING");
lcd.setCursor(0, 1);
lcd.print(wash_minutes_timer);
}
void rinse_helper_func() {
digitalWrite(rinse_led_pin, HIGH);
if(rinse_minutes_timer <=21 && rinse_minutes_timer > 18 && seconds <=0 ) {
release_water_flag = true;
}
if (rinse_minutes_timer <= 18){
release_water_flag = false;
}
if(seconds > 0) {
if ( millis() - timer >= 962)
{
timer = timer + 963;
seconds -= 1;
Serial.println(seconds);
delay(10);
}
}
if ( seconds <= 0) {
if ( millis() - timer >= 962){
timer = timer + 962;
seconds = 59;
rinse_minutes_timer = rinse_minutes_timer - 1;
}
}
if(rinse_minutes_timer > 0 && rinse_minutes_timer <= 5 && seconds <= 0) {
drain_flag = true;
}
if (rinse_minutes_timer <= 0 && seconds <= 0) {
timer = timer + 962;
if ( millis() - timer >= 962)
{
start_pause_button_count = 0;
rinse_button_flag = LOW;
start_pause_button_flag = LOW;
}
}
lcd.setCursor(0, 0);
lcd.print("RINSE MINS REMAINING");
lcd.setCursor(0, 1);
lcd.print(rinse_minutes_timer);
}
void spin_helper_func() {
digitalWrite(spin_led_pin, HIGH);
if(seconds > 0) {
if ( millis() - timer >= 962)
{
timer = timer + 963;
seconds -= 1;
Serial.println(seconds);
delay(10);
}
}
if ( seconds <= 0) {
if ( millis() - timer >= 962)
{
timer = timer + 962;
seconds = 59;
spin_minutes_timer = spin_minutes_timer - 1;
}
}
if (spin_minutes_timer <= 0 && seconds <= 0) {
timer = timer + 962;
if ( millis() - timer >= 962)
{
start_pause_button_count = 0;
spin_button_flag = LOW;
start_pause_button_flag = LOW;
}
}
lcd.setCursor(0, 0);
lcd.print("MINUTES REMAINING");
lcd.setCursor(0, 1);
lcd.print(spin_minutes_timer);
}