//pulsador abierto pasa corriente y el pin está en high
//pulsador cerrado tierra y pin está en LOW
/*mientras no se pulse el pulsdor el semáforo de los
peatones está parpadeando y el de los coches en verde. Cuando
se pulsa pasa un tiempo, el semaforo de los coches cambia a
verde y amarillo y el semáforo de los peatones sigue parpadenado
en amarillo. cambia a rojo el de los coches y verde el de los peatones.
Despues amarillo parpadeando peatones, y el de coches rojo y amarillo.
El de peatones ya se queda parpadeando y el de coches pasa a amarillo y
verde. Por ultimo el de coches pasa a verde*/
unsigned long tic, tac;
/*referencia de pines según el color del led y el semáforo
color rojo de los coches =23;
color amarillo de los coches =22;
color verde de los coches = 21;
color verde de los peatones =13;
color amarillo de los peatones = 12;*/
int pulsador =35; //asigna el pin correspondiente al pulsador
int contador=0; // variable para registrar si se ha pulsado el pulsador
void setup() {
Serial.begin(115200);
Serial.println("Empieza la secuencia de semáforo");
pinMode(23, OUTPUT);
pinMode(22, OUTPUT);
pinMode(21, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(pulsador, INPUT);
}
void IRAM_ATTR ISR_pulsador()
{
contador =1;
detachInterrupt(digitalPinToInterrupt(pulsador));
}
/*creo una función externa secuencia_luces a la que puedo llamar desde el programa en
void loop (). Para esta funcion es necesario indicar un tiempo y los pines que se
deben encender*/
/*el primer valor es el tiempo que tiene que estar encendido los leds. El segundo y
tercer número son los leds del semáforo de los coches que se debe encender. El úlitmo
número es el led de los peatones que se debe encender*/
void secuencia_luces ( unsigned long tiempo_espera, int ledpin1, int ledpin2, int ledpinp)
{
tic=millis();
do {
tac=millis();
digitalWrite(ledpin1, HIGH);
digitalWrite(ledpin2, HIGH);
if (ledpinp==12){
digitalWrite(ledpinp, HIGH);
delay(500);
digitalWrite(ledpinp, LOW);
delay(500);
} else {
digitalWrite(ledpinp, HIGH);
}
} while ((tac-tic) < tiempo_espera);
digitalWrite(ledpin1, LOW);
digitalWrite(ledpin2, LOW);
digitalWrite(ledpinp, LOW);
}
/*cuando se enciende el rojo de los coches se enciende el verde de
los peatones
cuando se enciende el amarillo o verde de coches el de peatones
parpadea en amarillo*/
void loop() {
/*ponemos la interrupcion como FALLING porque queremos que salte
cuando el pulsador pasa de estar de HIGH a LOW. Cuando
está desactivado está en HIGH y cuando se pulsa pasa a LOW*/
/*las unicas luces encendidas son la verde de los coches y la amarilla
de los peatones hasta que se pulsa el pulsador, se activa la interrupcion y
empieza la secuencia. Cuando termina la secuencia vuelve al estado inicial*/
secuencia_luces (10,21,0,12);
attachInterrupt(digitalPinToInterrupt(pulsador),ISR_pulsador,FALLING);
if (contador==1)
{
secuencia_luces (3000,21,22,12);
secuencia_luces (5000,23,0,13);
secuencia_luces(5000,23,22,12);
}
//cuando se acaba la secuencia la variable contador se vuelve a establecer a cero
contador=0;
}