Arduino Web Enabled RGB Lighting

Arduino Web Enabled RGB Lighting

I just happened to see some large strips of LED lighting when I was picking up some parts at Maplin which were on sale (if I remember correct they were around £12 per approx. 2m strip) however the controller/driver was still around £40, so I thought I would just build a better one myself.
I wanted it to be a web enabled controller as there are a lot of cool things that can be done with a device once it is accessible over HTTP, and I am working on a home automation server project so it would be good to have some devices which I can test this with.Arduino Web Enabled RGB Lighting

Anyway, let’s get started, here is a basic parts list, some of the components may change depending on the nature of your lighting installation (i.e. if you are driving more LEDs you may need higher power transistors, etc.):

  • Arduino (Duemilanove, Uno, etc., can be done with a Mega but it is overkill)
  • Ethernet Shield
  • 12v to 5v switchmode DC-DC converters (my LED strips rat at 12v but the Arduino needs 5v and this is more efficient than a linear converter)
  • Assorted resistors (for transistor protection, usually around 100-500 ohms)
  • NPN transistors (I just used basic NPN transistors as I was only switching around 300mA per channel)
  • Push to make button
  • Various connectors and cables
  • Stripboard (goes by various other names, I used this to make my driver circuit into an Arduino shield)
  • Enclosure (optional but recommended)
  • Fuse and fuse holder (optional but highly recommended for permanent installations)
  • Scrap materials to make any mounting hardware needed (I used HIPS to mount my Arduino in the enclosure)

Tools I used which would help:

  • Soldering iron
  • Multimeter
  • Small flat screwdriver
  • Small posi-drive screwdriver
  • Laser cutter (drills and a file will suffice if you don’t have access to one)

All the code for this project is available at this GitHub repo.

Step 1: LED Driver Circuit

LED Driver Circuit

NOTE: Please read the next two steps before starting any work mentioned here, I had to do some modification to my original shield because of power issues, they are described on the next step.

Here you will want to build the driver circuit depicted in the schematic below, this can be done in the same way I did it and made into a shield to stack on top of the Arduino and Ethernet shield, or can be a separate board, either way will work, but I don’t see any advantage to not making it as a shield.

Some minor points, you will want to have three power cables coming from your shield:

  • One +12v cable going to the 12v pin on the LED strip output
  • One +5v pin going to the 5v pin on the Arduino, and
  • One ground going to the ground pin on the Arduino

The reason for this is explained in the next step.

There are some good guides to building a shield from scratch using stripboard on YouTube, alternatively you could use a (semi) pre-built prototyping shield.

Step 2: Circuit Assembly and Testing

By this time you should have your driver board or shield made, the next step is to test it over a long period of time (a couple of hours in my case) to make sure it is both working properly and efficiently.

I mention efficiency because as you can tell by the image below I am supplying the Arduino with 12v via it’s on board barrel jack and using this to drive the LEDs via the Vin pin on the Arduino, this means that the Arduino must convert 12v to 5v via it’s linear converter, which got very hot after an hour or so.

As a result of this I decided to use a switchmode  DC-DC converter to step the 12v down to 5v for the Arduino and supplied it via the 5v pin. completely bypassing the Arduino’s linear converter, to do this I had to modify my shield slightly to redirect the 12v supply for the LEDs and to add cables going to the 5v and ground pins on the Arduino.

The 12v supply for the LEDs will go directly after the main power switch, ground will go to ground and the 5v will be from the output of the DC-DC converter, in my controller I used an isolated DC-DC converter (i.e. the input ground is isolated from the output ground) as I had them left over from audio electronics, however this is not important for this so a regular 3 terminal converter would also be fine.

I also have a push button which toggles the LEDS between off, full on and the last setting set using the web service, once pushed it will change the lights using the last used (or default if not set) transition and transition time. You do not have to use this button, no changes to the code are needed to disable it, if you do want to use it all it has to do is switch an Arduino pin to ground.

Step 3: Arduino Script and Webservices

Now to configure the Arduino script and upload it to your board, there are several important changes that may need to be made:

  1. Pin constants
    On lines 12-15 there are four constants which define the pins to use for the red, green and blue channels as well as the input pin for the quick set button.
    The pins for the colour channels must be set to PWM enabled pins, the pin for the button can be anything other than pin 13 (as pin 13 is a pain to use for inputs with a pull up resistor), 0 and 1 (as serial is used for debugging)
    If you do not want to use the quick set button then you can leave the default value of 12 (assuming this pin is not used for anything else).
  2. MAC and IP
    On lines 42 and 43, set them as suites your network.
    Default gateway and subnet mask are obtained through DHCP.
  3. Default transition and transition time
    You may want to reset the default transition and transition time that is used after the controller is powered on before it is manually set.
    To do this change the constants on lines 34 and 35, a set of valid values for DEFAULT_TRANSITION can be found on lines 24-26.

That should be everything, upload that to your Arduino and give it a test by visiting the web UI in your browser.

The template Arduino script can be found in the GitHub repo.

Step 4: Assemble in Enclosure

When you have concluded that all is good with your controller it’s time to put it in a nice enclosure, in my case I got a nice one from Maplin, I believe it is ABS and is designed to be panel mounted (although I never have used it like this, yet).

The design of the mounting hardware and cut out sections will vary greatly with the enclosure, however I have included all of my CAD drawings in the GitHub repo (although they are all 2DDesign files, sorry, I have switched to LibreCAD for all future projects now).

If you designed your controller to switch higher loads then you may want to check what it’s heat output is like and decide for yourself whether you need any heatsinks or forced air cooling or not, in my case I added the facilities to include a fan and the ability to run it at both 12v or 5v yet I didn’t think it was needed, nonetheless it is good to have vents in the case anyway.

I decided it was a good idea to include a fuse between the +12v supply from the barrel jack and the main power switch, I just used the standard 20mm automotive inline fuse holders, although any type would be just as good, I did look at panel mount holders but they were surprisingly expensive compared to the inline type I am using.

As for fuse rating, I went with 630mA, each channel drew between 100 and 120mA and the Arduino and Ethernet shield will be around 300mA so this rating is a little low if anything, although I have not had a fuse blow yet.

Read more: Arduino Web Enabled RGB Lighting

Leave a Comment

Your email address will not be published. Required fields are marked *