/*en esta práctica tiene que estar el led rojo encendido para los coches y el
amarillo para los peatones. Al pulsar el pulsador se activa la secuencia hasta
volver a la situación inicial*/
/*diferencio además de los colores de los semáforos si
los uso para los coches o para los peatones */
int pulsador=35; //asigna el pin del pulsador
int cochesr=23; //led rojo del semáforo de los coches
int cochesa=22; // led amarillo del semáforo de los coches
int cochesv=21; // led verde del semáforo de los coches
int personasv=13; // led verde del semáforo de los peatones
int personasa=12; // led amarillo del semáforo de los peatones
/*creo tres contadores. Dos de ellos para los semáforos y el úlitmo para hacer
parpadear el led amarillo del semáforo de los peatones*/
int tcoches=0, tpersonas=0, tpuls=0;
int estadocoches=0; //estado del semáforo de los coches
int estadopersonas=0; // estado del semáforo de los peatones
int estadopulsador=0; /*estado del pulsador. Se utiliza para saber si se ha pulsado
el pulsador, se le asigna un 1, y matiene este valor hasta que termina la secuencia y
se reestablece a cero*/
void setup(){
Serial.begin(9600);
Serial.println("ejercicio semáforo");
pinMode(cochesr, OUTPUT);
pinMode(cochesa, OUTPUT);
pinMode(cochesv, OUTPUT);
pinMode(personasv, OUTPUT);
pinMode(personasa, OUTPUT);
pinMode(pulsador, INPUT);
}
void loop()
{
if (estadopulsador==0){
digitalWrite(cochesv, HIGH);
digitalWrite(personasa, HIGH);
delay (250);
if (digitalRead(pulsador)==LOW)
{
estadopulsador=1;
}
digitalWrite(personasa, LOW);
delay(250);
}
if (digitalRead(pulsador)==LOW)
{
estadopulsador=1;
}
/*mientras no se pulse el pulsador el valor de la varialbe estadopulsador es cero
y el código se queda en el estado de inicio. Al pulsar el pulsador cambia el valor
de la variable estadopulsador a 1 y empieza la secuencia de los semáforos, entrando
dentro del bloque if*/
/*el microprocesador ejecuta las funciones dentro del bloque if siempre que el valor
de la varialbe estadopulsador sea 1*/
if (estadopulsador==1)
{
delay(1);
tcoches++;
tpersonas++;
tpuls++;
/*inicialización y asignación de estado para los coches, dependiendo del estado
anterior del que venía y el tiempo transcurrido*/
if (estadocoches==0 && tcoches>5000 && estadopulsador==1)
{
estadocoches=1;
tcoches=0;
}
if (estadocoches==1 && tcoches>2000 && estadopulsador==1)
{
estadocoches=2;
tcoches=0;
}
if (estadocoches==2 && tcoches>5000 && estadopulsador==1)
{
estadocoches=3;
tcoches=0;
}
if (estadocoches==3 && tcoches>2000 && estadopulsador==1)
{
estadocoches=0;
tcoches=0;
/*en la última asignación de estados del semáforo de los coches, se asigna la
variable estadocoches a cero (estado original) y se asigna el a la variable
estadopulsador también un cero. Esto úlitmo es para que al acabar la secuencia
no vuelva a entrar dentro del bloque if y vuelva a empezar*/
estadopulsador=0;
}
/*función que establece, dependiendo del estado en el que se encuentre, el estado de
los leds del semáforo de los coches. Que leds están apagados y cuáles están encendidos*/
switch(estadocoches){
case(0):
digitalWrite(cochesr, LOW);
digitalWrite(cochesa, LOW);
digitalWrite(cochesv, HIGH);
break;
case (1):
digitalWrite(cochesr,LOW);
digitalWrite(cochesa, HIGH);
digitalWrite(cochesv, HIGH);
break;
case (2):
digitalWrite(cochesr,HIGH);
digitalWrite(cochesa, LOW);
digitalWrite(cochesv, LOW);
break;
case (3):
digitalWrite(cochesr,HIGH);
digitalWrite(cochesa, HIGH);
digitalWrite(cochesv, LOW);
break;
}
/*inicialización y asignación de estado para los peatones, dependiendo del estado
anterior del que venía y el tiempo transcurrido*/
if (estadopersonas==0 && tpersonas>7000 && estadopulsador==1)
{
estadopersonas=1;
tpersonas=0;
}
if (estadopersonas==1 && tpersonas>5000 && estadopulsador==1)
{
estadopersonas=0;
tpersonas=0;
tpuls=0;
}
/*función que establece, dependiendo del estado en el que se encuentre, el estado de
los leds del semáforo de los peatones. Que leds están apagados y cuáles están encendidos*/
switch(estadopersonas)
{
case (0):
digitalWrite(personasv, LOW);
if (tpuls==250)
{
digitalWrite(personasa, HIGH);
}
if (tpuls==500)
{
digitalWrite(personasa, LOW);
tpuls=0;
}
break;
case (1):
digitalWrite(personasv, HIGH);
digitalWrite(personasa, LOW);
break;
}
return;
}
}