#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
const int ledRojo = 6;
const int ledAmarillo = 5;
const int ledVerde = 4;
const int trigPin = 2;
const int echoPin = 3;
const int servoPin = 9;
// Inicializamos el servo y la pantalla LCD
Servo myServo;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Dirección I2C y tamaño de pantalla (16x2)
void setup() {
// Configuración de LEDs
pinMode(ledRojo, OUTPUT);
pinMode(ledAmarillo, OUTPUT);
pinMode(ledVerde, OUTPUT);
// Configuración del sensor ultrasónico
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Configuración del servo motor
myServo.attach(servoPin);
// Configuración de la pantalla LCD
lcd.begin(16, 2);
lcd.print("Semaforo Iniciado");
delay(2000); // Mostrar mensaje por 2 segundos
lcd.clear();
}
void loop() {
long duracion, distancia;
// Enviar pulso para medir distancia con el sensor ultrasónico
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Leer duración del pulso en el pin Echo
duracion = pulseIn(echoPin, HIGH);
// Calcular distancia en cm
distancia = duracion * 0.0344 / 2;
// Mostrar la distancia en la pantalla LCD
lcd.setCursor(0, 0);
lcd.print("Distancia: ");
lcd.print(distancia);
lcd.print(" cm");
// Control del semáforo
if (distancia < 10) { // Si la distancia es menor a 10 cm (p.ej. coche cerca)
digitalWrite(ledRojo, HIGH); // Rojo encendido
digitalWrite(ledAmarillo, LOW); // Amarillo apagado
digitalWrite(ledVerde, LOW); // Verde apagado
myServo.write(90); // Mover el servo a 90 grados (ej. bajar barrera)
lcd.setCursor(0, 1);
lcd.print("Semaforo Rojo ");
}
else if (distancia < 20) { // Si la distancia está entre 10 y 20 cm
digitalWrite(ledRojo, LOW);
digitalWrite(ledAmarillo, HIGH); // Amarillo encendido
digitalWrite(ledVerde, LOW);
myServo.write(45); // Servo en posición 45 grados (barrera parcialmente subida)
lcd.setCursor(0, 1);
lcd.print("Semaforo Amarillo");
}
else { // Si la distancia es mayor a 20 cm
digitalWrite(ledRojo, LOW);
digitalWrite(ledAmarillo, LOW);
digitalWrite(ledVerde, HIGH); // Verde encendido
myServo.write(0); // Servo en posición 0 grados (barrera arriba)
lcd.setCursor(0, 1);
lcd.print("Semaforo Verde ");
}
delay(500); // Espera antes de tomar otra medición
}a