int tiempoverde=10000,tiempoamarillo=2000,tiemporojo=6000, tiempodisplay=1000;;
int peaton, tiempopeaton, tiempomaximo=10999, tiempominimo=4000;
int dif=0,difd=0, potenc=0, bandera=0, banderadisplay;
const int pulsador1 = 3, pulsador2 = 9;
const int a=12, b=13, c=0, d=1, e=2, f=11, g=10, dp=0;
const int rojo=8, amarillo=7, verde=6, rojop=4, verdep=5,apg=0, enc=1;
unsigned long actual=0, viejo=0, viejod=0;
float ajuste= float(tiempomaximo-tiempominimo)/1023; // para regular el tiempo maximo.
void setup() {
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(rojo, OUTPUT);
pinMode(amarillo, OUTPUT);
pinMode(verde, OUTPUT);
pinMode(rojop, OUTPUT);
pinMode(pulsador1, INPUT_PULLUP);
pinMode(pulsador2, INPUT_PULLUP);
}
void num(int bd, int pa, int pb, int pc, int pd, int pe, int pf, int pg){
digitalWrite(a, pa); //asigno el valor en el pin a del display.
digitalWrite(b, pb); //asigno el valor en el pin b del display.
digitalWrite(c, pc); //asigno el valor en el pin c del display.
digitalWrite(d, pd); //asigno el valor en el pin d del display.
digitalWrite(e, pe); //asigno el valor en el pin e del display.
digitalWrite(f, pf); //asigno el valor en el pin f del display.
digitalWrite(g, pg); //asigno el valor en el pin g del display.
viejod=actual; //actualizo el contador difd del display.
banderadisplay=bd; //asigno el nuevo valor de bandera.
}
void switch_display(int bnd){
switch(bnd){
case 1:
if (difd>=tiempodisplay)
num(1,enc,enc,enc,enc,enc,enc,apg); // se muestra el numero 0.
break;
case 2:
if (difd>=tiempodisplay)
num(1,apg,enc,enc,apg,apg,apg,apg); // se muestra el numero 1.
break;
case 3:
if (difd>=tiempodisplay)
num(2,enc,enc,apg,enc,enc,apg,enc); // se muestra el numero 2.
break;
case 4:
if (difd>=tiempodisplay)
num(3,enc,enc,enc,enc,apg,apg,enc); // se muestra el numero 3.
break;
case 5:
if (difd>=tiempodisplay)
num(4,apg,enc,enc,apg,apg,enc,enc); // se muestra el numero 4.
break;
case 6:
if (difd>=tiempodisplay)
num(5,enc,apg,enc,enc,apg,enc,enc); // se muestra el numero 5.
break;
case 7:
if (difd>=tiempodisplay)
num(6,enc,apg,enc,enc,enc,enc,enc); // se muestra el numero 6.
break;
case 8:
if (difd>=tiempodisplay)
num(7,enc,enc,enc,apg,apg,apg,apg); // se muestra el numero 7.
break;
case 9:
if (difd>=tiempodisplay)
num(8,enc,enc,enc,enc,enc,enc,enc); // se muestra el numero 8.
break;
case 10:
if (difd>=tiempodisplay)
num(9,enc,enc,enc,enc,apg,enc,enc); // se muestra el numero 9.
break;
default:
break;
}
}
void semaforo( int band, int roj, int amarill, int verd, int rojp, int verdp){
digitalWrite(rojo, roj); // se asigna el valor del led rojo del semaforo.
digitalWrite(amarillo, amarill); // se asigna el valor del led amarillo del semaforo.
digitalWrite(verde, verd); // se asigna el valor del led verde del semaforo.
digitalWrite(rojop,rojp); // se asigna el valor del led rojo del semaforo peatonal.
digitalWrite(verdep, verdp); // se asigna el valor del led verde del semaforo peatonal.
viejo=actual; // actualizo el contador dif del semaforo.
bandera=band; // actualizo el valor de la bandera.
}
int cuenta(int tiempo){ // sirve para asignarle la bandera correspondiente al display segun el tiempo asignado.
return tiempo/tiempodisplay;
}
void control_display(int tiempoasig){ // sincroniza el semaforo con el display.
viejod=(actual-tiempodisplay); // para evitar desfaces no deseados.
banderadisplay=cuenta(tiempoasig); // se asigna la bansera de acuerdo al tiempo ingresado.
}
void switch_semaforo(int bnd){
switch (bnd) {
case 0: //bandera de inicio.
semaforo(1,apg,apg,enc,enc,apg); // semaforo en verde/peatonal en rojo.
control_display(tiempoverde); // sicroniza el display con el tiempo del semaforo en verdde.
case 1: // semaforo verde.
if (dif>=tiempoverde){ // si la diferencia alcanza el valor de tiempoverde.
semaforo(2,apg,enc,apg,enc,apg); // semaforo en amarilo/peatonal en rojo.
control_display(tiempoamarillo); // sicroniza el display con el tiempo del semaforo en amarillo.
}
break;
case 2: // semaforo en amarillp.
if (dif>=tiempoamarillo){ // si la diferencia alcanza el valor de tiempoamarillo.
semaforo(3,enc,apg,apg,apg,enc); // semaforo en rojo/peatonal en verde.
control_display(tiemporojo); // sicroniza el display con el tiempo del semaforo en rojo.
}
break;
case 3: //semaforo en rojo.
if (dif>=tiemporojo){ // si la diferencia alcanza el valor de tiemporojo.
semaforo(4,enc,enc,apg,apg,enc); // semaforo en rojo-amarillo/peatonal en verde.
control_display(tiempoamarillo); // sicroniza el display con el tiempo del semaforo en amarillo.
}
break;
case 4: //semaforo en amarillo-rojo.
if (dif>=tiempoamarillo){ // si la diferencia alcanza el valor de tiempoamarillo.
semaforo(1,apg,apg,enc,enc,apg); // semaforo en verde/peatonal en rojo.
control_display(tiempoverde); // sicroniza el display con el tiempo del semaforo en verde.
}
break;
case 5: // caso peatonal(cuando se presiona el boton).
semaforo(6,apg,enc,apg,enc,apg); // inmediatamente pasa el semaforo a amarillo.
control_display(tiempoamarillo); // sicroniza el display con el tiempo del semaforo en amarillo.
break;
case 6:
if (dif>=tiempoamarillo){ // si la diferencia alcanza el valor de tiempoamarillo.
semaforo(7,enc,apg,apg,apg,enc); // semaforo en rojo/peatonal en verde.
control_display(tiempopeaton); // sicroniza el display con el tiempo del semaforo en el caso peatonal.
}
break;
case 7: //
if (dif>=tiempopeaton){ // si la diferencia alcanza el valor de tiempopeaton.
semaforo(4,enc,enc,apg,apg,enc); // semaforo en rojo-amarillo/peatonal en verde
control_display(tiempoamarillo); // sicroniza el display con el tiempo del semaforo normal en amarillo.
}
default:
break;
}
}
void loop() {
actual=millis();
dif=actual-viejo;
difd=actual-viejod;
potenc=analogRead(A5); // lee el valor del potenciometro.
peaton=potenc*ajuste+tiempominimo; // se asigna una variable temporal para evitar desfaces no deseados.
switch_semaforo(bandera); // activa el swich del semaforo.
switch_display(banderadisplay); // activa el swich del display.
if (digitalRead(rojop)==HIGH &&(digitalRead(pulsador1)==LOW || digitalRead(pulsador2)==LOW)){
// solo funciona cuando el semaforo peatonal esta en rojo y se presiona alguno de los dos pilsadores.
tiempopeaton=cuenta(peaton)*1000; // se asigna el valor de la variable temporal, de esta manera, una vez se presione el boton el estado del potenciometro no va a afecar a la sincronizacion del display con el semaforo.
bandera=5; // activa la bandera del caso peatonal.
}
}