#include "FiniteStateMachine.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,10,11,12,13);
const int botao = A1;
const int buzzer = A0;
bool desativado = true;
volatile int statusBotao = 0;
volatile int statusAnteriorBotao = 0;
State VRM = State(vermelho);
State AMR = State(amarelo);
State VRDP = State(verdePadrao);
State VRDE = State(verdeEstendido);
FSM semaforo = FSM(VRM);
void setup() {
//Serial.begin(115200);
lcd.begin(16,2);
DDRD = B11111000;
pinMode(botao, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
}
void loop(){
semaforo.update();
statusBotao = !digitalRead(botao);
if(statusBotao != statusAnteriorBotao){
if(statusBotao == HIGH && semaforo.isInState(VRDP))
semaforo.immediateTransitionTo(VRDE);
delay(50);
}
}
void vermelho(){
PORTD = B01100000;
//Serial.println("vermelho");
contador(10);
semaforo.transitionTo(AMR);
}
void amarelo(){
PORTD = B01010000;
//Serial.println("amarelo");
contador(5);
semaforo.transitionTo(VRDP);
}
void verdePadrao(){
PORTD = B10001000;
//Serial.println("verde padrão");
contador(10);
semaforo.transitionTo(VRM);
}
void verdeEstendido(){
PORTD = B10001000;
//Serial.println("verde estendido");
contador(15);
semaforo.transitionTo(VRM);
}
void contador(int segundos){
for(int x = segundos; x > 0; x--){
if(semaforo.isInState(VRDP) && statusBotao == HIGH)
semaforo.immediateTransitionTo(VRDE);
else {
lcd.clear();
if(x >= 10)
lcd.print("00:" + String(x));
else
lcd.print("00:0" + String(x));
if(semaforo.isInState(VRM))
tone(buzzer,250,10);
else if (semaforo.isInState(AMR))
tone(buzzer,500,10);
else
tone(buzzer,750,10);
delay(1000);
}
}
}