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.