/*
Name: arduinoTest.ino
Created: 6/7/2022 7:33:46 PM
Author: jackm
*/
unsigned long now = 0;
char on = HIGH, off = LOW, Read = 2;
bool done = true;
volatile bool STOP = false;
const char
istop = 2,
//dButton reset button
uButton = 3,
sSwitch = 4,
dSwitch = 5, //white wire broken
Left = 7,
Right = 6,
Fill = 8,
Spin = 9;
void setup() {
pinMode(Left, OUTPUT); // sets the digital pins as output
pinMode(Right, OUTPUT);
pinMode(Fill, OUTPUT);
pinMode(Spin, OUTPUT);
pinMode(13, OUTPUT);
pinMode(uButton, INPUT_PULLUP);
pinMode(sSwitch, INPUT_PULLUP);
pinMode(dSwitch, INPUT_PULLUP);
pinMode(istop, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(istop), Stop_button, CHANGE);
}
void Stop_button() {
DR(13, on);
if (digitalRead(istop) == HIGH) {
delayMicroseconds(5);
if (digitalRead(istop) == HIGH)
{
STOP = true;
SafeStop();
}
}
DR(13, off);
}
bool SafeStop() {
while (STOP == true)
{
DR(13, on);
DR(Left, off);
DR(Right, off);
DR(Fill, off);
delayMicroseconds(40000);
DR(Spin, off);
if (DR(uButton, Read) == off)
{
STOP = false;
DR(13, off);
return true;
}
}
return false;
}
// the loop function runs over and over again until power down or reset
void loop() {
wait();
if (DR(sSwitch, Read) == off) {
Rinse_spin();
}
else
{
fill(5UL * 60000UL); //5UL * 60000UL
wash(40UL * 60000UL);
Rinse_spin();
fill(5UL * 60000UL);
wash(5UL * 60000UL);
Rinse_spin();
}
Done();
}
char DR(char pin, char switch_read) {
if (switch_read == Read) {
return digitalRead(pin);
}
else if (digitalRead(pin) != switch_read)
{
digitalWrite(pin, switch_read);
Serial.print("switched "); Serial.println(pin, DEC); Serial.println(switch_read, DEC);
}
}
bool fill(unsigned long time) {
unsigned long time_set = 0;
bool filling = true;
DR(Left, off);
DR(Right, off);
DR(Spin, off);
DR(Fill, off);
//noInterrupts();
while (filling == true)
{
now = millis();
if (time_set == 0)
{
Serial.print("filling "); Serial.println();
time_set = millis();
}
else if (now - time_set < time)
{
DR(Fill, on);
}
else if (now - time_set > time) {
Serial.write("done "); Serial.println();
DR(Fill, off);
time_set = 0;
break;
}
}
return done;
}
bool wash(unsigned long time) {
bool wash = true;
unsigned long timeSet = 0, time_set = 0;
char washPin = 0;
const unsigned long agTime = 800;
if (timeSet == 0) {
timeSet = millis();
}
DR(Left, off);
DR(Right, off);
DR(Spin, off);
DR(Fill, off);
while (wash == true) {
now = millis();
if (now - time_set >= agTime) {
switch (washPin)
{
case 0: digitalWrite(Left, HIGH); washPin = 1; time_set = now;
Serial.write("left "); Serial.println();
break;
case 1: digitalWrite(Left, LOW); washPin = 2; time_set = now;
break;
case 2: digitalWrite(Right, HIGH); washPin = 3; time_set = now;
Serial.write("right "); Serial.println();
break;
case 3: digitalWrite(Right, LOW); washPin = 4; time_set = now;
break;
case 4: time_set = now; washPin = 5;
break;
case 5: time_set = now; washPin = 0;
Serial.println();
break;
default:
break;
}
}
else if (now - timeSet > time) {
DR(Right, off);
DR(Left, off);
break;
}
}
return done;
}
void Rinse_spin() {
bool Do_once = false;
bool spin = true;
unsigned long timeSet = 0, time_set = 0, sec = 1000, minNow = 0, now =0 ;
char spinSpeed = 2;
const unsigned long drain = 250000;
bool AB = true;
DR(Left, off);
DR(Right, off);
DR(Spin, off);
DR(Fill, off);
//interrupts();
if (timeSet == 0) {
timeSet = millis() / 60000UL;
Serial.print("spin start "); Serial.println();
}
while (spin == true) {
if (Do_once == false) {
DR(Spin, on);
Serial.print("drain start");
Do_once = true; Serial.println(" drain delay done ");
}
if (DR(sSwitch, Read) == off) {
minNow = (millis() / 60000UL) - timeSet + 3;
}
else {
minNow = (millis() / 60000UL) - timeSet;
}
if (DR(Spin, Read) == off) {
DR(Spin, on);
delay(4000);
}
switch (minNow)
{
case 3:
now = millis() % 3000;
if (now < 2000) {
DR(Left, on);
}
else if (now > 2000) {
DR(Left, off);
}
break;
case 4:
DR(Left, on);
break;
case 6:
DR(Left, off);
return;
}
}
}
void wait()
{
unsigned long now = 0;
static bool
Do_once = false,
Wait = true;
while (Wait == true)
{
now = millis() % 400;
if (Do_once == false) {
digitalWrite(Right, LOW);
digitalWrite(Spin, LOW);
digitalWrite(Left, LOW);
Do_once = true;
}
else if (DR(uButton, Read) == off)
{
Do_once = false;
DR(13, off);
break;
}
else if (now < 200) {
DR(13, on);
}
else if (now > 200) {
DR(13, off);
}
if (DR(sSwitch, Read) == off) {
DR(Spin, on);
}
}
}
void Done() {
unsigned long now = 0;
digitalWrite(Right, LOW);
digitalWrite(Spin, LOW);
digitalWrite(Left, LOW);
Serial.print(" washing done "); Serial.println();
while (true) {
now = millis() % 2000;
if (now < 200) {
DR(13, on);
}
else if (now > 200 && now < 400) {
DR(13, off);
}
else if (now > 400 && now < 600) {
DR(13, on);
}
else if (now > 600) {
DR(13, off);
}
}
}