/*
/ Y. Gorbounov, 2020
/ Parity check FSM model v.1.0
/
/ Note: EVEN = Green, ODD = Red
*/
#include <Bounce2.h>
#define state_EVEN 0
#define state_ODD 1
#define pin_input 11
#define pin_even 7
#define pin_odd 3
int state;
int input, input_prev;
Bounce debouncer = Bounce();
void setup() {
Serial.begin(9600);
pinMode(pin_even, OUTPUT);
pinMode(pin_odd, OUTPUT);
pinMode(pin_input, INPUT_PULLUP);
debouncer.attach(pin_input);
debouncer.interval(30); // interval in ms
// LEDs are driven High due to transistor
digitalWrite(pin_even, HIGH);
digitalWrite(pin_odd, LOW);
state = state_EVEN;
input_prev = digitalRead(pin_input);
}
void loop() {
debouncer.update();
input = debouncer.read();
if (input == input_prev)
return;
input_prev = input;
Serial.print(input?"High":"Low");
Serial.print(" >> Current state (FROM) = ");
Serial.print((state == state_EVEN) ? "EVEN" : "ODD");
switch (state)
{
case state_EVEN:
if (input == HIGH)
state = state_ODD;
break;
case state_ODD:
if (input == HIGH)
state = state_EVEN;
break;
default:
state = state_EVEN;
break;
}
if (state == state_EVEN) {
digitalWrite(pin_even, HIGH);
digitalWrite(pin_odd, LOW);
}
else {
digitalWrite(pin_even, LOW);
digitalWrite(pin_odd, HIGH);
}
Serial.print(",\t\tNext state (TO) = ");
Serial.println((state == state_EVEN) ? "EVEN" : "ODD");
}