A Remotely Programable Relay Controller (Christmas Lights or Home Automation Controller)

90,077

353

158

Introduction: A Remotely Programable Relay Controller (Christmas Lights or Home Automation Controller)

About: I have a background in digital electronics, and am very interested in computers. I love things that blink, and am in awe of the physics associated with making blue LEDs.


What was that?  A Whats-a-Maja-Thimagig?

Yep - One of those!  This Instructable extends my Arduino Ethernet controller to control a set of up to 6 relays, but that's not the neat bit.  The neat bit is that there is a web based state machine in the AtMega chip so that the relays will operate in whatever sequence with whatever timing you want - all by themselves.

This allows you to have a set of relays connected to the end of a piece of Ethernet cable that can be accessed from a web browser anywhere from your house.

I needed a system to sequence a set of relays to control some Christmas lights around my house this Christmas, as well as to turn on and off a water fountain, so I thought that a simple controller for it would be an AtMega328 chip.  Then I thought about how cool it would be to allow these things to be controlled from a web interface.  A little bit of tinkering later, and this project was born.  I really only needed 4 relays, but as I was doing the layout, I decided that here was enough space for 6!

This project is an autonomous controller, operating a set of 6 relays according to a pre-programmed pattern, over and over again.  If you are impatient, jump to the section on programing the board to see how it is programmed.

In my case, I wanted to control a fountain and some Christmas lights, so my pre-programmed pattern is as follows:

Relay 1 - Front fairy lights
Relay 2 - Fountain Blue Light
Relay 3 - Fountain Green Light
Relay 4 - Fountain Pump

On startup, do the following forever until it is switched off:

Turn on the Fairy lights, the Blue light and run the pump.  After 3 minutes, turn off the blue light, and turn on the Green light.  After 3 more minutes, turn off the fountain and the fountain lights.

This would be defined in the controller as:-

State0;  Relay 1, Relay 2, Relay 4 - time 3 minutes - jump to state 1
State1;  Relay 1, Relay 3, Relay 4 - time 3 minutes - jump to state 2
State2;  Relay 1 - time 3 minutes - jump to state 0

Relay 1 would be connected to the Fairy lights. 
Relay 2 would be connected to the Blue light
Relay 3 would be connected to the Green light
Relay 4 would be connected to the pump.

You can have a completely different program, say for running a gardening facility, where the relays drive various pumps and lights for watering and heating.  Whatever you like!  The uses are limitless!  And the hacking potential is limited only by your imagination.

Step 1: How Does the Programming Work - or What Is a State Machine?


I am glad that you asked that!

The controller implements a wonderful tool called a state machine.  A state machine is one of the simplest controllers that just knows two things; What the current state is, and what will the next state be?

State machines are driven by a table called a state table.  Essentially what the controller does, is cycle through the state table one state at a time.  Our state table documents the current output settings, and what the next state will be.  In our case, it also specifies the amount of time we wait in the current state.  Here is an example of a state table that toggles the first 4 relay outputs in sequence, waiting for 3 minutes between cycles;

State 0: 1 on, 2 off, 3 off, 4 off, 5 off, 6 off, Wait 3 minutes - goto State 1
State 1: 1 off, 2 on, 3 off, 4 off, 5 off, 6 off, Wait 3 minutes - goto State 2
State 2: 1 off, 2 off, 3 on, 4 off, 5 off, 6 off, Wait 3 minutes - goto State 3
State 3: 1 off, 2 off, 3 off, 4 on, 5 off, 6 off, Wait 3 minutes - goto State 0

The controller runs in an infinite loop, where it knows what the current state is, waits the required time, and then jumps to the next state as dictated by the table. 

You will find state machines in things ranging from traffic lights, through washing machines, through to Industrial controllers.




Step 2: The Hardware


The basis for my project was my Arduino Ethernet controller board - I simply connected 6 switched relays of some spare I/O lines, and designed a new PCB layout because I enjoy the quiet Zen state when I am laying out a new PCB.

There is nothing stopping you from putting a set of relays onto a piece of stripboard, and running them from an Arduino board with an Ethernet shield.  The only caveat is that the Ethernet shield has to be based on the ENC28J60 chipset.  That is what I support in my code.

