const int RC = 23; //rojo coches
const int NC = 22; //naranja coches
const int VC = 21; //verde coches
const int NP = 12; //naranja peatones
int modoNP; //estado actual del led naranja peatones
const int VP = 13; //verde peatones
const int Pinboton = 35; //pin asignado al boton
unsigned long Millisahora; //variable para guardar el tiempo actual
int boton = LOW; //estado inicial del boton
int boton2; //nuevo estado del boton
unsigned long tverde = 0; //tiempo desde la ultima vez que verde coches estuvo encendido
const unsigned long interverde = 5000; //tiempo minimo de encendido del verde coches
unsigned long ultmparp = 0; //tiempo de la ultima vez que el naranja peatones estuvo parpadeando
const unsigned long tparp = 300; //intervalo de parpadeo del naranja peatones
int reinicio = 0;
int i;
void setup() { //establecemos el estado inicial del pin de cada led y del boton, ademas de encender el led verde_coches y establecer millis en el instante en que se enciende
pinMode(RC, OUTPUT);
pinMode(NC, OUTPUT);
pinMode(VC, OUTPUT);
pinMode(NP, OUTPUT);
pinMode(VP, OUTPUT);
pinMode(Pinboton, INPUT);
digitalWrite(VC, HIGH);
tverde = millis(); //guardamos el tiempo actual
}
void loop() {
//actualizamos el tiempo actual con millis y comprobamos si ha pasado el tiempo minimo de verde
Millisahora = millis();
boton2 = digitalRead(Pinboton); //guardamos el estado del boton
if (Millisahora - ultmparp >= tparp) {
ultmparp = Millisahora; //actualizamos el tiempo del ultimo parpadeo
modoNP = digitalRead(NP); //leemos el estado del naranja peatones
digitalWrite(NP, !modoNP); //cambiamos el estado del led naranja
}
//comprobamos si se ha presionado el boton
if ((boton2 != boton && boton2 == HIGH) || (reinicio == 1)) {
//comprobamos si ha pasado el tiempo requerido desde el ultimo verde, en cuyo caso empezamos el cambio de las luces
if (Millisahora - tverde >= interverde) {
digitalWrite(VC, LOW);
digitalWrite(NC, HIGH);
delay(1000);
digitalWrite(NC, LOW);
digitalWrite(RC, HIGH);
digitalWrite(VP, HIGH);
digitalWrite(NP, LOW);
//dejamos 4 segundos para que cruzen los peatones
for(i=1;i<=400;i++){
delay(10);
if (digitalRead(Pinboton) == HIGH) {
reinicio = 1;
}
}
ultmparp = millis(); //actualizamos el tiempo desde el ultimo parpadeo
digitalWrite(VP, LOW);
digitalWrite(RC, LOW);
digitalWrite(VC, HIGH);
tverde = millis(); //actualizamos el tiempo del ultimo verde
}
}
if(reinicio){
digitalWrite(VC, LOW);
digitalWrite(NC, HIGH);
delay(1000);
digitalWrite(NC, LOW);
digitalWrite(RC, HIGH);
digitalWrite(VP, HIGH);
digitalWrite(NP, LOW);
delay(4000);
digitalWrite(VP, LOW);
digitalWrite(RC, LOW);
digitalWrite(VC, HIGH);
reinicio = 0;
}
boton = boton2; //actualizamos el estado del boton
delay(100); //damos tiempo para evitar lecturas rápidas del boton
}