#include <Bounce2.h>
uint8_t pinLed1 = 2;
uint8_t pinLed2 = 3;
uint8_t pinLed3 = 4;
// buttons to trigger fsm state change
uint8_t pinBtn1 = A0;
uint8_t pinBtn2 = A1;
Bounce2::Button btn1 = Bounce2::Button();
Bounce2::Button btn2 = Bounce2::Button();
// timer to trigger fsm state change
uint32_t duration = 1000UL;
uint32_t stateStartTime;
void setup()
{
Serial.begin(115200);
Serial.println();
// configure outputs
pinMode(pinLed1, OUTPUT);
pinMode(pinLed2, OUTPUT);
pinMode(pinLed3, OUTPUT);
// configure buttons
btn1.attach(pinBtn1, INPUT_PULLUP);
btn1.interval(10);
//btn1.setPressedState(LOW);
btn2.attach(pinBtn2, INPUT_PULLUP);
btn2.interval(10);
//btn2.setPressedState(LOW);
}
void loop()
{
fsm();
}
void fsm()
{
// update the internal state of the buttons
btn1.update();
btn2.update();
static uint8_t stateNum = 1;
switch (stateNum)
{
case 1:
led1_On();
led2_On();
led3_Off();
if (btn1.fell() && btn2.fell())
{
Serial.println(F("btn1 and btn2: Switching to state 4"));
stateStartTime = millis();
stateNum = 4;
}
if (btn1.fell())
{
Serial.println(F("btn1: Switching to state 2"));
stateStartTime = millis();
stateNum = 2;
}
if (btn2.fell())
{
Serial.println(F("btn2: Switching to state 3"));
stateStartTime = millis();
stateNum = 3;
}
break;
case 2:
led2_Off();
led1_Blink(500);
if (millis() - stateStartTime >= duration)
{
Serial.println(F("timer: Switching to state 3"));
stateStartTime = millis();
stateNum = 1;
}
if (btn2.fell())
{
stateStartTime = millis();
stateNum = 3;
}
break;
case 3:
led1_Off();
led2_Blink(1000);
if (btn2.fell())
{
Serial.println(F("btn2: Switching to state 1"));
stateStartTime = millis();
stateNum = 1;
}
break;
case 4:
led1_Off();
led2_Off();
led3_On();
if (millis() - stateStartTime >= duration)
{
Serial.println(F("timer: Switching to state 1"));
stateStartTime = millis();
stateNum = 1;
}
break;
}
}
void led1_On()
{
digitalWrite(pinLed1, HIGH);
}
void led2_On()
{
digitalWrite(pinLed2, HIGH);
}
void led3_On()
{
digitalWrite(pinLed3, HIGH);
}
void led1_Off()
{
digitalWrite(pinLed1, LOW);
}
void led2_Off()
{
digitalWrite(pinLed2, LOW);
}
void led3_Off()
{
digitalWrite(pinLed3, LOW);
}
void led1_Blink(uint16_t interval)
{
static uint32_t lastTime;
static bool ledState = false;
if (millis() - lastTime > interval)
{
lastTime = millis();
ledState = !ledState;
digitalWrite(pinLed1, ledState);
}
}
void led2_Blink(uint16_t interval)
{
static uint32_t lastTime;
static bool ledState = false;
if (millis() - lastTime > interval)
{
lastTime = millis();
ledState = !ledState;
digitalWrite(pinLed2, ledState);
}
}traffic light 1
pedestrian light 1
btn1
btn2