Here is the circuit diagram of one of the relay outputs.  You can see that each relay is driven using a BC547 transistor.  There is nothing fancy about the BC547 (except that they cost about $0.03 in quantity)  you can use whatever type of NPN switching transistor you like.  There is a current limiting resistor between the base of the switching transistor and the Arduino output to protect the transistor from damage.  There is also a spike protection diode across the transistor to protect it from the large electrical spike that occurs when the relay is switched off.  There is also a LED installed so that you can visually see the state of the outputs.

You will also find the full schematic diagram for the project here as a PDF.  For more information, have a look at my Ethernet Arduino Instructable.

Update - It was suggested that the protection diodes should be placed straight across the relay - so I have amended the pcb layout, as well as fixed the schematic.  Thanks for that!

Step 3: The Board


Here is the PDF that I used for Toner Transfer PCB manufacturing - As long as you print the sheet out in full size, then you won't have any problems with size.

Also included is the parts overlay, for the top and bottom of the PCB.   As was suggested, I re-wired the protection diode across the coils - so the PCB changed, but not enough to warrant replacing the parts overlays!

There is a small number of surface mount components on the board, but, like the Arduino Ethernet controller, their use is minimal.

I have also loaded up a PNG of the board from KiCad.  It is sooo pretty!

Step 4: The Software

Here is the .pde sketch file.

Just download this sketch and load it into your AtMega328 chip and you are off and running!

The code has almost exhausted the RAM capacity of the ATMega328 - if you decide to make any changes, you will need to be very careful not to let the buffers corrupt the stack space.

All of the code is commented - and should be able to be followed.

An update from 4 years after the project was made:

Ahh - It looks like the original site that held the ethershield library has dissipated into the ether, and the arduino IDE has changed a lot. (I wish that they would not change the IDE that much to break the older code)..

There are two alternatives:

https://github.com/jcw/ethercard - it looks like it is supported for Arduino 1.0

https://github.com/thiseldo/EtherShield - it looks unsupported, but at least its there :-)

I can not comment right now on either of these libraries as I have not used them.

Doug

Step 5: Construction


Start assembling the board by installing the components that are mounted on the back of the PCB - The 74HC08, 4 x 18pF Caps, 4 x 10uF caps, 3 x 0.1uF caps.  These are all surface mount, and are surprisingly simple to solder.  It just takes patience.

Next, install the wire jumpers - there are a total of 6 jumpers to install.  I can only make single sided PCBs at home, so this is a small price to pay for convenience.

After that, install the connectors, and IC sockets. Followed by the crystals, voltage regulators, diodes, and transistors.

Next, get a short length of cut off resistor lead, and install the ferrite bead, and the MagJack.  Note that this is a socket with magnetics installed.  Not just an RJ45 socket.

Finish by installing the LEDs, and relays.

There you have it - a competed controller board.

Once you have finished building the board, load the sketch up using the Arduino IDE, and a FTDI USB-232 cable from Sparkfun.  The FTDI cable is connected to the 6 pin header on the right side of the PCB.







Step 6: Parts List


The following parts are needed to construct this project;

Surface Mount parts:

1 x 74HC08 SO16 package
4 x 18pf Caps 1206 package
4 x 10uf/16V caps 1206 package
3 x 0.1uF caps 1206 package

Through lead parts

6 x 470R resistors
11 x 270R resistors
4 x 50R resistors (51 ohm is fine)
3 x 10K resistors
1 x 2k7 resistor
6 x BC547 transistors
1 x 78l05 Voltage regulator
1 x 78l33 Voltage Regulator
1 x 16Mhz HC18 crystal
1 x 25Mhz HC18 crystal
7 x 1N4004 diodes
2 x 3mm blue LEDs
6 x 5mm Yellow LEDs
1 x 5mm red LED
1 FX18 Ferrite bead
1 x Microchip 28J60 Ethernet controller (DIP)
1 AtMega 328 microcontroller (DIP)

6 x 3 pin 5mm spacing screw connectors
1 x 2 pin 5mm spacing screw connector
1 x 6 pin header 0.1 inch
1 x 4 pin header 0.1 inch
1 RJ-45 Mag Jack (From Sparkfun)
http://www.sparkfun.com/commerce/product_info.php?products_id=8534

