Matrix LED Candle Light




Introduction: Matrix LED Candle Light

About: Nothing special about me. Just voiding warranties. Admin of and


in this instructable you will learn how to build a very long lasting LED-Matrix-Candle.

It looks very modern, doesn't smoke ;) and can be reloaded with your smartphonecharger.

The yellow light gives you a very good expression of a real flame.

To be exact: it is a video of a real flame which is converted into led-commands.

I came across this idea on several maker-faires and by watching "flame pendent" on adafruit.

While the adafruit is nearly perfect, it doesn't look elegant or at least like something i would put into my livingroom. And adafruit isn't the cheapest way to build something.

The ones on the maker-faires where kits. Nothing against kits, but you have to solder every SMD-LED by hand.

And it was quite expensive, too.

You can buy ready-build candles from Ingo Maurer ... if you have the money.


A bright, modern looking LED-Candle on a budget. Can't be that hard to build...

Step 1: What You Need

  • 3D-printer (or printed parts)
  • quickcrete, (concrete)
  • arduino pro micro 16Mhz (8Mhz doesn't work)
  • TP4506 LiPo-loader
  • Adafruit LED-Matrix (yellow) and PWM Driver
  • some 1.5mm aluminium sheets (and a way to bend it)
  • double-sided gluetape
  • thin wire
  • small switch
  • one 18650 batterie with soldertips (no cheap ones, choose samsung or panasonic)
  • spraypaint (black matt recommended)

The soldering is quite easy.

If you can't get the aluminium or the 3D printed parts, you can contact me.

I still have some of them. This project didn't work on the first or even the third try. I've changed a lot while building and have some spare parts.

To give you an idea of the construction, have a look at the animation.

Step 2: Print the Parts

You don't have to print many parts.

It's the inner housing and the bottom plate (which contains the switch).

At least 4 little helpers, which will be needed to guide the wire through the aluminium.

After printing you should try if everything fits in. Or at least the Arduino and the TP4506.

If you dont want to use aluminium and may have a better idea, you can change the files, too.

All Fusion360 files are included.

Step 3: The LED-Matrix

Every solderpoint is printed on the modules, so you can't make many mistakes.

But you need to be carefull. Don't solder the pins without numbers.

You should solder only one side on the last pins to get the black placeholder on both sides.

So: solder this Pin to the PWM but not to the LED-Matrix.

Have a look at the picture 3. The matrix will be placed on top of the aluminium and "stands" on the placeholders.

I've tried several methods. Solder it before adding the shaft? After adding it? None is better.

Cut the pins as short as possible AFTER soldering to get a nice finish.

(This pictures are a little bit older. You don't need screws anymore)

Step 4: The Shaft

Two bended parts. One of them has to be 5mm longer than the other one. 1.5mm aluminium (very important)

Mine are about 185mm high, 28mm width (important). The bended part is about 18mm long.

That way it fits perfectly between the LED-Matrix and the PWM-Controller.

To fit the cables between those parts, you have to glue the little helpers with double-sided tape on the longer one.

Just mark it with a knife. They should be placed about 3cm higher, so the helpers do reach into the display.

On the bottom they can reach into the housing. That way the hold the batterie in place, too.

But don't let them get too long into the housing. It's not much room in there.

Put the wire between the helpers and place the other shaft. As written before: 5mm difference.

You can place the display on top to get a perfect match.

Cut the double-sided tape just under the display and glue the second shaft on the helpers.

Congratulations. This was the first part where everything could have been gone terribly wrong.

Use some thicker double sided tape on the "feets" and peel the siliconpaper of.

Now you have to use some force to push the shafts through the housing. It does fit, but it's as tight as possible.

Step 5: Molding the Base

I'm a big fan of quick drying concrete. You can mix it quite liquid and it still works very good.

To build the mold, i'm using waterresistant plywood. In Germany they are called "Siebdruckplatte".

10mm around and 15mm on top of the housing is enough concrete.

Prepare the housing by sealing the USB-Port and with very thin (tesafilm) tape, the shafts.

If you miss this part, the concrete will pour into the shaft. Looks terrible and the concrete will tend to tear apart at exactly that position.

Put good double-sided tape on the bottom plate of the housing. This way the hole thing will stay in place while pouring the concrete into the mold.

Let it dry at least twice the time you think it should have been enough time.

If the base doesn't look perfect enough you can file the edges or use some sandpaper.

It doesn't have to be perfect. It's concrete. It has to have some "errors".

You need to peel the double-sided tape of the bottom plate. Use a spatula to get it of the wood.

Step 6: Put Colour on It

The aluminium should be cleaned with some kind of alcohol.

Using isopropanol is allways a good way to start. You don't have to grind/sand the surface before spraypainting it.

Just cover the concrete as precise as possible at the entrypoint of the shaft.

And cover the wires and little helpers on top.

Spray two or three very thin layers to get a perfect finish.

Let it dry twice the time as noticed on the spraycan.

At this point i let it cure over night in a warm room before getting to the next steps.

The concrete will change the colour over night.

Step 7: Electronics (in the Box)

Flash the Arduino with the added code. You can try the code from adafruit, but it will not fit. Just a little bit to big.

EDIT: I've added another code. It's one frame smaller. Just in case.

EDIT 2: I've added a data.h with rotated frames.

I've deleted just one frame and recompiled the code with the python script. Using 99% of space.

28664 bytes ... just 6 bytes left.

While you flash you will see three LEDs. One in constant red and two blinking. The constant red LED (near to the usb-Port) should be destroyed with a very small plier. Well, you could change the code, so the LED doesn't light up, but you can destroy it, too. And i don't think that there is enough space left for the code. Or you have to delete another frame.

The connections are quite easy.

Arduino -> Display

D2 -> SDA

D3 -> SDL


Ground -> Ground

TP4506 -> Arduino

Out - -> Ground

Out + -> /Switch -> RAW

TP4506 -> Battery

self explaining

Just make sure all wires are long enough. I'm using 10cm long wires.

Solder every solderpat before soldering the wires on them. You don't want to push the wires through the pinholes.

Just solder them on the pinholes and think of the way the wires will bend, when you have to put all parts together.

Step 8: Electronics and the Display

If you bend the pre-soldered endings from the wires just a little bit, those endings will just slip into the pinholes from the display.

This is the most annoying part in this instructable. You may pull the wires from within the housing to get a better position.

Trust me, it will fit. I've made three of them, but couldn't find a real good solution.

Check your connections twice.

First test. Finally. You will be amazed.

If the display just gives you one random pattern (see picture 1), your batterie is to low.

Now you can peal off the upperpart from the siliconpaper on the helpers and put the display right in place.

As gently as necessary. Everything in place and it still works? Fine. To fix the display finally, you should pour some clear glue from top through the Matrix and the PWM-Driver. Just where the wires where soldered.

The glue will find a way through the wires and glues the Display onto the helpers.

Step 9: Final Assambly

You should bring the Arduino first into position, followed by the TP4506.

There may be too much space for the TP. If thats the case, you can glue it.

You should be able to push a USB-cable into it without moving the TP inside the housing.

Now bring the isolated batterie into it. It's getting quite full in here. Try to bring the wires down.

All in place, try to put the bottom plate on it. If it doesn't fit, you can use a plier to break the noses away.

They are just an extra support to the batterie.

Put some feet under it, if you like.

Step 10: Final Thoughts

The candle lasts 29 hours until it has to be reloaded.

You can even get a little bit more runtime by using a adafruit trinket. But it's quite expensive.

I've made some tests with several Arduino-like-systems:

WEMOS D1 mini: starts at 3.3 V and draws 0.15A

Pro Micro: starts at 3.2V and draws 0.1A

Original Trinket: starts at 3V and draws 0.08A

A nano doesn't work because it needs 4.4 V to start (drawing 0.11A)

A 8MHz pro micro gives you about 12 frames per second. That will drive you crazy. So don't even try.

When the battery gets empty, the last frame will be shown on the display. Just no animation, but still light.

The microchip needs just a little more power than the display.

The light is quite bright and really gives a candle-like feeling - just with an industrial modern look.

The TP shines red while loading (with max 1A) and gets blue, when the battery is full.

A two sided version is possible, but not easy to build. The PWM-Driver can power two Displays at once.

But you have to mirror all solderpoints and connect some tiny cables. Sounds like fun.

The energy draw does not get much higher while using two displays. About 0.01A.


Thank you for reading.

I hope my english wasn't that bad.

I would be really happy if you vote for this project in the "Glow" contest.

Make it Glow Contest 2018

Participated in the
Make it Glow Contest 2018

1 Person Made This Project!


  • Meatless Challenge

    Meatless Challenge
  • Fabric Challenge

    Fabric Challenge
  • Backyard Contest

    Backyard Contest



Question 5 months ago

Well, we need a data.h with one or maybe two frames less, cause the basic skreth is both times the same, can you give as a data.h with less frames? Its about 302 bytes to heavy.

Best wishes,


Answer 5 months ago

- the original is 23006 bytes
- the "-1 frame" is 22926 bytes
- the seperate data.h is 22846 bytes (i think it is 2 frames less)
The second and the last one fits allways. Linux and Windows.
The first one fits only in linux (strange enough, it is the same arduino ide, just another OS)
You say that it does have to be even smaller?
Could you try the seperate data.h (copy&paste the conten will do it).
If it still doesn't fit, use a wemos D1 :)
Or ask again and i'll have a look at it.


Reply 5 months ago

Hi, i think the problem is that you uploaded just the skreth without the interesting data.h part. If you download the .ino you uploaded it doesnt come with a libary.


Reply 5 months ago

Both *.ZIP have a data.h file, which opens with the *.ino file.
They are different. The last column in the data.h schows the file size.


Reply 5 months ago

Yes, there are .zip packages i missed out, but even with that the skrath is too big ;(.
I bought a pro trinket, and hope it will fit


Reply 5 months ago

Thank you very much, but you would laugh if you hear that a finished the project with a pro trinket 10 mins ago...



Reply 5 months ago

Oh, youre right, i opened it in my browser and it shows up, i was just downloaded it before and got just the .ino...

Thanks for your help :)


Question 8 months ago

Thanks for your great works.
But I am confused about parts.

Can you tell me the exact name of what you are using to build a nice LED MATRIX?
(for example TP4506 LED-Matrix, PWM Driver)


Question 1 year ago

My six candles are still flickering strong after a year, but I have one question. The flickering effect is great, if you are within three meters or thereabouts. I have all my candles in the windows of my home and they are meant to be viewed from the street. Is it possible to modify the code to display a more flickery, moving flame that may not look realistic if you are near to the candle but will look like they are flickering from the street below?


Answer 1 year ago

i had some other animations. Found somewhere online.
But all of them were quite ... lame.


Reply 1 year ago

Can you list methods and sites worth searching on please?


Question 1 year ago

Hi, thanks for the great tutorial. I do not know why, but the code does not fit on my Arduino. (Error: "text section exceeds available space in board Sketch uses 28892 bytes (100%) of program storage space. Maximum is 28672 bytes. Global variables use 512 bytes (20%) of dynamic memory, leaving 2048 bytes for local variables. Maximum is 2560 bytes.")
Could you explain to me how to remove more frames? The candle works if I radomly delete some data but then the animation is of course ugly.


Reply 1 year ago

thanks for your answer - not late at all. I've allready tried your version with one frame less but unfortunately it still doesn't fit on my arduino. I don't know why but it seems like I have slightly less space than expected. Even the version with one frame less results in this error: "Sketch uses 28892 bytes (100%) of program storage space. Maximum is 28672 bytes". So I would like to create a version with -2 frames but couldn't figure out how to delete more data without destroying the animation. If I randomly delete some data at the end of data.h file it works but the last frame of the flame is "broken".


Question 1 year ago

Received my esp32 boards today. Got them recognized and flashed with above code all worked well and i have eliminated the need for the v3 18650 shield and 5v. Can you point me to some code that I could merge with the candle matrix code to enable the timer and then have the esp32 deep sleep while off and turn back on?


Question 1 year ago

Any ideas on adding an automatic on/off circuit either dusk to dawn or a 4\6\8 hour timer? I assume it would be not possible to add any code to the arduino ro perform this function with a photocell shield since there's no room for more code.


Answer 1 year ago

Well, there is no space left for any code.
But the main problem, even with enough space: the arduino would draw the battery life with a timer.
When the most Power gets consumed while in idle ... well, doesn't make sense, does it?
So: if you realy want to do that, you should use an ESP8266 or ESP32.
They use more energy when ON, but much much much less energy when in sleep mode.
But: the ESP8266 can only sleep for about 60 minutes. You could freeze the code for a second before starting and add another hour etc.
An ESP32 doesn't have this limitation.

Best way to go: either use an ESP32 and programm it or take the guts out of an LED-Light with built-in-timer an use the "ON"-State as a trigger.