// semaforo estado ticks pulsador -> no hace la secuencia hasta que se pulse el boton de peaton
// https://wokwi.com/projects/375738955105121281
#include "define_pines.h"
int estado_ticks=0; // el estado se va a ir marcando como valores de tiempo, cada 250 ms
typedef enum {
VERDE,
PASANDO_A_ROJO,
ROJO,
PASANDO_A_VERDE
} EstadoSemaforo;
EstadoSemaforo estadoActual = VERDE; // indica el estado actual del sistema
void semaforo_coche(){
switch(estado_ticks){
case 0:
if(estadoActual != VERDE){ // solo 1 vez => programa más eficiente
digitalWrite(ledPin_rojo, LOW);
digitalWrite(ledPin_amarillo,LOW);
digitalWrite(ledPin_verde, HIGH);
Serial.println("Semáforo en verde... ");
estadoActual = VERDE;
}
break;
case 4*5:
if(estadoActual != PASANDO_A_ROJO){
Serial.println("Semáforo se va a poner en rojo... ");
digitalWrite(ledPin_rojo, LOW);
digitalWrite(ledPin_amarillo, HIGH);
digitalWrite(ledPin_verde, HIGH);
estadoActual = PASANDO_A_ROJO;
}
break;
case 4*(5+2):
if(estadoActual != ROJO){
Serial.println("Semáforo en rojo... 5 segundos");
digitalWrite(ledPin_rojo, HIGH);
digitalWrite(ledPin_amarillo, LOW);
digitalWrite(ledPin_verde, LOW);
estadoActual = ROJO;
}
break;
case 4*(5+2+5):
if(estadoActual != PASANDO_A_VERDE){
Serial.println("Semáforo se va a poner en verde... ");
digitalWrite(ledPin_rojo, HIGH);
digitalWrite(ledPin_amarillo, HIGH);
digitalWrite(ledPin_verde, LOW);
estadoActual = PASANDO_A_VERDE;
}
break;
}
return;
}
void semaforo_peaton(){
static int parpadeo_amarillo=0; // si solo se utiliza en una funcion, puede definirse dentro como "static"
switch(estadoActual){
case ROJO: // led rojo -> led peatón verde
digitalWrite(led_peaton_amarillo,LOW);
digitalWrite(led_peaton_verde,HIGH);
break;
case PASANDO_A_VERDE: // peaton encender los 2 leds fijos amarillo y verde
digitalWrite(led_peaton_amarillo,HIGH);
digitalWrite(led_peaton_verde,HIGH);
break;
default : // en el resto de estados, switch case no admite conjugar estados, ROJO || VERDE, serían "if"
// se conmuta el valor del led amarillo cada vez que se llama (cada 250 ms)
parpadeo_amarillo = !parpadeo_amarillo;
digitalWrite(led_peaton_amarillo,parpadeo_amarillo);
digitalWrite(led_peaton_verde,LOW);
break;
}
return;
}
// se añaden estas variables
int peaton_pulsado=0;
int secuencia_activada=0; // indica que se comienza la secuencia de paso de peaton
// se llama una única vez al inicio del programa antes de comenzar el bule "loop"
void setup()
{
//mode: INPUT, OUTPUT, or INPUT_PULLUP
pinMode(ledPin_rojo, OUTPUT);
pinMode(ledPin_amarillo, OUTPUT);
pinMode(ledPin_verde, OUTPUT);
pinMode(led_peaton_amarillo, OUTPUT);
pinMode(led_peaton_verde, OUTPUT);
pinMode(pulsador, INPUT); // en este programa no se hace uso del pulsador
// se recomienda dar los valores iniciales de todas las variables globales
estado_ticks=0;
estadoActual = PASANDO_A_VERDE; // en la primera llamada -> VERDE
peaton_pulsado=0;
secuencia_activada=0;
Serial.begin(115200);
delay(1000);
Serial.println("\nSimulador semaforo peatón...");
}
void loop()
{
// funcionamiento pasando peaton
if(secuencia_activada==1){
estado_ticks++; // semaforo coche: de verde pasa a rojo y vuelve a verde
if(estado_ticks >= 4*(5+2+5+2)){ // fin de la secuencia
estado_ticks=0; // se prepara la próxima vez
secuencia_activada=0; // se da como finalizado el paso de peaton
}
}
else{
// se mantiene el funcionamiento pasando coches - el semaforo coche en VERDE y peaton parpadeando
// hasta que se pulse el boton de peaton y comienza secuencia
peaton_pulsado=!digitalRead(pulsador); // pulsador activo a nivel bajo -> negado
if( (peaton_pulsado==1) ){
Serial.println("Petición pulsador paso peatón... ");
secuencia_activada=1;
}
}
semaforo_coche();
semaforo_peaton();
// para depurar el programa se imprimen las variables
/*Serial.printf(" estadoActual: %d, peaton_pulsado:%d, secuencia_activada:%d \n ",
estadoActual, peaton_pulsado, secuencia_activada);
*/
delay(250); //espera 250 ms
// se vuelve a llamar a loop => arriba de la función
}