#define LED_VERDE1 13
#define LED_AMARILLO1 12
#define LED_ROJO1 11
#define LED_VERDE2 10
#define LED_AMARILLO2 9
#define LED_ROJO2 8
#define BOTON_PEATON1 7
#define BOTON_PEATON2 6
#define LED_VERDE_PEATON1 5
#define LED_VERDE_PEATON2 4
#define LED_AMARILLO_PEATON1 3
#define LED_AMARILLO_PEATON2 2
unsigned long tiempoActual;
unsigned long tiempoAnterior = 0;
unsigned long intervalo = 1000;
enum Estado {
CICLO_VERDE1,
CICLO_AMARILLO1,
CICLO_VERDE2,
CICLO_AMARILLO2,
CRUCE_PEATONAL
};
Estado estadoActual = CICLO_VERDE1;
int parpadeos = 0;
bool botonPeaton1Presionado = false;
bool botonPeaton2Presionado = false;
void setup() {
pinMode(LED_VERDE1, OUTPUT);
pinMode(LED_AMARILLO1, OUTPUT);
pinMode(LED_ROJO1, OUTPUT);
pinMode(LED_VERDE2, OUTPUT);
pinMode(LED_AMARILLO2, OUTPUT);
pinMode(LED_ROJO2, OUTPUT);
pinMode(BOTON_PEATON1, INPUT_PULLUP);
pinMode(BOTON_PEATON2, INPUT_PULLUP);
pinMode(LED_VERDE_PEATON1, OUTPUT);
pinMode(LED_VERDE_PEATON2, OUTPUT);
pinMode(LED_AMARILLO_PEATON1, OUTPUT);
pinMode(LED_AMARILLO_PEATON2, OUTPUT);
digitalWrite(LED_ROJO2, HIGH);
}
void loop() {
tiempoActual = millis();
botonPeaton1Presionado = !digitalRead(BOTON_PEATON1);
botonPeaton2Presionado = !digitalRead(BOTON_PEATON2);
if ((botonPeaton1Presionado || botonPeaton2Presionado) && estadoActual != CRUCE_PEATONAL) {
estadoActual = CRUCE_PEATONAL;
tiempoAnterior = tiempoActual;
parpadeos = 0;
}
switch (estadoActual) {
case CICLO_VERDE1:
if (tiempoActual - tiempoAnterior >= 5000) {
digitalWrite(LED_VERDE1, LOW);
digitalWrite(LED_AMARILLO1, HIGH);
estadoActual = CICLO_AMARILLO1;
tiempoAnterior = tiempoActual;
} else {
digitalWrite(LED_VERDE1, HIGH);
digitalWrite(LED_ROJO2, HIGH);
digitalWrite(LED_ROJO1, LOW);
}
break;
case CICLO_AMARILLO1:
if (tiempoActual - tiempoAnterior >= 3000) {
digitalWrite(LED_AMARILLO1, LOW);
digitalWrite(LED_ROJO1, HIGH);
digitalWrite(LED_VERDE2, HIGH);
estadoActual = CICLO_VERDE2;
tiempoAnterior = tiempoActual;
}
break;
case CICLO_VERDE2:
if (tiempoActual - tiempoAnterior >= 5000) {
digitalWrite(LED_VERDE2, LOW);
digitalWrite(LED_AMARILLO2, HIGH);
estadoActual = CICLO_AMARILLO2;
tiempoAnterior = tiempoActual;
} else {
digitalWrite(LED_ROJO1, HIGH);
digitalWrite(LED_VERDE2, HIGH);
digitalWrite(LED_ROJO2, LOW);
}
break;
case CICLO_AMARILLO2:
if (tiempoActual - tiempoAnterior >= 3000) {
digitalWrite(LED_AMARILLO2, LOW);
digitalWrite(LED_ROJO2, HIGH);
digitalWrite(LED_VERDE1, HIGH);
estadoActual = CICLO_VERDE1;
tiempoAnterior = tiempoActual;
}
break;
case CRUCE_PEATONAL:
if (parpadeos < 5) {
if (tiempoActual - tiempoAnterior >= 500) {
tiempoAnterior = tiempoActual;
parpadeos++;
toggle(LED_AMARILLO1);
toggle(LED_AMARILLO2);
}
} else if (parpadeos == 5) {
digitalWrite(LED_AMARILLO1, LOW);
digitalWrite(LED_AMARILLO2, LOW);
digitalWrite(LED_ROJO1, HIGH);
digitalWrite(LED_ROJO2, HIGH);
digitalWrite(LED_VERDE_PEATON1, HIGH);
digitalWrite(LED_VERDE_PEATON2, HIGH);
if (tiempoActual - tiempoAnterior >= 20000) {
digitalWrite(LED_VERDE_PEATON1, LOW);
digitalWrite(LED_VERDE_PEATON2, LOW);
estadoActual = CICLO_VERDE1;
tiempoAnterior = tiempoActual;
}
}
break;
}
}
void toggle(int pin) {
digitalWrite(pin, !digitalRead(pin));
}