// https://forum.arduino.cc/t/resetting-or-zeroing-the-millis-at-end-of-each-cycle/1221287
// https://wokwi.com/projects/389208574598473729
enum states
{
RELAY0,
RELAY1,
RELAY2
};
byte currentState = RELAY0;
unsigned long stateStartTime;
unsigned long currentTime;
int currentPeriod = 1000;
const byte buttonPin = A3;
void setup()
{
Serial.begin(115200);
pinMode(buttonPin, INPUT_PULLUP);
printCurrent(currentState, "waiting for button");
}
void loop()
{
currentTime = millis();
switch (currentState)
{
case RELAY0:
if (digitalRead(buttonPin) == LOW)
{
currentState = RELAY1;
currentPeriod = 2000;
stateStartTime = currentTime;
printCurrent(currentState, currentPeriod);
}
break;
case RELAY1:
if (currentTime - stateStartTime >= currentPeriod)
{
currentState = RELAY2;
currentPeriod = 1000;
stateStartTime = currentTime;
printCurrent(currentState, currentPeriod);
}
break;
case RELAY2:
if (currentTime - stateStartTime >= currentPeriod)
{
currentState = RELAY0;
currentPeriod = 3000;
stateStartTime = currentTime;
printCurrent(currentState, "waiting for button");
}
break;
}
}
void printCurrent(byte state, int period)
{
Serial.print("in state ");
Serial.print(state);
Serial.print(" for ");
Serial.println(period);
}
void printCurrent(byte state, char *message)
{
Serial.print("in state ");
Serial.print(state);
Serial.print(" ");
Serial.println(message);
}