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.
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)
- Soldering iron
- Small flat screwdriver
- Small posi-drive screwdriver
- Laser cutter (drills and a file will suffice if you don't have access to one)
Here is a quick demo of my installation at uni using an Android app for control:
Step 1: LED Driver Circuit
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
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
Initial testing of my driver circuit before I assembled it on the stripboard:
Step 3: Arduino Script and Webservices
- 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).
- MAC and IP
On lines 42 and 43, set them as suites your network.
Default gateway and subnet mask are obtained through DHCP.
- 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.
The template Arduino script can be found in the GitHub repo.
Step 4: Assemble in Enclosure
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.
Step 5: Install
I suppose the only big considerations are:
- Making sure the LED strip has a descent amount of room for airflow
The strips will get warm after being on for a while, if not to keep the LEDs cool to reduce fire risk, increase electrical efficiency and prolong the life of the LEDs (all valid but negligible effects of keeping them well ventilated) then do it to keep the adhesive backing cool so that it does not lose adhesion and cause the LED strips fall off (which did happen to me a couple of times, only on the bottom one which got the heat from my monitors and the annoyingly always on radiator).
- If you are driving a large chain of LEDs then check to see if the strips have a maximum chain length
This may be important when the total load of the LEDs down the chain exceeds the maximum rated current for the conductors in the LED strip, which will generate excess heat, reducing efficiency and possible becoming a fire risk.
I admit, it does not sound that impressive, but check the next step for other cool things you can do with it...
Step 6: Extra - Cool Stuff
- Control using an Android app
I wrote a basic Android app which recreates the functionality of the web UI in a native app.
The APK and source can be downloaded from the GitHub repo.
Note: you need to configure the HTTP POST service URL in the settings before you can use the app (details are in GitHub readme)
- Make it react to music
I wrote a little Processing script (which unfortunately I seem to have lost) which used the Minim FFT to make each colour (red, green and blue react to a different frequency range in the audible spectrum.
I did this using both the HTTP POST API and a modified Arduino script using RS232 to control the LEDs.
Using HTTP POST:
- Do your own thing
The HTTP POST API is documented on the GitHub repo if you want to make your own cool apps.
- Home Automation
I am currently working on a home automation server project which used MQTT and this will make a good testing device to be controlled by the server (if this project interests you then you are more than welcome to contribute to it, send me an email if you are interested, or have a look at my blog if you just want to see how I'm getting on).