OK, I have an FSM that looks pretty good however I am having trouble resetting the elapsed time variable.
It works the first time thru the loop but the second iteration does not stop because its value is greater than 10. What am i missing. Do I need a separate variable for each timer?
// system states
#define WAITING 0
#define FILLING 1
#define STIRRING 2
#define DRAINING 3
#define ABORT 4
const int Pump1 = 10;
const int Valve1 = 11;
const int Stirrer1 = 12;
const int alternatorPin = 2;
int state = WAITING; // master variable for the state machine
int fill_seconds = 10;
int startTime;
int new_elapsed_seconds;
int elapsed_seconds;
void setup()
{
startTime = millis();
pinMode(Pump1, OUTPUT);
pinMode(Valve1, OUTPUT);
pinMode(Stirrer1, OUTPUT);
pinMode(alternatorPin,INPUT);
Stop(); // Make sure everything is set correctly
Serial.begin(9600);
}
void loop()
{
switch(state)
{
case WAITING:
HandleWAITINGState();
break;
case FILLING:
new_elapsed_seconds = (millis() - startTime) / 1000;
if (new_elapsed_seconds != elapsed_seconds)
{
elapsed_seconds = new_elapsed_seconds;
Serial.println( elapsed_seconds);
if (elapsed_seconds == fill_seconds)
{
//startTime = 0;
//new_elapsed_seconds = 0;
//elapsed_seconds = 0;
Serial.println("Done Filling");
Serial.println( elapsed_seconds);
Serial.println( new_elapsed_seconds);
state=STIRRING;
}
}
HandleFILLINGState();
break;
case STIRRING:
HandleSTIRRINGState();
break;
case DRAINING:
HandleDRAININGState();
break;
default:
Serial.print("Unknown State: ");
Serial.println(state);
Stop(); // Should never get here
break;
}
}
void HandleWAITINGState()
{
if (Serial.available() > 0)
{
Serial.read(); // I wonder if this should be flush
Serial.println("");
Serial.println("Waiting");
state=FILLING;
}
}
void HandleFILLINGState()
{
digitalWrite(Pump1,HIGH);
digitalWrite(Valve1,LOW);
digitalWrite(Stirrer1,LOW);
}
void HandleSTIRRINGState()
{
Serial.println("STIRRING");
state=DRAINING;
}
void HandleDRAININGState()
{
Serial.println("DRAINING");
state=WAITING;
}
void abort()
{
Serial.println("ABORT");
state=WAITING;
}