Semáforo con sensor ultrasónico y servo

Buenos días.
Estoy haciendo un proyecto para mi instituto y quiero hacer un semáforo con paso a nivel y zumbador.
Me gustaría conectar un sensor ultrasónico para que cuando pasará el "tren" automáticamente se bajará la barrera y se encendiera el led rojo y el zumbador, pero no se como hacerlo.
Me podrían ayudar?
Este es código que tengo hecho con el zumbador, el semáforo y la barrera, me falta implementar el sensor.
#include <Servo.h> //Importamos la biblioteca Servo.h

#include <Arduino.h>

Servo barrera; //Declaramos un servo y se llama barrera, con esto vamos a trabajar

int ledv = 11; //Declaramos un led, en este caso el verde sobre el pin 11

int leda = 12;

int ledr = 13;

//Establecemos el modo de función de cada led

const int pinBuzzer = 10; // ZUMBADOR

void setup(){

pinMode(ledv, OUTPUT);

pinMode(leda, OUTPUT);

pinMode(ledr, OUTPUT);

//Asociamos el servomotor al pin 9 del Arduino

barrera.attach(9);

}

void loop(){

//Comenzamos nuestro programa encendiendo el Led rojo ya que nuestra barrera comienza con la posición 0.

//Esto es ajustable dado que nosotros decidimos las posiciones iniciales

digitalWrite(ledr, HIGH);

//Le mandamos un angulo de 10 grados a nuestro servo por errores de funcionamiento. //Recomiendo que el inicio del mismo sea en 0 grados

digitalWrite(ledr, LOW);

digitalWrite(ledv, HIGH);

delay(1000);

barrera.write(10);

//Hacemos un delay de 5 segundo antes de mandarle la siguiente instruccion

delay (5000);

digitalWrite(ledv, LOW);

delay(1000);

digitalWrite(leda, HIGH);

delay(1000);

digitalWrite(10, HIGH);//enciende zumbador

tone(10, 440, 4000);

digitalWrite(leda, LOW);

delay(1000);

digitalWrite(leda, HIGH);

delay(1000);

digitalWrite(leda, LOW);

delay(1000);

digitalWrite(leda, HIGH);

delay(1000);

digitalWrite(leda, LOW);

delay(1000);

digitalWrite(ledr, HIGH);

//Una vez ha cambiado el led a rojo, cambiamos la posición de la barrera.

barrera.write(100);

delay(5000);

digitalWrite(ledv, LOW);

}

Gracias

Buen día.
Soy novato pero espero poder apoyarte un poco jeje :sweat_smile:.

Quisiera que aclares que sensor de ultrasonido estás utilizando, ya que puede dar datos análogos o digitales. Si no lo has adquirido, también se pueden utilizar se pueden utilizar sensores que detectan presencia o ausencia a una distancia determinada.

¿A qué distancia está el tren respecto al sensor de ultrasonido? En caso de ser el HC-SR04 esto permitirá establecer las condiciones para saber en qué rango de distancia detectada se debe actuar.

Yo considero que el proyecto podría mejorar así: Recuerda que el sensor puede detectar hasta una distancia de 4 metros, por lo cual puede hacer que detecte el tren desde lejos para que le de funcionamiento al semaforo, según la cercanía del tren con el semáforo, este cambiará a amarillo o rojo.

Dejo el código según como lo propongo:
Si el tren es detectado entre 20 a 40cm se activará el amarillo
Si el tren es detectado a una distancia menor a 20cm se activa el rojo, la barrera y el zumbador.
Si el tren no es detectado en ninguno de los rangos, estará activado el verde.

#include <Servo.h> //Importamos la biblioteca Servo.h
Servo barrera; //Declaramos un servo y se llama barrera, con esto vamos a trabajar

int ledv = 11; //Declaramos un led, en este caso el verde sobre el pin 11
int leda = 12;
int ledr = 13;//Establecemos el modo de función de cada led

int Trigger = 2;   //Pin D2 - Trigger
int Echo = 3;   //Pin D3 - Echo
int t; //tiempo que demora en llegar el eco
int d; //distancia en centimetros

void setup(){
pinMode(ledv, OUTPUT);
pinMode(leda, OUTPUT);
pinMode(ledr, OUTPUT);
pinMode(Trigger, OUTPUT); //pin como salida
pinMode(Echo, INPUT);  //pin como entrada
barrera.attach(9); //Asociamos el servomotor al pin 9 del Arduino
}

void loop(){

digitalWrite(Trigger, HIGH);
delayMicroseconds(10);          //Enviamos un pulso de 10us
digitalWrite(Trigger, LOW);

t = pulseIn(Echo, HIGH); //ancho del pulso
d = t / 58.2;           //Escalar distancia a cm (segun datasheet)
  
 if (d < 20) { //distancia menor a 20cm activa rojo, barrera y zumbador
digitalWrite(ledr, HIGH);
barrera.write(100);
tone(10, 440, 4000);
delay(5000);
digitalWrite(ledr, LOW);
barrera.write(10);
}
else if (d >= 20&& d < 40) { //distancia 20 a 40cm activa el amarillo
digitalWrite(leda, HIGH);
delay(200);
digitalWrite(leda, LOW);
delay(200);
}
 else {        // Cualquier otra distancia tendra activado el verde
digitalWrite(ledv, HIGH);
delay(100);
digitalWrite(ledv, LOW);
}
}

Finalmente como recomendación te aconsejo que busques de mejor manera la información, ya que videos u otros foros podrían darte la respuesta a lo que buscas y usa texto performateado para copiar el código.

Seguramente hay muchas más soluciones y más divertidas para implementar. Por ejemplo, bajar progresivamente la barrera según la cercanía del tren, o activar el buzzer cuando pasa el tren a un tono que se asemeje a la bocina, etc.. sin embargo, eso depende del tiempo y dedicación que le pongas al proyecto.

Buen día ~

Muchas gracias.
Me has ayudado bastante.
Un saludo

Lee el privado que te he enviado.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.