1 x 4 way dip switch (optional)
1 x small pushbutton
2 x 28 pin IC sockets

6 x Jaycar FRM1-1C1 SPST 12V DC relays

Ethernet Relay Controller PCB


Step 7: Using the Controller Manually

OK - Now that you have the controller built, and the software installed, just turn it on.

The default program will run.  It just cycles through all of the outputs, alternately turning them on and off.  It does this once per second.

Plug the board into your computer, make sure that your computer is on the 192.168.1 network, and assuming that you didn't change the sketch to supply a new address, connect your web browser to http://192.168.1.2.  I use firefox - I have not tested it with Opera, Chrome, or IE yet.

The screen shown as the first screen in this step will appear.

First things first, there is a timer running in the controller all of the time - every second, it refreshes the relay to whatever the program has.  to use the relay board in manual mode, you will have to turn off the timer - just click on the Timer Off link - and it will stop.  The fact that the timer is stopped will be written to the EEPROM, so when the board is turned on next, the timer will be off.  You will need to explicitly turn on the timer again to get the board to run automatically.

Next, you can toggle the state of the relays, simply by clicking on the corresponding toggle command.  Operation is instantaneous, so the output will change as soon as you select it!

Have a play with the options, until you are comfortable with how it works.

Step 8: Setting Up a Program

Now - we can set up a program in the controller.

Before we do that, lets turn on the timer again, so that the automatic functions can operate.

Then, select "Program 0-6" at the top of the screen to view the current program states 0 through 6. The screen below will be displayed.

The program shown uses 2 states;

State 0 which turns on relays 1 3 & 5 for 1 second then jumps to state 1
and
State 1 which turns on relays 2 4 & 6 for 1 second then jumps to state 0

Round and round it goes....... alternating every second.

Lets modify it so that state 0 turns on relays 1 3 & 5 for 10 seconds, then goes to state 1.

Just type 0 in the state selection box at the bottom and push 'Modify". This will cause the modify screen to be shown. It is also shown below.

In the modify screen you are shown the state (or step) that you are changing, and you can alter the wait time (between 1 and 65000 seconds), the step to jump to (between step 0 and step 19, and what outputs to turn on for this step.

Just make your changes by entering 10 for the wait time, 1 for the next state, and select relays 1, 3 & 5. Then push the Modify button - Your step will then be saved, and you can re-select the "Program 0-6 tab" to see the whole program.

The steps will automatically be saved into EEPROM on the micro, so that your program will run automatically by itself as soon as the board is powered up.


Step 9: Conclusion and Next Steps


There you have it - an extremely useful little board.

With 20 program steps available and delay timers of up to 65000 seconds (a little over 18 hours), there are almost limitless possibilities to what the board can do...

And - finally, with great power comes great responsibility (tm) - You will have noticed that there was no login option - there is no security - don't connect this to the big bad Internet and expect people to not fiddle.  The board does not understand routing anyway, so you would need to NAT any connection from the board.

Also - it is possible to setup state 0 - turning off all relays - and jumping to state 0 - Guess what that does???  Yep - nothing - again and again and again - but that was what you typed in :-)  But - remember , you can always type in a new program.

Where to next?  Well - I am glad that you asked that - I have a couple of other jobs to do around the house (an my mother in laws house as well) - but when they are finished, I will be providing an input module - that should extend the project to provide Programmable Logic Controller functionality - such as - If Input 3 is on, and 4 seconds have passed, dont go to step 5, go to step 9 instead.  There is a 4 pin expansion connector in the middle of the board fo that capability to be just plugged in....  Given time we shall see.

I hope you enjoy building and using it as much as I enjoyed designing it.

Finally, if you really want a kit for the project - or completed boards, send me a message - I will see what level of popularity the project has and will provide kits if there is sufficient interest.

