// Problem 1: Make a 2-state FSM with one button and one LED:
// STATE_IDLE: LED is OFF, waiting for button press.
// STATE_ACTION: LED blinks (toggle every 500ms).
// If button is pressed again → go back to STATE_IDLE (LED OFF).
void led_toggle();
enum States {
IDLE,
ACTION
};
States cur_st = IDLE;
void enterState(States new_st)
{
cur_st = new_st;
switch(new_st)
{
case IDLE:
Serial.println("Waiting for button press!!");
digitalWrite(LED, LOW);
break;
case ACTION:
Serial.println("Button pressed");
break;
}
}
void fsmUpdate()
{
switch(cur_st)
{
case IDLE:
// if button pressed -> enterState ACTION
if(digitalRead(BUT) == 0) enterState(ACTION);
break;
case ACTION:
// Toggle led 0.5s
led_toggle();
// if button pressed -> enterstate IDLE
if(digitalRead(BUT) == 0) enterState(IDLE);
break;
}
}
#define LED 13
#define BUT 12
void setup() {
Serial.begin(9600);
pinMode(LED, OUTPUT);
pinMode(BUT, INPUT_PULLUP);
Serial.println("-- Starting --");
enterState(IDLE);
}
void loop() {
fsmUpdate();
}
int led_st = LOW;
unsigned long lastBlinkTime = 0;
void led_toggle()
{
// digitalWrite(LED,1);
// delay(500);
// digitalWrite(LED,0);
// delay(500);
unsigned long now = millis();
if(now - lastBlinkTime >= 500)
{
led_st = !led_st;
digitalWrite(LED,led_st);
lastBlinkTime = now;
}
}