// Definir pines
#define trigPin 8
#define echoPin 9
#define greenLED 5
#define yellowLED 6
#define redLED 7
// Variables para medir la distancia
long duration;
int distance;
int lastDistance = -1;
// Variables para el control del semáforo
unsigned long lastObjectTime = 0; // Almacena el tiempo del último objeto detectado
int state = 0; // Estado inicial: LED verde encendido
void setup() {
Serial.begin(9600); // Iniciar comunicación serial
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(greenLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
pinMode(redLED, OUTPUT);
}
void loop() {
// Generar un pulso ultrasónico
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Medir el tiempo que tarda en llegar el eco
duration = pulseIn(echoPin, HIGH);
// Calcular la distancia en centímetros
distance = duration * 0.0344 / 2;
// Actualizar el estado del semáforo si se detecta un objeto
if (distance < 399) {
lastObjectTime = millis(); // Actualizar el tiempo del último objeto detectado
}
// Controlar el semáforo en función de la distancia medida
if (distance >= 399) { // LED verde
state = 0;
// Mostrar la distancia solo cuando cambie
if (distance != lastDistance) {
Serial.print("Distancia: ");
Serial.print(distance);
Serial.println(" cm");
lastDistance = distance; // Actualizar la última distancia
}
} else if (distance >= 150) { // LED amarillo
state = 1;
// Mostrar la distancia solo cuando cambie
if (distance != lastDistance) {
Serial.print("Distancia: ");
Serial.print(distance);
Serial.println(" cm");
lastDistance = distance; // Actualizar la última distancia
}
} else { // LED rojo
state = 2;
// Mostrar la distancia solo cuando cambie
if (distance != lastDistance) {
Serial.print("Distancia: ");
Serial.print(distance);
Serial.println(" cm");
lastDistance = distance; // Actualizar la última distancia
}
}
// Máquina de estados para controlar el semáforo
switch (state) {
case 0: // LED verde encendido
digitalWrite(greenLED, HIGH);
digitalWrite(yellowLED, LOW);
digitalWrite(redLED, LOW);
break;
case 1: // LED amarillo encendido
digitalWrite(greenLED, LOW);
digitalWrite(yellowLED, HIGH);
digitalWrite(redLED, LOW);
break;
case 2: // LED rojo encendido
digitalWrite(greenLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(redLED, HIGH);
break;
}
}