#include <TimerOne.h>
#define LED_ROJO 0
#define LED_AMARILLO 1
#define LED_VERDE 2
int LEDROJO =5;
int LEDAMARILLO =6;
int LEDVERDE =7;
int tiempo_corto = 400; //tiempo corto para pasar del amarillo al rojo
int tiempo_largo = 1000; //tiempo largo para los estados verdes y rojo
int timer = tiempo_largo; //cargo el timer con un valor inicial
int estado = LED_ROJO; // defino un estado inicial, rojo en este caso
void setup() {
pinMode (LEDROJO, OUTPUT);
pinMode (LEDAMARILLO, OUTPUT);
pinMode (LEDVERDE, OUTPUT);
Timer1.initialize(1000); //inicializo el timer cada 1 seg
Timer1.attachInterrupt(retardo); //activo la interrupcion por timer
}
void loop() {
MAQ_ESTADO_SEMAFORO();
}
void retardo(void){
timer--; //descuento el contador
}
void MAQ_ESTADO_SEMAFORO(void){
switch(estado){ //reviso en que estado estoy
case LED_ROJO:
estado_rojo();
break;
case LED_VERDE:
estado_verde();
break;
case LED_AMARILLO:
estado_amarillo();
break;
}
}
void estado_rojo(void){
if(timer == 0 ){ //espero que concluya el tiempo del estado anterior
digitalWrite(LED_ROJO, HIGH); //prendo el led rojo
timer = tiempo_largo; //cargo el timer con el tiempo largo que va a estar encendido el led rojo
estado = LED_VERDE; //paso al estado verde
}
}
void estado_amarillo(void){
if(timer == 0 ){ //espero que concluya el tiempo del estado anterior
digitalWrite(LED_AMARILLO, HIGH); //enciendo el led amarillo
timer = tiempo_corto; //cargo el timer con el tiempo corto que va a estar encendido el led amarillo
estado = LED_ROJO; //paso al estado siguente
}
}
void estado_verde (void){
if(timer == 0 ){ //espero que concluya el tiempo del estado anterior
digitalWrite(LED_VERDE, HIGH); //prendo el led verde
timer = tiempo_largo; //cargo el tiempo que va a estar encendido el led verde
estado = LED_AMARILLO; //paso al estado siguente
}
}