Arduino Level Crossing

A model railroad level crossing with gates, flashing lights and alarm bell.

This page contains the Arduino sketch, materials list, wiring instructions, video tutorial.

 

Arduino Level Crossing
Arduino Level Crossing

Video instructions are at the bottom of the page.

 

Materials Required For Arduino Level Crossing

Arduino Uno

Christmas Light LEDs wired anode to cathode with 500 1k resistor on each leg. Get cheap out of season or at flea markets.

Or use standard LEDs connected with fine magnet wire.  See How To Solder Magnet Wire  This method allows for reducing the distance the wiring sticks out on the pack of the light.

IR sensor – You can find them cheap searching eBay for “IR Infrared Obstacle Avoidance Sensor Module for Arduino” You can get them at any of the marketplaces.

Servo – Tower pro Micro servo 9g SG90 Again available in all the marketplaces.

 

Level Crossing Arduino Sketch

Copying from a web page results in Unicode characters being used.  Arduino IDE requires ASCI.   Then rename it as an .ino file  Copy this, paste it in Notepad and save as a text file. That results in ASCI. That text can be added to the IDE.

//////////////////////////////////////////

// Level Crossing
// Adapted from Version 1.4 Geoff Bunza 2018
// Modified by Gary Granai steamtraininfo.com 2020
// Uses software servo Library
//
#include <Servo.h>
Servo gate1servo; // create servo object to control crossing gate 1
//ASSUMPTION Gate is down at position 30 and up at position 120
Servo gate2servo; // create servo object to control crossing gate 2
//ASSUMPTION Gate is down at position 30 and up at position 120
int sensor1 = 5; // IR sensor pin Assumption== Pin goes LOW when train detected
int sensor2 = 6; // IR sensor pin Assumption== Pin goes LOW when train detected
int led1 = 10; // Led 1 pin first alternating flasher
int led2 = 11; // Led 2 pin first alternating flasher
int led3 = 12; // Led 3 pin second alternating flasher
int led4 = 13; // Led 4 pin second alternating flasher
int gatelow = 30; // variable to store the servo low gate stop position
int gatehigh = 120; // variable to store the servo high gate stop position
int gateposition = 120; // variable to store the servo gateposition
int entering_sensor = 5; //this will tell which sensor was triggered first
int leaving_sensor = 6; // this will tell which sensor shows train leaving
int gates_started = 0; // this says if the crossing is active
int flash_state = 0;
long flash_time = 0;
long flash_interval = 900; // time in milliseconds between alternating flashes
int sensor_count = 0;
void setup()
{
gate1servo.attach(3); // attaches the servo on pin 3 to the servo object
gate2servo.attach(4); // attaches the servo on pin 4 to the servo object
gate1servo.write(gateposition); //start assuming no train
gate2servo.write(gateposition); //start assuming no train
pinMode(sensor1, INPUT);
pinMode(sensor2, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
digitalWrite(led1, LOW); // Start with all flashers off
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
flash_time = millis();
}
void loop()
{
if ((digitalRead (sensor1)==LOW)&& (gates_started==0)) {
gates_started = 1;
leaving_sensor = sensor2;
starting_sequence();
}
if ((digitalRead (sensor2)==LOW)&& (gates_started==0)) {
gates_started = 1;
leaving_sensor = sensor1;
starting_sequence();
}
if (gates_started) flash_leds(); //gates are down continue flashing
if ((digitalRead(leaving_sensor)==LOW)&&(gates_started==1)) { //train is starting to leave

//as long as the leaving sensor is active the train is still in the crossing
while (gates_started==1) { //now check if train is REALLY gone
sensor_count = 0;
for (int i=1; i<40; i++) {
if (digitalRead(leaving_sensor)==LOW) sensor_count++;
delay (30);
flash_leds();
}
if (sensor_count==0) gates_started=0;
flash_leds();
}
// we only get here if the train has really left the crossing
ending_sequence();
}
}
void starting_sequence() {
long wait_time;
flash_time = millis();
wait_time = millis()+3000;
while (wait_time > millis()) flash_leds(); //flash before dropping gates
for(gateposition = gatehigh; gateposition>gatelow; gateposition-=1) // goes from gatehigh degrees to gatelow degrees
{
gate1servo.write(gateposition); // tell servo to go to gateposition in variable ‘gateposition’
gate2servo.write(gateposition); // tell servo to go to gateposition in variable ‘gateposition’
flash_leds(); // keep flashing leds
delay(40); // waits 40ms to slow servo
}
}
void ending_sequence() {
for(gateposition = gatelow; gateposition<gatehigh; gateposition++) // goes from gatelow degrees to gatehigh degrees
{
gate1servo.write(gateposition); // tell servo to go to gateposition in variable ‘gateposition’
gate2servo.write(gateposition); // tell servo to go to gateposition in variable ‘gateposition’
flash_leds(); // keep flashing leds
delay(40); // waits 40ms to slow servo
}
digitalWrite(led1, LOW); // flashers completely off
digitalWrite(led3, LOW);
digitalWrite(led2, LOW);
digitalWrite(led4, LOW);
delay(30000); // 30 second delay to account for the train passing the starting entry sensor
}
void flash_leds() {
if (flash_time > millis()) return;
flash_state = ~flash_state;
digitalWrite(led1, flash_state); // Alternate flashers
digitalWrite(led3, flash_state);
digitalWrite(led2, ~flash_state);
digitalWrite(led4, ~flash_state);
flash_time = millis()+flash_interval;
}

 

Wiring Instructions For Arduino Level Crossing

Servo control wires attach to  pins 3 and 4

Ir detector wires attach to pins 5 and 6

LED flashers to pins 10 & 11 and 12 & 13 .

The servo and IR detector + and – connect to an external 5 v dc power source.

The LED pairs are connected cathode to anode.  At each junction add a resistor   500 to 1000 ohm is good.  But check what is best for your LED.

 

Wiring Diagram For Arduino Level Crossing

 

Click to Enlarge And Print.

 

 

 

 

 

 

 

Level Crossing Video Demonstration

level crossing arduino instruction
Click on image to watch sketch in action

This video shows the crossing in action;  Click on the image or click here.

 

 

 

 

This tutorial is part of our series Arduino Projects.  There is a video playlist at Playlist

Tell others about this information by using one of these services. Thank you for the support.
Scroll to top