#include <ButtonDebounce.h>
#define LED_PIN 3
// #define ON_BTN_PIN 12
// #define OFF_BTN_PIN 11
#define OFF_LED 0
#define DIM_LED 20
#define MEDIUM_LED 85
#define FULL_LED 255
typedef enum{
Event_ON,
Event_OFF
}Event_t;
typedef enum{
Light_State_OFF,
Light_State_DIM,
Light_State_MEDIUM,
Light_State_FULL,
}Light_State_t;
// ButtonDebounce onButton(ON_BTN_PIN, 250);
// ButtonDebounce offButton(OFF_BTN_PIN, 250);
void light_fsm(Event_t event);
void setup() {
// put your setup code here, to run once:
pinMode(LED_PIN, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
// pinMode(ON_BTN_PIN, INPUT);
// pinMode(OFF_BTN_PIN, INPUT);
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
// onButton.update();
// offButton.update();
// if(onButton.state() == LOW and offButton.state() == HIGH){
// light_fsm(Event_ON);
// }else if(onButton.state() == HIGH and offButton.state() == LOW){
// light_fsm(Event_OFF);
// }
if(Serial.available()){
String inputCommand = Serial.readString();
inputCommand.trim();
inputCommand.toLowerCase();
Serial.println(inputCommand);
if(inputCommand=="on"){
light_fsm(Event_ON);
digitalWrite(LED_BUILTIN, HIGH);
}
if(inputCommand=="off"){
light_fsm(Event_OFF);
digitalWrite(LED_BUILTIN, LOW);
}
}
}
void light_fsm(Event_t event){
static Light_State_t light_state = Light_State_OFF;
switch(light_state){
case Light_State_OFF:
switch(Event_ON){
case Event_ON:
analogWrite(LED_PIN, DIM_LED);
light_state = Light_State_DIM;
break;
// case Event_OFF:break;
}
break;
case Light_State_DIM:
switch(Event_ON){
case Event_ON:
analogWrite(LED_PIN, MEDIUM_LED);
light_state = Light_State_MEDIUM;
break;
case Event_OFF:
analogWrite(LED_PIN, OFF_LED);
light_state = Light_State_OFF;
break;
}
break;
case Light_State_MEDIUM:
switch(Event_ON){
case Event_ON:
analogWrite(LED_PIN, FULL_LED);
light_state = Light_State_FULL;
break;
case Event_OFF:
analogWrite(LED_PIN, OFF_LED);
light_state = Light_State_OFF;
break;
}
break;
case Light_State_FULL:
switch(Event_ON){
case Event_ON:
analogWrite(LED_PIN, DIM_LED);
light_state = Light_State_DIM;
break;
case Event_OFF:
analogWrite(LED_PIN, OFF_LED);
light_state = Light_State_OFF;
break;
}
break;
}
}