Share

    Recommendations

    • Metalworking Contest

      Metalworking Contest
    • Tiny Home Contest

      Tiny Home Contest
    • Creative Misuse Contest

      Creative Misuse Contest

    158 Discussions

    Great Instructable! I found some RJ45 sockets with the integrated magnetics cheap in the UK anglia live are doing them at £1.25

    Ahh - It looks like the original site has dissipated into the ether...

    There are two alternatives:

    https://github.com/jcw/ethercard - it looks like it is supported for Arduino 1.0

    https://github.com/thiseldo/EtherShield - it looks unsupported, but at least its there :-)

    I can not comment on either of these libraries as I have not used them.

    Doug

    Ahh - It looks like the original site has dissipated into the ether...

    There are two alternatives:

    https://github.com/jcw/ethercard - it looks like it is supported for Arduino 1.0

    https://github.com/thiseldo/EtherShield - it looks unsupported, but at least its there :-)

    I can not comment on either of these libraries as I have not used them.

    Doug


    As I mentioned 4 years ago to other people who successfully built this project, You will need the Ethershield library from Nuelectronics.com

    Here is the link..

    http://www.nuelectronics.com/download/projects/etherShield.zip

    I do not know whether this library even works any more with the current Arduino IDE. I have moved away from writing Arduino code commercially, as the IDE keeps changing, making previous projects uncompilable. Instead, I now use avrgcc directly. Arduino is great for learning, but not for long term projects.

    Doug

    --->

    Step 4: The Software

    Here is the .pde sketch file.

    Just download this sketch and load it into your AtMega328 chip and you are off and running!
    ---------------------------
    think, how can it be compiled when none of the libreries used in the code is given over here ????
    1 reply

    As I mentioned 4 years ago to other people who successfully built this project, You will need the Ethershield library from Nuelectronics.com

    Here is the link..

    http://www.nuelectronics.com/download/projects/etherShield.zip

    I do not know whether this library even works any more with the current Arduino IDE. I have moved away from writing Arduino code commercially, as the IDE keeps changing, making previous projects uncompilable. Instead, I now use avrgcc directly. Arduino is great for learning, but not for long term projects.

    Doug

    people are writing here they made the project and found different things as a problem post programming things, but i have a basic question and that's very fundamental that, --> how without the libraries used the the project code they been able to compile the code first of all and could make the hex file to burn in to atmega328 ?

    please any one can explain ?

    1 reply

    As I mentioned 4 years ago to other people who successfully built this project, You will need the Ethershield library from Nuelectronics.com

    Here is the link..

    http://www.nuelectronics.com/download/projects/etherShield.zip

    I do not know whether this library even works any more with the current Arduino IDE. I have moved away from writing Arduino code commercially, as the IDE keeps changing, making previous projects uncompilable. Instead, I now use avrgcc directly. Arduino is great for learning, but not for long term projects.

    Doug

    Is possible to add some control services e.g. thermometer. To control one of relays by temperature.

    I really like your design, just want I'm looking for. Is there a way to buy it? maybe Ebay?

    Please help me

    I have this error like below when compiling the code:

    Error: D:\cvavr2\inc\pgmspace.h(90), included from: ip_arp_udp_tcp.h: incomplete type is not allowed ---<ypedef void prog_void PROGMEM;>

    avr.png

    Hello sir, i'm having problem making the pcb, can i ask you to upload the kicad pcb project files please.

    Sorry for the noob-ish question, but how would one add a clock module (e.g. ds1302) to this board?

    3 replies

    Hi,

    There is no such thing as a Noob-ish question - Everybody learnt at some stage :-)

    You could simply add a DS1302 to the board by looking at something like my later clock designs - they use a DS1302. Essentially there are three wires that get connected from the clock module to the AtMega chip. You also need to include the DS1302 library and write some software, but thats not impossible.

    I am a little flat out with the clock business at the moment to spend the time to modify the project - but I would encourage you having a play - You can even find space on the board by removing the 4 way dip switch that is not used, and using that space to place the DS1302.chip.

    Let me know how you get on.

    Doug

    That's a definite thought - but you should also cater for the possibility that the network is isolated.

    Hi how can i connect this to the "internet" and not the local home network ..What if i want to access this from anywhere in the world..?

    1 reply

    You have to go into your wireless router settings and port forward to the local address.
    Example: your IP address is 50.145.78.99 and the arduino is 192.168.1.2.
    You set the router to forward port 8081 to -> 192.168.1.2.
    Now when you are anywhere in the world you would use the address: 50.145.78.99:8081 and you would see the arduino control page just like you would at home!