// Definición de pines
const int semaforo_verde = 15;
const int semaforo_amarillo = 2;
const int semaforo_rojo = 0;
const int boton_encendido = 22; // Botón para encender/apagar
const int switch_intermitencia = 23; // Switch para cambiar de modo
// Variables de estado
bool sistemaActivo = false; // Estado del sistema (encendido/apagado)
unsigned long tiempo_verde = 4000; // 4 segundos
unsigned long tiempo_amarillo = 12000; // 12 segundos
unsigned long tiempo_rojo = 3000; // 3 segundos
unsigned long tiempo_ultimo_cambio = 0; // Tiempo de último cambio
int estado_semaforo = 0; // 0 = verde, 1 = amarillo, 2 = rojo
void setup() {
// Configuración de pines del semáforo
pinMode(semaforo_verde, OUTPUT);
pinMode(semaforo_amarillo, OUTPUT);
pinMode(semaforo_rojo, OUTPUT);
// Configuración de pines de control
pinMode(boton_encendido, INPUT_PULLUP);
pinMode(switch_intermitencia, INPUT_PULLUP);
// Inicialización del semáforo (apagado al inicio)
apagarSemaforo();
}
void loop() {
// Leer estado del botón para encender/apagar
if (digitalRead(boton_encendido) == LOW) {
delay(200); // Antirrebote
sistemaActivo = !sistemaActivo; // Cambiar el estado del sistema
if (sistemaActivo) {
iniciarSemaforoEnVerde(); // Iniciar en verde si el sistema está activo
} else {
apagarSemaforo(); // Apagar LEDs si el sistema está apagado
}
}
// Verificar si el sistema está activo
if (sistemaActivo) {
// Leer el estado del switch
bool modoIntermitente = digitalRead(switch_intermitencia) == LOW;
if (modoIntermitente) {
// Modo intermitente en amarillo
intermitenciaAmarillo();
} else {
// Modo normal
cicloSemaforo();
}
}
}
void iniciarSemaforoEnVerde() {
// Reiniciar el estado del semáforo a verde
estado_semaforo = 0;
tiempo_ultimo_cambio = millis(); // Reiniciar el tiempo
digitalWrite(semaforo_verde, HIGH);
digitalWrite(semaforo_amarillo, LOW);
digitalWrite(semaforo_rojo, LOW);
}
void cicloSemaforo() {
unsigned long tiempo_actual = millis();
// Comprobamos el tiempo transcurrido para cambiar el estado del semáforo
if (estado_semaforo == 0) { // Semáforo en verde
if (tiempo_actual - tiempo_ultimo_cambio >= tiempo_verde) {
estado_semaforo = 1; // Cambiar a amarillo
tiempo_ultimo_cambio = tiempo_actual;
digitalWrite(semaforo_verde, LOW);
digitalWrite(semaforo_amarillo, HIGH);
digitalWrite(semaforo_rojo, LOW);
}
} else if (estado_semaforo == 1) { // Semáforo en amarillo
if (tiempo_actual - tiempo_ultimo_cambio >= tiempo_amarillo) {
estado_semaforo = 2; // Cambiar a rojo
tiempo_ultimo_cambio = tiempo_actual;
digitalWrite(semaforo_verde, LOW);
digitalWrite(semaforo_amarillo, LOW);
digitalWrite(semaforo_rojo, HIGH);
}
} else if (estado_semaforo == 2) { // Semáforo en rojo
if (tiempo_actual - tiempo_ultimo_cambio >= tiempo_rojo) {
estado_semaforo = 0; // Reiniciar ciclo (verde)
tiempo_ultimo_cambio = tiempo_actual;
digitalWrite(semaforo_verde, HIGH);
digitalWrite(semaforo_amarillo, LOW);
digitalWrite(semaforo_rojo, LOW);
}
}
}
void intermitenciaAmarillo() {
// Hacer parpadear el semáforo en amarillo
digitalWrite(semaforo_verde, LOW);
digitalWrite(semaforo_rojo, LOW);
digitalWrite(semaforo_amarillo, HIGH);
delay(500); // Amarillo encendido por 0.5 segundos
digitalWrite(semaforo_amarillo, LOW);
delay(500); // Amarillo apagado por 0.5 segundos
}
void apagarSemaforo() {
// Apagar todos los LEDs
digitalWrite(semaforo_verde, LOW);
digitalWrite(semaforo_amarillo, LOW);
digitalWrite(semaforo_rojo, LOW);
}