August 26, 2025
Description
This project is a remix of the HexaLeafs tree by ElHeisa.
I redesigned the base of the tree to make room for LED strips and a larger addressable controller. (Later I found out it works even better to keep the base only for LEDs and place the controller outside, but the option is yours.)
The documentation has also been completely rewritten – now with clear pictures and step-by-step descriptions of what goes where, which the original project was completely missing.
Additionally, the model has been scaled down to 70% for faster printing.
While the original idea was a solder-free design, in practice it is much better to solder the LED strips for reliability. In theory, you can still route them without soldering, but this variant has not been tested.
🎥 See it in action: Check out a short video of the LED tree in action:
You can copy the JSON code of all presets at the end.
Presets are easy to upload – just paste the JSON into WLED (Presets → + Add → API command).
🌟 Remix Features:
Redesigned tree base – space for LED strips and a larger addressable controller
Once you know the key features, let’s move on to printing the parts.
🖨️ Printing
The tree is made of 14 hexagons and 1 base.
Each hexagon is later covered by a white diffuser and a black frame with a tree/leaf pattern.
Recommended printing order:
For easier assembly, here is the numbering order of the tree body and leaf frames.
💡 Tips:
⚙️ Hardware (BOM)
⚡ Wiring for Testing
Before assembly it’s best to prepare a short 4-pin cable with a male connector and connect it to the controller. This allows you to test each LED segment before sealing it with hot glue.
Wiring (Athom controller / WS2815):
💡 Tip: Always test the LED strip before sealing the solder joints. Once hot glue is applied, fixing issues is very difficult.
Once you have the wiring ready and tested, it’s time to set up the controller in WLED.
🖥️ Software (WLED Setup)
💡 Firmware note:
It’s recommended to flash the controller with the latest WLED firmware.
For Athom controllers, always use the ESP02.bin.gz build (because of the smaller flash size).
📖 Full quick start guide: WLED Getting Started
🛠️ Assembly
1. Base + Hexagons
2. LED Strip Installation
Notes:
3.All hexagons assembled
When all hexagons are connected and soldered, the result should look like this:
4. Diffusers
Place the white PLA/PETG diffusers on each hexagon.
They should fit snugly and help diffuse the LED light.
5. Leaf Frames
Snap the black frames with tree pattern on top of the diffusers.
This creates the final decorative look.
✨ WLED Presets
To get you started quickly, here are some example presets you can import directly into WLED.
💡 Tip: For full flexibility, split the LEDs into segments (12 LEDs per hexagon, 10 LEDs in the base). This allows you to control the base separately from the tree. In my setup, I used the base as a CO₂ indicator (green/orange/red depending on air quality – see my CO₂ sensor case project).
{ "on": true, "bri": 120, "transition": 12, "seg": [ { "start": 0, "stop": 179, "fx": 2, "sx": 40, "ix": 200, "pal": 15, "col": [[80,100,255],[0,255,180],[180,0,255]] }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 } ] }
{ "on": true, "bri": 140, "transition": 8, "seg": [ { "id": 0, "start": 0, "stop": 179, "fx": 9, "sx": 128, "ix": 128, "pal": 0, "col": [[80,100,255],[0,255,180],[180,0,255]] }, {"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0}, {"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0}, {"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0} ] }
{ "on": true, "bri": 200, "transition": 5, "seg": [ { "id": 0, "start": 0, "stop": 179, "fx": 74, "sx": 150, "ix": 200, "pal": 0 }, {"stop": 0},{"stop": 0},{"stop": 0},{"stop": 0},{"stop": 0}, {"stop": 0},{"stop": 0},{"stop": 0},{"stop": 0},{"stop": 0}, {"stop": 0},{"stop": 0},{"stop": 0},{"stop": 0},{"stop": 0} ] }
{ "on": true, "bri": 200, "transition": 5, "seg": [ {"id":0,"n":"Leg","start":0,"stop":10,"fx":74,"sx":150,"ix":200,"pal":0}, {"id":1,"start":10,"stop":22,"fx":74,"sx":150,"ix":200,"rev":false}, {"id":2,"start":22,"stop":34,"fx":74,"sx":150,"ix":200,"rev":true}, {"id":3,"start":34,"stop":46,"fx":74,"sx":150,"ix":200,"rev":false}, {"id":4,"start":46,"stop":58,"fx":74,"sx":150,"ix":200,"rev":true}, {"id":5,"start":58,"stop":70,"fx":74,"sx":150,"ix":200,"rev":false}, {"id":6,"start":70,"stop":82,"fx":74,"sx":150,"ix":200,"rev":true}, {"id":7,"start":82,"stop":94,"fx":74,"sx":150,"ix":200,"rev":false}, {"id":8,"start":94,"stop":106,"fx":74,"sx":150,"ix":200,"rev":true}, {"id":9,"start":106,"stop":118,"fx":74,"sx":150,"ix":200,"rev":false}, {"id":10,"start":118,"stop":130,"fx":74,"sx":150,"ix":200,"rev":true}, {"id":11,"start":130,"stop":142,"fx":74,"sx":150,"ix":200,"rev":false}, {"id":12,"start":142,"stop":154,"fx":74,"sx":150,"ix":200,"rev":true}, {"id":13,"start":154,"stop":166,"fx":74,"sx":150,"ix":200,"rev":false}, {"id":14,"start":166,"stop":179,"fx":74,"sx":150,"ix":200,"rev":true} ] }
{"on":true,"bri":200,"transition":5,"seg":[{"id":0,"n":"Leg","start":0,"stop":10,"fx":9,"sx":150,"ix":200,"pal":0},{"id":1,"start":10,"stop":22,"fx":9,"sx":150,"ix":200,"pal":0,"rev":false},{"id":2,"start":22,"stop":34,"fx":9,"sx":150,"ix":200,"pal":0,"rev":true},{"id":3,"start":34,"stop":46,"fx":9,"sx":150,"ix":200,"pal":0,"rev":false},{"id":4,"start":46,"stop":58,"fx":9,"sx":150,"ix":200,"pal":0,"rev":true},{"id":5,"start":58,"stop":70,"fx":9,"sx":150,"ix":200,"pal":0,"rev":false},{"id":6,"start":70,"stop":82,"fx":9,"sx":150,"ix":200,"pal":0,"rev":true},{"id":7,"start":82,"stop":94,"fx":9,"sx":150,"ix":200,"pal":0,"rev":false},{"id":8,"start":94,"stop":106,"fx":9,"sx":150,"ix":200,"pal":0,"rev":true},{"id":9,"start":106,"stop":118,"fx":9,"sx":150,"ix":200,"pal":0,"rev":false},{"id":10,"start":118,"stop":130,"fx":9,"sx":150,"ix":200,"pal":0,"rev":true},{"id":11,"start":130,"stop":142,"fx":9,"sx":150,"ix":200,"pal":0,"rev":false},{"id":12,"start":142,"stop":154,"fx":9,"sx":150,"ix":200,"pal":0,"rev":true},{"id":13,"start":154,"stop":166,"fx":9,"sx":150,"ix":200,"pal":0,"rev":false},{"id":14,"start":166,"stop":179,"fx":9,"sx":150,"ix":200,"pal":0,"rev":true},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0}]}
{ "on": true, "bri": 170, "transition": 6, "mainseg": 0, "seg": [ { "id": 0, "start": 0, "stop": 179, "grp": 1, "spc": 0, "of": 0, "on": true, "frz": false, "bri": 140, "cct": 127, "set": 0, "n": "", "col": [ [220, 235, 255], [140, 190, 255], [0, 0, 0] ], "fx": 72, "sx": 61, "ix": 128, "pal": 15, "c1": 128, "c2": 128, "c3": 16, "sel": true, "rev": false, "mi": false, "o1": false, "o2": false, "o3": false, "si": 0, "m12": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 }, { "stop": 0 } ] }
{ "on": true, "bri": 180, "transition": 8, "seg": [ { "id": 0, "start": 0, "stop": 179, "fx": 72, "sx": 90, "ix": 200, "pal": 0, "col": [[255,0,0],[0,255,0],[255,220,80]] }, {"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0}, {"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0}, {"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0} ] }
{ "on": true, "bri": 130, "transition": 10, "seg": [ {"id":0,"n":"Leg","start":0,"stop":10,"fx":2,"sx":50,"ix":200,"pal":0,"col":[[255,160,40],[0,0,0],[0,0,0]]}, {"id":1,"start":10,"stop":22,"fx":2,"sx":45,"ix":180,"pal":0,"of":0, "col":[[255,150,30],[0,0,0],[0,0,0]]}, {"id":2,"start":22,"stop":34,"fx":2,"sx":55,"ix":190,"pal":0,"of":20, "col":[[255,170,50],[0,0,0],[0,0,0]]}, {"id":3,"start":34,"stop":46,"fx":2,"sx":60,"ix":200,"pal":0,"of":40, "col":[[255,140,20],[0,0,0],[0,0,0]]}, {"id":4,"start":46,"stop":58,"fx":2,"sx":50,"ix":170,"pal":0,"of":60, "col":[[255,160,35],[0,0,0],[0,0,0]]}, {"id":5,"start":58,"stop":70,"fx":2,"sx":45,"ix":180,"pal":0,"of":80, "col":[[255,180,60],[0,0,0],[0,0,0]]}, {"id":6,"start":70,"stop":82,"fx":2,"sx":55,"ix":190,"pal":0,"of":100, "col":[[255,150,25],[0,0,0],[0,0,0]]}, {"id":7,"start":82,"stop":94,"fx":2,"sx":65,"ix":200,"pal":0,"of":120, "col":[[255,170,40],[0,0,0],[0,0,0]]}, {"id":8,"start":94,"stop":106,"fx":2,"sx":60,"ix":180,"pal":0,"of":140,"col":[[255,160,35],[0,0,0],[0,0,0]]}, {"id":9,"start":106,"stop":118,"fx":2,"sx":50,"ix":170,"pal":0,"of":160,"col":[[255,150,30],[0,0,0],[0,0,0]]}, {"id":10,"start":118,"stop":130,"fx":2,"sx":55,"ix":180,"pal":0,"of":180,"col":[[255,180,60],[0,0,0],[0,0,0]]}, {"id":11,"start":130,"stop":142,"fx":2,"sx":60,"ix":190,"pal":0,"of":200,"col":[[255,140,20],[0,0,0],[0,0,0]]}, {"id":12,"start":142,"stop":154,"fx":2,"sx":45,"ix":170,"pal":0,"of":220,"col":[[255,170,50],[0,0,0],[0,0,0]]}, {"id":13,"start":154,"stop":166,"fx":2,"sx":55,"ix":180,"pal":0,"of":240,"col":[[255,160,35],[0,0,0],[0,0,0]]}, {"id":14,"start":166,"stop":179,"fx":2,"sx":65,"ix":200,"pal":0,"of":260,"col":[[255,150,30],[0,0,0],[0,0,0]]} ] }
{"on":true,"bri":140,"transition":8,"seg":[{"id":0,"n":"Tree+Leg","start":0,"stop":179,"fx":9,"sx":128,"ix":128,"pal":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0}]}
{"on":true,"bri":140,"transition":8,"seg":[{"id":0,"n":"Tree","start":11,"stop":179,"fx":9,"sx":128,"ix":128,"pal":0},{"id":1,"n":"Leg","start":0,"stop":10,"fx":2,"sx":40,"ix":200,"pal":0,"col":[[255,140,30],[0,0,0],[0,0,0]]},{"id":2,"n":"Gap","start":10,"stop":11,"fx":0,"col":[[0,0,0],[0,0,0],[0,0,0]]},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0}]}
{"on":true,"bri":140,"transition":8,"seg":[{"id":0,"n":"Leg","start":0,"stop":11,"fx":2,"sx":40,"ix":200,"pal":0,"col":[[255,0,0],[0,0,0],[0,0,0]]},{"id":1,"n":"Tree","start":11,"stop":179,"fx":9,"sx":128,"ix":128,"pal":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0}]}
{"on":false,"bri":140,"transition":8,"mainseg":0,"seg":[{"id":0,"start":0,"stop":11,"grp":1,"spc":0,"of":0,"on":true,"frz":false,"bri":140,"cct":127,"set":0,"n":"Leg","col":[[255,0,0],[0,0,0],[0,0,0]],"fx":159,"sx":128,"ix":128,"pal":1,"c1":128,"c2":128,"c3":16,"sel":true,"rev":false,"mi":false,"o1":false,"o2":false,"o3":false,"si":0,"m12":2},{"id":1,"start":11,"stop":179,"grp":1,"spc":0,"of":0,"on":true,"frz":false,"bri":255,"cct":127,"set":0,"n":"Tree","col":[[255,140,30],[0,0,0],[0,0,0]],"fx":159,"sx":128,"ix":128,"pal":1,"c1":128,"c2":128,"c3":16,"sel":true,"rev":false,"mi":false,"o1":false,"o2":false,"o3":false,"si":0,"m12":2},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0}]}
{"on":false,"bri":140,"transition":8,"mainseg":0,"seg":[{"id":0,"start":0,"stop":11,"grp":1,"spc":0,"of":0,"on":true,"frz":false,"bri":140,"cct":127,"set":0,"n":"Leg","col":[[255,0,0],[0,0,0],[0,0,0]],"fx":14,"sx":128,"ix":128,"pal":1,"c1":128,"c2":128,"c3":16,"sel":true,"rev":false,"mi":false,"o1":false,"o2":false,"o3":false,"si":0,"m12":0},{"id":1,"start":11,"stop":179,"grp":1,"spc":0,"of":0,"on":true,"frz":false,"bri":255,"cct":127,"set":0,"n":"Tree","col":[[255,140,30],[0,0,0],[0,0,0]],"fx":14,"sx":128,"ix":128,"pal":1,"c1":128,"c2":128,"c3":16,"sel":true,"rev":false,"mi":false,"o1":false,"o2":false,"o3":false,"si":0,"m12":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0}]}
{"on":false,"bri":140,"transition":8,"mainseg":0,"seg":[{"id":0,"start":0,"stop":11,"grp":1,"spc":0,"of":0,"on":true,"frz":false,"bri":140,"cct":127,"set":0,"n":"Leg","col":[[255,0,0],[0,0,0],[0,0,0]],"fx":36,"sx":128,"ix":128,"pal":1,"c1":128,"c2":128,"c3":16,"sel":true,"rev":false,"mi":false,"o1":false,"o2":false,"o3":false,"si":0,"m12":0},{"id":1,"start":11,"stop":179,"grp":1,"spc":0,"of":0,"on":true,"frz":false,"bri":255,"cct":127,"set":0,"n":"Tree","col":[[255,140,30],[0,0,0],[0,0,0]],"fx":36,"sx":128,"ix":128,"pal":1,"c1":128,"c2":128,"c3":16,"sel":true,"rev":false,"mi":false,"o1":false,"o2":false,"o3":false,"si":0,"m12":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0},{"stop":0}]}
Of course, you can create your own presets and segment layouts in WLED – these are just examples to get you started.
Sometimes you might need to reset the hexagons and turn all LEDs off.
This preset sets the entire strip to black:
{"on":true,"bri":255,"seg":[{"id":0,"start":0,"stop":179,"fx":0,"col":[[0,0,0],[0,0,0],[0,0,0]]}]}
🎉 Final Notes
This project is a remix of the HexaLeafs tree by ElHeisa, redesigned to include LEDs, a larger base, and complete documentation. Big thanks to the original author for the amazing base idea! 🙏
My contribution was redesigning the base, adding LED support, and preparing full step-by-step documentation (printing, wiring, software setup, presets) so that anyone can easily replicate and enjoy the project.
If you build this LED tree, I’d love to see your makes – share your colors, effects, and creative uses. 💡🌳
And if something is unclear, feel free to ask in the comments – I’ll be happy to help.
License:
BY-NC