const int buttonPin = 2; // Pin del botón
const int greenPin = 12; // Pin LED verde
const int yellowPin = 10; // Pin LED amarillo
const int redPin = 8; // Pin LED rojo
unsigned long previousMillis = 0; // Almacena el último tiempo
int ledState = 0; // Estado del semáforo
bool buttonPressed = false;
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // Botón con resistencia interna pull-up
pinMode(greenPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(redPin, OUTPUT);
}
void loop() {
// Verifica el estado del botón
if (digitalRead(buttonPin) == LOW) { // Botón presionado
buttonPressed = true;
} else {
buttonPressed = false;
// Apaga todos los LEDs cuando el botón no está presionado
digitalWrite(greenPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(redPin, LOW);
ledState = 0; // Reinicia el estado
}
// Si el botón está presionado, controla la secuencia del semáforo
if (buttonPressed) {
unsigned long currentMillis = millis();
// Verifica el estado y el tiempo para cambiar entre LEDs
switch (ledState) {
case 0:
// LED verde encendido por 3.5 segundos
digitalWrite(greenPin, HIGH);
digitalWrite(yellowPin, LOW);
digitalWrite(redPin, LOW);
if (currentMillis - previousMillis >= 3500) {
previousMillis = currentMillis;
ledState = 1;
}
break;
case 1:
// LED amarillo encendido por 1 segundo
digitalWrite(greenPin, LOW);
digitalWrite(yellowPin, HIGH);
digitalWrite(redPin, LOW);
if (currentMillis - previousMillis >= 1000) {
previousMillis = currentMillis;
ledState = 2;
}
break;
case 2:
// LED rojo encendido por 5 segundos
digitalWrite(greenPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(redPin, HIGH);
if (currentMillis - previousMillis >= 5000) {
previousMillis = currentMillis;
ledState = 0;
}
break;
}
}
}