//SANAKAN Lima 23/06/2025
// Pines LEDs (Semáforo)
const int ledVerde = 18;
const int ledAmarillo = 17;
const int ledRojo = 16;
// Pines Botones (Pull-up físico con resistencia a 3.3V)
const int btnStart = 36; // inicio
const int btnStop = 39; // parar
const int btnSlower = 34; // más lento
const int btnFaster = 35; // más rápido
// Variables
bool semaforoActivo = false;
unsigned long velocidad = 1000;
unsigned long ultimaLectura = 0;
const unsigned long tiempoRebote = 200;
// Valores fijos de velocidad
const unsigned long VEL_NORMAL = 1000;
const unsigned long VEL_RAPIDA = 100;
const unsigned long VEL_LENTA = 3000;
void setup() {
pinMode(ledRojo, OUTPUT);
pinMode(ledAmarillo, OUTPUT);
pinMode(ledVerde, OUTPUT);
pinMode(btnStart, INPUT);
pinMode(btnStop, INPUT);
pinMode(btnFaster, INPUT);
pinMode(btnSlower, INPUT);
}
void loop() {
unsigned long tiempoActual = millis();
if ((digitalRead(btnStart) == 0) && tiempoActual - ultimaLectura > tiempoRebote) {
iniciarSemaforo();
ultimaLectura = tiempoActual;
}
if ((digitalRead(btnStop) == 0) && tiempoActual - ultimaLectura > tiempoRebote) {
detenerSemaforo();
ultimaLectura = tiempoActual;
}
if ((digitalRead(btnFaster) == 0) && tiempoActual - ultimaLectura > tiempoRebote) {
velocidadRapida();
ultimaLectura = tiempoActual;
}
if ((digitalRead(btnSlower) == 0) && tiempoActual - ultimaLectura > tiempoRebote) {
velocidadLenta();
ultimaLectura = tiempoActual;
}
if (semaforoActivo == true) {
cicloSemaforo();
}
}
void iniciarSemaforo() {
semaforoActivo = true;
velocidad = VEL_NORMAL;
}
void detenerSemaforo() {
semaforoActivo = false;
apagarTodos();
}
void velocidadRapida() {
velocidad = VEL_RAPIDA;
}
void velocidadLenta() {
velocidad = VEL_LENTA;
}
void cicloSemaforo() {
encenderLed(ledVerde); delay(velocidad);
encenderLed(ledAmarillo);delay(velocidad);
encenderLed(ledRojo); delay(velocidad);
}
void encenderLed(int pin) {
digitalWrite(ledRojo, pin == ledRojo ? HIGH : LOW);
digitalWrite(ledAmarillo, pin == ledAmarillo ? HIGH : LOW);
digitalWrite(ledVerde, pin == ledVerde ? HIGH : LOW);
}
void apagarTodos() {
digitalWrite(ledRojo, LOW);
digitalWrite(ledAmarillo, LOW);
digitalWrite(ledVerde, LOW);
}
START
STOP
LENT
RAPI
SANAKAN