#define LED_Red_1 2
#define LED_Yellow_1 3
#define LED_Green_1 4
#define LED_Red_2 5
#define LED_Yellow_2 6
#define LED_Green_2 7
#define BTN_MODE 8
const int state_0 = 0;
const int state_1 = 1;
const int state_2 = 2;
const int state_3 = 3;
const int state_4 = 4;
const int state_5 = 5;
int state = state_0;
int time_fast = 1500;
int time_slow = 3000;
int btn_mode;
void setup()
{
Serial.begin(9600);
Serial.println("Traffic light FSM model v.1.0");
pinMode(LED_Red_1, OUTPUT);
pinMode(LED_Yellow_1, OUTPUT);
pinMode(LED_Green_1, OUTPUT);
pinMode(LED_Red_2, OUTPUT);
pinMode(LED_Yellow_2, OUTPUT);
pinMode(LED_Green_2, OUTPUT);
pinMode(BTN_MODE, INPUT_PULLUP);
}
void loop()
{
btn_mode = digitalRead(BTN_MODE);
Serial.print("mode = "); Serial.print(btn_mode ? "FAST, " : "SLOW, "); Serial.print("current state = state_"); Serial.print(state); Serial.print("\t");
switch (state)
{
case state_0:
Serial.println(">\tR1, G2");
digitalWrite(LED_Red_1, HIGH); // Red 1
digitalWrite(LED_Yellow_1, LOW);
digitalWrite(LED_Green_1, LOW);
digitalWrite(LED_Red_2, LOW);
digitalWrite(LED_Yellow_2, LOW);
digitalWrite(LED_Green_2, HIGH); // Green 2
state = state_1;
break;
case state_1:
Serial.println(">\tR1, Y2");
digitalWrite(LED_Red_1, HIGH); // Red 1
digitalWrite(LED_Yellow_1, LOW);
digitalWrite(LED_Green_1, LOW);
digitalWrite(LED_Red_2, LOW);
digitalWrite(LED_Yellow_2, HIGH); // Yellow 2
digitalWrite(LED_Green_2, LOW);
if (btn_mode)
state = state_3;
else
state = state_2;
break;
case state_2:
Serial.println(">\tR1, R2");
digitalWrite(LED_Red_1, HIGH);
digitalWrite(LED_Yellow_1, LOW);
digitalWrite(LED_Green_1, LOW);
digitalWrite(LED_Red_2, HIGH);
digitalWrite(LED_Yellow_2, LOW);
digitalWrite(LED_Green_2, LOW);
state = state_3;
break;
case state_3:
Serial.println(">\tG1, R2");
digitalWrite(LED_Red_1, LOW);
digitalWrite(LED_Yellow_1, LOW);
digitalWrite(LED_Green_1, HIGH); // Green 1
digitalWrite(LED_Red_2, HIGH); // Red 2
digitalWrite(LED_Yellow_2, LOW);
digitalWrite(LED_Green_2, LOW);
state = state_4;
break;
case state_4:
Serial.println(">\tY1, R2");
digitalWrite(LED_Red_1, LOW);
digitalWrite(LED_Yellow_1, HIGH); // Yellow 1
digitalWrite(LED_Green_1, LOW);
digitalWrite(LED_Red_2, HIGH); // Red 2
digitalWrite(LED_Yellow_2, LOW);
digitalWrite(LED_Green_2, LOW);
if (btn_mode)
state = state_0;
else
state = state_5;
break;
case state_5:
Serial.println(">\tR1, R2");
digitalWrite(LED_Red_1, HIGH); // Red 1
digitalWrite(LED_Yellow_1, LOW);
digitalWrite(LED_Green_1, LOW);
digitalWrite(LED_Red_2, HIGH); // Red 2
digitalWrite(LED_Yellow_2, LOW);
digitalWrite(LED_Green_2, LOW);
state = state_0;
break;
}
if (btn_mode)
delay(time_fast);
else
delay(time_slow);
}