/* @1, 0, 13, 11, 11, 12
F% Wmode Wtime Stime Rtime Stime */
#include <TimeLib.h>
time_t prevDisplay = 0;
unsigned long refTm, remTm, rotateTm;
int mONa[]={500,3000,4000},mOFFa[]={500,2500,2500};
int mON, mOFF,rotate;
long wTma[]={0,11000,16000,21000},rTma[]={0,10000,14000,17000};
long sTma[]={0,10000,15000,20000},fTma[]={10000,13000,15000,20000};
long wTm, rTm, sTm, sTmL, fTm;
// drain time, wash time, rinse time, spin time, long spin time, fill time
long sWait=3000, sWaitL=12000, dTm=15000, dWait=3000;
bool fill_1, wash_1, drain_1, spin_1;
bool fill_2, wash_2, drain_2, spin_2;
bool fill_3, wash_3, drain_3, spin_3;
bool start, mRun, dON, finish, running;
bool pauseP,resumeP,initPause,critical;
String cmd = "@2,1,12,11,11,12";
// F% Wmode Wtime Stime Rtime Stime
void setup() {
Serial.begin(115200);
Serial.println("Compile OK!");
pinMode(19,OUTPUT); //cw wash and rinse
pinMode(21, OUTPUT); //ccw
pinMode(25, OUTPUT); //drain
pinMode(26, OUTPUT); // fill
pinMode(27, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
init();
}
void cw(int x){
digitalWrite(21,x);
}
void ccw(int x){
digitalWrite(19,x);
}
void drn(int x) {
digitalWrite(25,x);
}
void fl(int x) {
digitalWrite(26,x);
}
bool wash(long x){
if (start) {
Serial.println("wash start "+String(x));
rotate=1; refTm=millis(); cw(1);
rotateTm=millis(); start = false; mRun=true;}
if (millis() - refTm < x and mRun) {
if (rotate==1 and millis()-rotateTm>mON) {
rotate=2 ; rotateTm=millis(); cw(0);}
else if (rotate==2 and millis()-rotateTm >mOFF) {
rotate=3 ; rotateTm=millis(); ccw(1);}
else if (rotate==3 and millis()-rotateTm >mON) {
rotate=4 ; rotateTm=millis(); ccw(0);}
else if (rotate==4 and millis()-rotateTm >mOFF) {
rotate=1 ; rotateTm=millis(); cw(1);}
}
else if (millis() - refTm > x and mRun) {
Serial.println("motor off - motor wait "+String(sWait));
ccw(0);cw(0); mRun=false; refTm=millis();critical=1;}
if (millis() - refTm > sWait and !mRun) {
Serial.println("wash end");
finish=true; start=true; }
return finish;
}
bool spin(long x) {
if (start) {
start = false; cw(1); refTm=millis(); mRun=1;
Serial.println("spin start "+String(x));
}
else if (millis() - refTm > x and mRun) {
Serial.println("motor off - spin wait "+String(sWaitL));
cw(0); refTm=millis(); mRun=false; critical=true;}
else if (millis() - refTm > sWaitL and !mRun) {
Serial.println("drain close - spin end");
start=true; finish=true; drn(0);}
return finish;
}
bool drain() {
if (start) {
refTm=millis(); drn(1); start = false; dON=true;}
else if (millis() - refTm > dTm and dON) {
Serial.println("drain wait "+String(dWait));
refTm=millis(); dON=false; critical=1;}
else if (millis() - refTm > dWait and !dON) {
Serial.println("Drain End");
start=true; finish=true;}
return finish;
}
bool fill() {
if (start) {
Serial.println("valve open/drain closed - fill start "+String(fTm));
refTm=millis(); drn(0); fl(1); start = false;}
if (millis() - refTm > fTm) {
Serial.println("valve closed - fill end");
fl(0); start=true; finish=true;}
return finish;
}
void display(String s, long n) {
int pr=(double)(millis()-refTm)/n*100;
if (now() != prevDisplay) {prevDisplay = now();
Serial.print(s);Serial.print(pr);Serial.println("%");}
}
void spinTwo(int a) {
if (spin(a)) {critical=0; spin_2=false; finish=false; drn(0);}
else if (mRun) { display("Spin Two : ",sTmL);}
else {display("Spindown: ",sWaitL);}
}
void drainTwo(){
if (drain()) {drain_2=false; finish=false; critical=0;}
if (dON){display("Drain Two : ",dTm);}
}
void washTwo(int a) {
if (wash(a)) {critical=0; wash_2 =false; finish=false;}
if (mRun) {display("Rinse : ",rTm);}
}
void fillTwo() {
if (fill()) {fill_2 =false; finish=false;}
display("Fill Two : ",fTm);
}
void spinOne(int a) {
if (spin(a)) {critical=0; spin_1=false; finish=false; drn(0);}
else if (mRun) { display("Spin One : ",sTm);}
else {display("Spindown: ",sWaitL);}
}
void drainOne(){
if (drain()) {drain_1=false; finish=false;critical=0;}
if (dON){display("Drain One : ",dTm);}
}
void washOne(int a) {
if (wash(a)) {critical=0; wash_1 =false; finish=false;}
if (mRun) {display("Wash : ",wTm);}
}
void fillOne() {
if (fill()) {fill_1 =false; finish=false;}
display("Fill One : ",fTm);
}
void init(){
start = 0;
fill_1 = 0; wash_1 = 0; drain_1 = 0; spin_1 = 0;
fill_2 = 0; wash_2 = 0; drain_2 = 0; spin_2 = 0;
fill_3 = 0; wash_3 = 0; drain_3 = 0; spin_3 = 0;
}
void start_(){
// @1, 0, 13, 11, 11, 12
start = 1;
fill_1 = cmd.substring(5,6).toInt();
fTm = fTma[cmd.substring(1,2).toInt()];
mON = mONa[cmd.substring(3,4).toInt()];
mOFF = mOFFa[cmd.substring(3,4).toInt()];
wash_1 = fill_1;
wTm = wTma[cmd.substring(6,7).toInt()];
drain_1 = cmd.substring(8,9).toInt();
spin_1 = drain_1;
sTm = sTma[cmd.substring(9,10).toInt()];
fill_2 = cmd.substring(11,12).toInt();
wash_2 = fill_2;
rTm = rTma[cmd.substring(12,13).toInt()];
drain_2 = cmd.substring(14,15).toInt();
spin_2 = drain_2;
sTmL = sTma[cmd.substring(15,16).toInt()];
}
void pauseProg(){
if (initPause){
remTm=millis()-refTm-1000; initPause=0;
if (fill_1) {fl(0);}
else if (wash_1) {cw(0);ccw(0);}
else if (drain_1) { drn(0);}
else if (spin_1) {cw(0);}
else if (fill_2) {fl(0);}
else if (wash_2) {cw(0);ccw(0);}
else if (drain_2) { drn(0);}
else if (spin_2) {cw(0);}
}
}
void resumeProg(){
Serial.println("resumming---");
resumeP=0; refTm=millis()-remTm;
if (fill_1) {fl(1);}
else if (wash_1) {rotate=1;}
else if (drain_1) {drn(1);}
else if (spin_1) {cw(1);}
else if (fill_2) {fl(1);}
else if (wash_2) {rotate=1;}
else if (drain_2) {drn(1);}
else if (spin_2) {cw(1);}
}
void checkPause(){
if (critical) return;
if (!digitalRead(5)) {
pauseP=!pauseP;
delay(1000);
if (pauseP) {Serial.println("pause"); initPause=1;}
else {Serial.println("resume"); resumeP=1;}
}
}
void checkStart(){
if (running) return;
if (!digitalRead(27)) {
start_();running=true;
}
}
void runCycle() {
if (pauseP) pauseProg();
else if (resumeP) resumeProg();
else if (fill_1) fillOne();
else if (wash_1) washOne(wTm);
else if (drain_1) drainOne();
else if (spin_1) spinOne(sTm);
else if (fill_2) fillTwo();
else if (wash_2) washTwo(rTm);
else if (drain_2) drainTwo();
else if (spin_2) spinTwo(sTmL);
else return;
}
void loop() {
runCycle();
delay(10); // this speeds up the simulation
checkPause(); checkStart();
}