Decoding those cheap multi-color LED flood lights

The plethora of cheap LED lights has me thinking of how I can use them. They're really inexpensive (amazon has them for ~$15) and put out a ton of light. The drawback is the remote. I'm thinking of using them as up lights outside, but I don't want to go out, turn them on, dial in the color, and repeat for each one.

So here we go with how I reverse engineered the codes. Starting from the beginning: knowing practically nothing. I'm fumbled through this, but if you kinda know what you're doing and want to skip to the fruitful stuff, you should probably read/follow this arduino guide. It's more well written and direct than this is going to be.

Somewhere to start.. no kidding: I can't remember where my initial research was done, but that gives you the gist. There's a signal over a carrier wave that's decoded. Pulse lengths and timing are important. Through another conversation and some research, I suspected that the protocol was some form of NEC IR code (something like DMX over IR, another thing I was looking at, seemed too complicated). It's interesting to read through the different protocols & how they handles addressing, errors, etc. But for our purposes, it's only important that a given code produces a given result: it's stateless (with the small exception of the "repeat" code, but let's not worry about that).

So the goal was to read the codes. I figured this could be done with an IR sensor (wrong... should have read more -- and "IR receiver module" is what I should have gotten) and radioshack sells those. It's pretty easy to hook up the receiver in series with a resistor and power supply to forward bias the receiver diode. That will make for good viewing on the oscilloscope.


Oh, you don't have an oscilloscope? I didn't either. But I was extremely lucky that a friend came into one that I could use. It turns out that an oscilloscope isn't really necessary (I'll go over how to read codes via the library later), but I still wanted to use it. I have other reasons I need to be familiar with their use. After hooking up the oscilloscope leads across the diode and zooming in a bit, I could see the remote was affecting the circuit. Connecting the lines and setting up auto-triggering helped bring the protocol into focus. And that's where it got a bit tricky.

Now time for careful counting. The message length is clearly visible, but it was a little difficult to determine the bit boundaries (hidden behind the oscilloscope lines). It's also important to know 0/1 is determined by pause length, not "on" or "off." So get counting. I ended up with anything from 27-33 bits, so I assumed it was probably 32 (a four byte message). Unfortunately, I could never get a consistent read from an IR photodiode. And the library couldn't either. Switching to an IR module (with 3 leads as opposed to 2), everything got better. I was consistently counting 31 or 32 bits. So with a pretty good guess for the "on" code, I figured I'd build the transmission circuit and verify it looked the same to the oscilloscope:


That's the circuit to drive the IR transmitter. Don't have a transistor? Fine. The guy who appears to have a major hand in the arduino IR library didn't use one in his blog post. I hooked up the oscilloscope back up at this point (after a few modifications to the IR library's "send" demo) and discovered I'd mistranslated a few bits. It was really easy to see/correct on the scope. Though it wouldn't have happened if I'd just captured through the library....

Build the detector circuit with the 3-pin IR receiver module. This tells you how. Run the IR library's IRDump example and open the serial monitor. Point your remote at your detector module and press a button. The code should pop out (try a few times to make sure you don't get an "unknown protocol" -- which seems to be from goofed detection). At this point, you can press buttons and write down what each key on the remote sends. I've had luck w/ 2 different systems at this point (and don't need the oscilloscope anymore).

Putting those codes back into the "send" demo resulted in my light turning on. Or red, or whatever it was supposed to do. I'm pretty happy with the result and I should be able to A) clip the module off and wire in an arduino (bonus: I should be able to get rid of the dependence on pin 3 for the PWM features) or B) wire a bunch of transmitters & use the other I/O pins to basically switch them. Unless by some fluke of awesomeness, when I get more lights, they have different addresses. Time to go order another to find out...

remote (labeled APA 1616) (like this):
brighter  dimmer   off            on
red          green     blue       white
.                  .             .         flash
.                teal      purple    strobe
orange        .           .            fade 
yellow      blue      fuchsia   smooth

F700FF F7807F F740BF F7C03F
F720DF F7A05F F7609F F7E01F
F710EF F7906F F750AF F7D02F
F730CF F7B04F F7708F F7F00F
F708F7 F78877 F748B7 F7C837
F728D7 F7A857 F76897 F7E817

Another remote (the one from -- which can be found cheaper):
FF38C7 FFB847 FF7887 FFF807
FF18E7 FF9867 FF58A7 FFD827
FF28D7 FFA857 FF6897 FFE817
FF08F7 FF8877 FF48B7 FFC837

And a remote for an RGB LED bulb (that I got from thinkgeek, but now the only link i can find is this:
2FD18E7 2FD30CF | 2FDA857 2FD38C7
2FD8877 2FDF00F 2FDC837 2FD08F7
2FD807F 2FD40BF 2FDC03F 2FD9867
2FD20DF 2FDA05F 2FD609F | 2FDF807
2FDE01F 2FD10EF 2FD906F | 2FDD827
2FD50AF 2FDD02F 2FDE817 | 2FD7887
2FDB04F 2FD708F 2FDB847 | 2FD58A7

Oh, and I'm not sure how I missed this, but read this


    No Trackbacks


Display comments as (Linear | Threaded)

    No comments

Add Comment

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.