// Definimos los pines para el sensor HC-SR04
const int trigPin = 9;
const int echoPin = 8;
// Definimos los pines para los LEDs
const int greenLedPin = 7;
const int yellowLedPin = 6;
const int redLedPin = 5;
// Variables para medir la distancia
long duration;
int distance;
bool cycleInProgress = false; // Variable para controlar el ciclo
void setup() {
// Inicializamos los pines como entradas o salidas
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(greenLedPin, OUTPUT);
pinMode(yellowLedPin, OUTPUT);
pinMode(redLedPin, OUTPUT);
// Inicialmente, el semáforo estará en verde
digitalWrite(greenLedPin, HIGH);
digitalWrite(yellowLedPin, LOW);
digitalWrite(redLedPin, LOW);
Serial.begin(9600); // Iniciamos la comunicación serial
}
void specialCycle() {
// Ciclo especial cuando la distancia es mayor de 50 cm
for (int i = 0; i < 1; i++) { // Repetir
Serial.println("Paso vehicular");
digitalWrite(greenLedPin, HIGH);
digitalWrite(yellowLedPin, LOW);
digitalWrite(redLedPin, LOW);
delay(30000); // Encender el LED verde durante 30 segundos
Serial.println("Advertencia para paso peatonal");
digitalWrite(greenLedPin, LOW);
digitalWrite(yellowLedPin, HIGH);
digitalWrite(redLedPin, LOW);
delay(3000); // Encender el LED amarillo durante 3 segundos
Serial.println("Paso peatonal");
digitalWrite(greenLedPin, LOW);
digitalWrite(yellowLedPin, LOW);
digitalWrite(redLedPin, HIGH);
delay(15000); // Encender el LED rojo durante 15 segundos
}
}
void loop() {
// Generamos un pulso ultrasónico
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Medimos el tiempo que tarda en llegar el eco
duration = pulseIn(echoPin, HIGH);
// Calculamos la distancia en centímetros
distance = duration * 0.034 / 2;
// Verificamos la distancia y cambiamos el semáforo en consecuencia
if (distance > 20 && distance <= 40) {
// Si la distancia está entre 20 cm y 40 cm, encendemos el LED amarillo
digitalWrite(greenLedPin, LOW);
digitalWrite(yellowLedPin, HIGH);
digitalWrite(redLedPin, LOW);
Serial.println("Advertencia para paso peatonal");
}
else if (distance <= 20) {
// Si la distancia es menor o igual a 20 cm, encendemos el LED rojo
digitalWrite(greenLedPin, LOW);
digitalWrite(yellowLedPin, LOW);
digitalWrite(redLedPin, HIGH);
delay(3000); // Encender el LED amarillo durante 3 segundos
Serial.println("Peaton en la via");
} else if (!cycleInProgress) {
cycleInProgress = true;
specialCycle(); // Llamamos a la función del ciclo especial
cycleInProgress = false; // Terminamos el ciclo y volvemos al semáforo normal
}
delay(1000); // Esperamos un segundo antes de la próxima lectura
}