Introduction: Traffic Signal / Stop Light Wiring With Arduino Controller

About: Drunk posting ill conceived instructables since 2009.

I always wanted an old traffic signal and finally got one recently.  However, it was very simply wired so that all the lights were fixed on.  What fun is that?  I also wanted to try out an Arduino controller and thought this would be a nice simple project to incorporate it into. 

This Instructable will show you how to wire up an old traffic signal with an Arduino controller to function like a real traffic light.  I used a pretty simple program and controls.  Given the power of the Arduino controller, there are a lot of ways you can customize this.

Step 1: Stuff You Will Need

Obviously you will need an old traffic signal.  I got mine on Craigslist for $40.  It is one of the newer plastic cased ones, but it looks fine from a distance.  I would kind of like an old metal one, but I'll have to upgrade later I guess.

The brains of this thing are going to be an Arduino Uno connected to a relay module. 

Arduino Uno

SainSmart 4-Channel 5V Relay Module
(Note:  This relay is pretty loud.  I can hear it click from across the room.  If anyone has suggestions for something similar that is not as noisy, let me know.)

You will need a power supply (transformer, wall wart, AC/DC adapter) for the Arduino.  I used a 12V 750mA wall wart that I had from some other piece of electronics that had died.  Most 7V to 12 V transformers should work.  You can pick one up at Goodwill for about $2.  Stay away from Radio Shack, they wanted $20-$30 for wall warts!  I am sure someone who knows more about the Arduinos can chime in as to what kind of amperage range you should stay in.  Here's one from Amazon that should work fine:

You will also need some male to female jumpers to connect the Arduino to the relay module (note, I did not have these but wish I did):

Note:  If you do not want to mess with the Arduino, there are a couple ready to go traffic signal controllers available online.  I could have gone this route, but I was really wanting to try out the Arduino:

A lamp or appliance cord with ground wire

Other materials you will need will depend on the starting state of your traffic signal.  I used some 16 ga wire (for the internal line voltage wiring), solder, sheet metal screws (for securing the Arduino and relay module, and attaching ground wires to the frame), wire nuts (for connecting line voltage wires), epoxy (to secure transformer), heat shrink tubing (to insulate transformer connections).


You will need a USB B cable to connect the Arduino to your computer to program it.  If you have a USB printer you should already have one of these.

Wire cutters
Wire strippers
mini flat head screwdriver for relay connections

Other tools you will need will again depend on the initial state of your traffic signal.  I used the following:

Cordless drill (for drilling holes in the case)
Soldering Iron (for wire connections and heat shrink tubing)
Dremel tool with milling bit (cut off some the plastic in the case to make mounting the new components easier)
Eye and hearing protection if you are using power tools.


You will need the Arduino programming software to upload the code to the Arduino:

Step 2: The Plan

Below is a wiring diagram for the traffic signal.  Hopefully this is pretty clear what gets wired to what. 

Step 3: The Brains

Above is a photo of the Arduino Uno and the relay module with the wiring between the two attached.  I only had male to male jumpers, so I used a Molex connector and my mad soldering skills to make a connector (second photo).  It is probably easier to use male to female jumpers to connect everything or find a 6 pin jumper to use.  The Arduino has all female sockets and the relay module has all male pins.

Step 4: Program It!

If you have not used an Arduino before, see this Instructable by randofo:

Download and start the Arduino programming software if you have not already.  Connect the Arduino to your computer with a USB B cable.

Copy and paste the code the below and upload it to the Arduino.  One the code uploads it should start running immediately on the Arduino.  You should see the indicator lights going on and off on the relay unit and hear the relay switches tripping.

You can make this more simple or complicated if you want.  I have it set up to cycle through 25 normal cycles, switch to blinking red for a few minutes, do 25 more normal cycles, switch to blinking yellow for a few minutes, and then repeat.

//Fzumrk's traffic controller code

// name your pins:
int red = 12;
int yellow = 11;
int green = 10;

// the setup routine runs once when you press reset:
void setup() {               
  // initialize the digital pin as an output.
  pinMode(red, OUTPUT);
  pinMode(yellow, OUTPUT);
  pinMode(green, OUTPUT);
int  var = 0; //defines and sets initial value for variables used below
int var1 = 0; //defines and sets initial value for variables used below

// the loop routine runs over and over again forever:
void loop() {

// sets initial value for pins so that lights start as "off" 
digitalWrite(green, HIGH);
digitalWrite(yellow, HIGH);
digitalWrite(red, HIGH);

while(var < 25){
  // repeats normal cycle 25 times
  digitalWrite(green, LOW);   // turns the green light on
  delay(20000);               // holds the green light on for 20 seconds
  digitalWrite(green, HIGH);    // turns the green light off
  delay(600);               // slight pause between lights
  digitalWrite(yellow, LOW);  //turns the yellow light on
  delay(4000); //holds the yellow light for 4 seconds (watch out for that red-light camera!)
  digitalWrite(yellow, HIGH); //turns the yellow light off
  delay(600);  //slight pause between lights
  digitalWrite(red, LOW);  //turns the red light on
  delay(20000);  //holds the red light on for 20 seconds
  digitalWrite(red, HIGH);  //turns the red light off
  delay(600);  //slight pause between lights
  var++;}  //adds 1 to variable "var" for repeat count

  // after 25 cycles above, the light switches to "power outage mode", flashing red
  delay(600); //slight delay
  var1=0; //resets variable "var1" to 0
  while(var1 < 120) {
    // repeats power outage cycle 120 times - 2 minutes
   digitalWrite(red, LOW);
   digitalWrite(red, HIGH);
var = 0;

//switches back to normal cycle after "power outage" cycle is done
while(var < 25){
  // back to normal light cycle for 25 cycles
  digitalWrite(green, LOW);   // turn the LED on (HIGH is the voltage level)
  delay(20000);               // wait for a second
  digitalWrite(green, HIGH);    // turn the LED off by making the voltage LOW
  delay(600);               // wait for a second
  digitalWrite(yellow, LOW);
  digitalWrite(yellow, HIGH);
  digitalWrite(red, LOW);
  digitalWrite(red, HIGH);

 //switches to "late night cycle" flashing yellow for 2 minutes, similar to flashing red above
  while(var1 < 120) {
   digitalWrite(yellow, LOW);
   digitalWrite(yellow, HIGH);
   var = 0;
 //goes back to normal cycle at top and repeats forever 

Step 5: Power Supply

I converted a wall wart type transformer to a built in power supply by soldering some pig-tails to the wall plug blades and insulating them with heat shrink tubing.  I then hard-wired the transformer to the power cord coming into the traffic signal.  You can always run this wire separate and plug it directly into an outlet if you do not want to covert the transformer like I did.

Step 6: Wire It Up

MAKE SURE THE WALL PLUG IS NOT PLUGGED IN WHEN YOU ARE WORKING ON THE INTERNAL WIRING.  If you don't know to do this, you probably should not be attempting this project.  Anyway, consider yourself warned.  I take no responsibility for accidental electrocutions.

The case for my traffic signal is made of plastic, but there are some metal parts on it that I thought should be grounded.  If yours has a metal case, you should probably ground the case directly. 

I used normal wire nuts for the all of the line voltage wiring connections.  I tinned the ends of the stranded wires with solder before putting on the wire nuts.

Step 7: Run It!

The traffic light's normal cycle:

"Power Outage" mode, blinking red:

The internal workings: