/*
Forum: https://forum.arduino.cc/t/need-help-with-what-should-a-very-simple-blink-delay-program/1216325
Wokwi: https://wokwi.com/projects/388025722581533697
*/
const int button = 9;//Autopack button input
const int packret = 3;//pack retract output to relay module
const int packext = 6;//Pack extend output to relay module
const unsigned long wait10s = 10000;
const unsigned long wait8s = 8000;
const unsigned long wait100ms = 100;
enum stateType {IDLE, PACKEXTON, PACKEXTOFF, PACKRETON, PACKRETOFF};
stateType state = IDLE;
unsigned long lastChange = 0;
void setup() {
Serial.begin(9600);
// put your setup code here, to run once:
pinMode(button, INPUT);
pinMode(packret, OUTPUT);
pinMode(packext, OUTPUT);
// Just to be sure:
digitalWrite(packext, HIGH);
digitalWrite(packret, HIGH);
}
void loop()
{
stateMachine();
}
void stateMachine() {
switch (state) {
case IDLE:
if (digitalRead(button) == HIGH) { //If button is pressed
Serial.println(digitalRead(button));
Serial.println("packext on");
digitalWrite(packext, LOW);//turn pack extend relay on
state = PACKEXTON;
lastChange = millis();
}
break;
case PACKEXTON:
if (millis() - lastChange > wait10s) {
digitalWrite(packext, HIGH);//turn pack extend off
Serial.println("packext off");
Serial.println("wait");
lastChange = millis();
state = PACKEXTOFF;
}
break;
case PACKEXTOFF:
if (millis() - lastChange > wait100ms) {
lastChange = millis();
state = PACKRETON;
}
break;
case PACKRETON:
if (millis() - lastChange > 100) {
digitalWrite(packret, LOW);//turn pack retract relay off
Serial.println("packret on");
state = PACKRETOFF;
lastChange = millis();
}
break;
case PACKRETOFF:
if (millis() - lastChange > wait8s) {
digitalWrite(packext, HIGH);
digitalWrite(packret, HIGH);
Serial.println("packret off");
state = IDLE;
}
break;
}
}