#define LED_ROJO 2
#define LED_AMARILLO 4
#define LED_VERDE 16
#define LED_EXTRA 17
#define BOTON_P1 22 // Iniciar/Detener
#define BOTON_P2 23 // Cambiar velocidad
bool semaforoActivo = false;
unsigned long intervalo = 1000; // milisegundos
unsigned long tiempoAnterior = 0;
int estado = 0;
void setup() {
pinMode(LED_ROJO, OUTPUT);
pinMode(LED_AMARILLO, OUTPUT);
pinMode(LED_VERDE, OUTPUT);
pinMode(LED_EXTRA, OUTPUT);
pinMode(BOTON_P1, INPUT_PULLUP);
pinMode(BOTON_P2, INPUT_PULLUP);
apagarLEDs();
}
void loop() {
if (digitalRead(BOTON_P1) == LOW) {
semaforoActivo = !semaforoActivo;
if (!semaforoActivo) apagarLEDs();
delay(300); // Antirrebote
}
if (digitalRead(BOTON_P2) == LOW) {
cambiarVelocidad();
delay(300); // Antirrebote
}
if (semaforoActivo) {
unsigned long ahora = millis();
if (ahora - tiempoAnterior >= intervalo) {
tiempoAnterior = ahora;
cambiarEstado();
}
}
}
void cambiarEstado() {
switch (estado) {
case 0: // Verde
digitalWrite(LED_VERDE, HIGH);
digitalWrite(LED_AMARILLO, LOW);
digitalWrite(LED_ROJO, LOW);
digitalWrite(LED_EXTRA, LOW);
estado = 1;
break;
case 1: // Amarillo
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_AMARILLO, HIGH);
digitalWrite(LED_ROJO, LOW);
digitalWrite(LED_EXTRA, LOW);
estado = 2;
break;
case 2: // Rojo
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_AMARILLO, LOW);
digitalWrite(LED_ROJO, HIGH);
digitalWrite(LED_EXTRA, LOW);
estado = 3;
break;
case 3: // LED Extra (parpadeo o aviso)
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_AMARILLO, LOW);
digitalWrite(LED_ROJO, LOW);
digitalWrite(LED_EXTRA, HIGH);
estado = 0;
break;
}
}
void cambiarVelocidad() {
if (intervalo > 300) {
intervalo -= 200;
} else {
intervalo = 1000; // reinicia a lento
}
}
void apagarLEDs() {
digitalWrite(LED_ROJO, LOW);
digitalWrite(LED_AMARILLO, LOW);
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_EXTRA, LOW);
}