Light-up costumes using LEDs are delicate. Wires break, connectors, fail, and dust or water can get into the tiniest cracks in your enclosure, causing short circuits or rust.

And yet, most of our LED costumes are dreamed up, built, and created to be taken into harsh environments. We want to wear them to festivals in the desert and have them glow all night. We want to dress our wiggling, squirming kids up in lights so they can trick-or-treat on Halloween Night.

We need our costumes or art cars to stand up to assault by excited bystanders who can't resist poking, touching, and tugging on our beautiful creations. They need to be able to weather windstorms and rainstorms, long hugs from strangers in the dark, immersion in cuddle puddles, or pole dances on a moving art car, deep in the playa. They need to work every time we turn them on, without an hour's worth of repairs needed after every appearance.

This tutorial will give tips and tricks on design, build, and maintenance for costumes that Will Not Break. I'm using my favorite example: my light-up swimming mermaid tail.

You think the playa is a challenge? Try wearing your LED costume in the ocean. 


I'll be honest.. this guide goes a bit overboard in terms of durability. Most readers don't actually plan to submerse their costume in salt water, and you, gentle readers, are wiser than me. Making a swimmable light-up mermaid tail is a pie-in-the-sea project, and even with all these precautions, my Mermaid Glimmer tail is still a nightmare to keep running. LED projects are salty beasts.

Wearing batteries underwater is dangerous. Doing professional performances is very stressful when I'm never 100% sure the tail is going to light up at all, or stay lit in the water for even half an hour. I've spent countless hours repairing and replacing wires and lights and controllers that got wet because I didn't close my case properly, or simply wore out because salt water is very hard on electronics. 

This guide will impart some of the knowledge I've gained from years of trying to do the impossible: swim around in the sea with lights on. But all of it will translate into very robust and durable land-based costumes.


Since this guide focuses on durability, I'm keeping the wiring and coding as simple as possible. You will need rock-solid soldering skills, and a good healthy dollop of patience. A little extra time and care during the build process will save you hours of repair time down the road.

Your project can be as simple or complex as you make it, but remember: the more fancy elements you add, the more potential failure points you have. 


I'm using a tiny QT Py ESP32 Pico for my project. It doesn't have a lot of extraneous bits or sensors, and it's really small and affordable, so if it gets fried, I can replace it fairly easily. It works with WLED software, which is really easy to install and use to create complex light animations, even if you're not a coder.

If you want to add sensors or interactivity, check out the Adafruit line of Feather boards

Angled shot of purple square-shaped microcontroller.
This dev board is like when you're watching a super-hero movie and the protagonist shows up in a totally amazing costume in the third act and you're like 'OMG! That's...
1 x USB C cable
USB C Cable for Programming

If your project is using NeoPixel strips, Adafruit carries this handy BFF "backpack" that attaches to the QT Py with headers, and gives you a handy port for plugging in your lights.

Video of a driver board lighting up an RGBW half-meter long LED strip.
Our QT Py boards are a great way to make very small microcontroller projects that pack a ton of power - and now we have a way for you to quickly add a


I'm using NeoPixel Dots for my project. The dots come in 2" or 4" spacing, and come 20 to a strand. 

You could also use NeoPixel strips, rings, or any of the huge variety of NeoPixel formats Adafruit carries in your costume. But in my experience, strips break. They are flexible in one direction but very delicate in every other direction.  Rings are sturdy but the connections are tiny, and tend to break also.

These NeoPixel dots are potted in resin and wired up with very strong silicone-coated wire. They are very hard to break. It's possible, but you really have to work at it.

Adafruit NeoPixel LED Dots Strand - 20 LEDs at 2 inch Pitch
Attaching NeoPixel strips to your costume can be a struggle as the flexible PCBs can crack when bent too much. So how to add little dots of color? Use these stranded NeoPixel dots!...
Adafruit NeoPixel LED Dots Strand - 20 LEDs at 4 inch Pitch
Attaching NeoPixel strips to your costume can be a struggle as the flexible PCBs can crack when bent too much. So how to add little dots of color? Use these stranded NeoPixel dots!...

Battery Power

I'm using a 2000mAh lithium battery to power my project. This battery fits perfectly inside a GoPro Hero 4 case and will power lots of lights for several hours. 

Get a second or third one to keep on-hand if you want to run your costume all night.

2 x Battery
Lithium Ion Battery - 3.7V 2000mAh
1 x Battery Connector
JST PH 2-Pin Cable – Male Header 200mm
1 x Battery Charger
Adafruit Micro Lipo - USB LiIon/LiPoly charger - v1
Warning: Lithium Batteries are Dangerous

If your project is meant to be worn by kids, or if you plan to get it soaking wet, you may want to consider using AAA batteries instead. Lithium batteries can be dangerous things. If they get punctured and wet, they can catch fire or explode. I'm an adult, I've been making LED costumes for years, and I know the risks, so I'm using a less-safe option so that I can use a smaller enclosure box. 

1 x AAA Battery Box
3 x AAA Battery Holder with On/Off Switch and 2-Pin JST


To keep our microcontroller and battery safe from the elements, we need a good dust-proof enclosure. I'm using a repurposed GoPro Hero 4 camera case. It's rated IP68 (waterproof down to 147 feet). 

In order to get the power, ground, and data wires through the case I'll use a cable gland. These are purpose-made to create waterproof wire pass-throughs. 

I'll also use a waterproof connector to attach the controller box to the costume.

1 x Cable Gland
Cable Gland PG-7 size - 0.118" to 0.169" Cable Diameter - PG-7
1 x Waterproof Connector
Waterproof Polarized 4-Wire Cable Set

Sealing Wire Connections

We have sturdy light strands, but they still need to connect to our microcontroller and to each other. The solder joints tend to be the weak point in most projects. Here are some products that will help keep your joints rock-solid.

3 x Silicone Stranded Wire
Silicone Cover Stranded-Core Wire - 2m 26AWG
1 x Standard Heat Shrink
Heat Shrink Tubing in various sizes
1 x Clear Heat Shrink
3/4" Clear Heat Shrink Tubing
1 x Ribbon Cable Wire
Silicone Cover Stranded-Core Ribbon Cable - 4 Wires 1 Meter Long - 26AWG Black

Tools & Accessories

  • Heat Gun
  • Hot Glue Gun
  • Soldering iron & accessories
  • Cable ties
  • Power drill with a 15/32 (12mm) drill bit for the cable gland install

Your costume idea is wild, exciting, and fully formed in your head. Here are a few things to contemplate before you turn it into reality. 

Whoa, there, Pardner

Decide how many lights you want in your costume. Then cut that number in half, and see if you can get the same effect. Fewer lights will mean longer battery life, and using more than around 300 can start to become unmanageable. Do some sketches and see how few you can get away with. One nice thing about these dot strands is that they can really cover a large area with just a few lights, and if you're artful with placement you'll still get that full-body light effect with a tiny battery.

You can always add more strands later on if needed, but starting small will give you a much higher chance of success.

Check out this Sipping Power with NeoPixels guide for more info on how to get the most battery life out of your costume.

Wiring in Parallel vs Wiring in Series

I'm wiring all my LED strands in parallel. This means I've got the strands in a starfish-type configuration, where each strand is directly connected to my microcontroller's data pin. My microcontroller sees only 20 pixels, even though there are 200 total. Every strand will show the same animation on its 20 pixels, mirroring all the other strips.

If I were wiring in series, I'd connect the strands end-to-end, wiring the OUT end of one strand to the IN end of the next strand. My microcontroller would see 200 pixels and be able to run animations that wander from one strip to the next.

Benefits & Drawbacks

If I wire all 200 of my LEDs in series, I can run more complex animations. For example, I can do colorwipes that fade from one end of my costume to the other, or gradients that slowly change along the full 200 light layout.

However, if my power, ground, or data wire breaks or gets corrupted at any point, or if any one of the lights breaks or goes bad, every single light "downstream" of the broken place will stop working. NeoPixels need a solid power, ground, and data signal to light up, and if any of that gets interrupted, my lights go out.

Wiring in parallel is a bit of a trade-off: I can only write to 20 LEDs, so I'm a bit more limited on whole-costume colorwipes or gradients.. but if any one of my lights breaks, the maximum number of lights that suddenly don't work is limited to 20. 

By wiring in parallel my costume fails gracefully: when one of my lights breaks, part of that strand will stop working, but the other 180 lights will continue to work just fine.

In the sketch above, the yellow boxes show LED #1 on each of my strands, and the red arrows show data flow direction. 

LED Strand Positioning

Figure out how you want to position your strands in order to minimize extra wire running through your costume. Extra extension wires love to get caught on things and pull out. Put the IN ends of your light strands in the same spot, if possible.

Data Flow Direction Layout

Also, think about data flow direction. In this design, my patterns and animations will radiate from the center of the tail and flow outwards. This will give me a gorgeous symmetrical look with a lot of motion.

Flex Points

Your costume needs to move and bend. These wires are really flexible and can bend a lot of times without breaking, but elbows and knee joints want to flex constantly. Some costumes require some pulling and stretching to get in and out. Think about all these weak points and do not put lights there. Seriously. A dark spot can be artful if it's planned, and the lights will eventually break at all your flex points. I promise.

My mermaid tail has a heavy silicone fin inside and when I'm maneuvering on land, I need to stand up in it. I left the entire back-of-the-heel area completely unlit, since it's unwise to stand on my LED light strand. 

Mounting in your Costume

Think about how you plan to attach the lights to your costume. You may want to wash your costume, someday, and sewing the lights directly in can make this more difficult. 

You will also need to be able to get to the lights easily when a strand breaks, or if you want to reposition the lights or add more. If the lights are potted in glue and silicone and embedded permanently into the costume, repairing them will be a nightmare. 

I attached my lights to an underlayer / lining that I made out of scuba fabric. It's got about the same amount of stretch as the fabric tail I'm using. It's worn under the tail, but not attached to it in any way, so I can still wear my tail without lights for daytime shows, and I can also wear the lights with different tail skins. 

I patterned the lining from a Mertailor Whimsy 3 tail. The lighter color designs will show the lights a bit better than the darker ones.

I used my sewing machine to stitch my lights in place using a wide bar tack stitch. 

This was fairly quick to do, but ended up causing a short when I took it into the water. I was careful as I could be not to pierce the wires with my sewing needle, but I must have hit the wires somewhere and made a hole because the strand flickered when it got wet.

My solution was to cover each bar tack with clear nail polish, to seal any potential holes in the wire. If I were to do it again, I'd use fabric glue to attach the lights instead.

Inside the Case

  • Red wire to +5V on QT Py, then to either lead on the on/off switch
  • Second red wire from other on/off switch lead to the battery connector
  • Black wire to GND on QT Py, then to black on the battery connector
  • White wire to A0 on QT Py. This is also know as digital pin 26

These wires will connect to 3 of the colored wires in the waterproof connector, which will pass through the cable gland and to the outside of the case.

Outside the Case

  • Red wire to +
  • White wire to DI (data IN)
  • Black wire to -

Install WLED

These next steps require a Web Serial-compatible browser. As of this writing, that means Google Chrome, Microsoft Edge or Opera “desktop” browsers. Other browsers (Safari, Firefox, Explorer and anything mobile) won’t work.

Driver Update

Some boards have a new serial chip which needs a driver installed before we can install WLED. Head over to our How to Install Drivers for WCH USB to Serial Chips tutorial, and download and install the new driver.

If you have an older Feather ESP32 or QT Py with CP2102 USB-to-Serial bridge, use SiLabs’ driver instead.


Plug your microcontroller into your computer with a known good USB cable. Click "Install" and select the port for your board.

Depending on the USB-to-serial bridge chip on the board, you might see one or two serial ports. On Mac, for instance, there might be both “/dev/cu.usbmodem[number]” and/dev/cu.wchusbserial[number]”. Use the “wchusbserial” one.

After successful installation, enter your WiFi network name and password when prompted. This must be a 2.4 GHz WiFi network; ESP32 does not support 5 GHz networks. If it can’t connect, then as a fallback WLED will create its own 2.4 GHz WiFi access point.

Setup & Preferences

WiFi Setup

It's a good idea to head to WiFi Setup screen and create a good URL so you can control your project from any web-enabled device. I called mine http://mermaid.local -- this is what I type into any web browser on my WiFi network in order to connect to my costume.

LED Preferences

We need to change just a couple settings in the app to get our lights running correctly. Click the LED Preferences tab and scroll down to Hardware Setup.

We have 20 LEDs in each strand, and we wired our strands in parallel instead of in series, so I changed "Length" to 20. 

We soldered our data wire to pin A0 (aka pin 26) on the QT Py, so make GPIO match the pin number.

Use It

Now you can use any computer or handheld device to control your LEDs, as long as you're in range of your WiFi network. 

Make sure your device is on the same WiFi network as your board. Navigate to your custom URL (http://mermaid.local/ for me) in a web browser. You'll see a color picker above a whole bunch of color palette choices.

Choose a color, choose an effect, and watch your lights animate and glow!

Head over to the WLED wiki at to delve into all the particulars.

Presets & Playlists for Wifi-Free Environments

This is great! As long as your costume is within reach of your WiFi network, you can control your animations with ease. But costumes don't always stay at home -- the whole point is to take them out into the Great Beyond, outside the comfort of your WiFi network.

WLED allows you to pre-program animations and organize them into playlists, so you don't need a WiFi network to keep your lights glowing. You can play around with animations and presets to your heart's content at home, then simply turn your costume on and let it animate while you're out exploring.

Creating Animation Modes

  1. Play with colors, palettes, and effects options until you find an animation mode you love. You can control the speed and intensity of the effects with the sliders near the top of the Effects panel.
  2. Once you're happy with your mode, click the Presets tab, or look in the right-hand column if you're in PC mode. You'll see a button for + Create Preset and another for Create Playlist.
  3. Choose +Create Preset and give your preset a snazzy name. Click "save" and your mode will be saved into the list below.
  4. Once you have a few presets made, click Create Playlist. Click the + button to add your presets to your playlist. You can rearrange them into whatever order you like, and also specify how long you'd like each mode to play for.

Set Auto-Play at Startup

Once you've made your playlist, take note of the number it's been assigned. My "Bioluminescence" playlist has number 1, and my "Party" playlist is number 33.

Choose Config > LED Settings and scroll about halfway down the page to the Defaults section. Here is where you can tell your costume to choose your playlist when it boots up. Just enter your playlist's number into the Apply Preset field and your playlist will start automatically when you turn your costume on.

For my mermaid tail, I'm using 10 strands of lights for 200 lights total. As long as I keep my LED brightness under control and avoid modes that use a lot of white, my 2000mAh battery will run the tail for a few hours.

Wiring the Pixels

First we'll add a length of silicone-coated ribbon cable wire to each of the strands. These extension wires give us lots of flexibility in our LED strand placement.

This ribbon cable has 4 wires. We only need 3. Find the striped wire - we'll keep that one. Pull off the 4th wire, the one opposite the striped wire, and save it for another project.

Strip about 1/4" of shielding from the ends of the remaining 3 wires.

Find the "in" end of your NeoPixel strands. Usually this is the end with the male connector. There's a tiny printed "IN" on the back of the pixels, so it never hurts to double check to make sure the strand you're using is assembled the same way. The lights won't work if you connect to the wrong end.

Cut the connector from the IN end of the strip.

Cut a 1" long piece of large clear heat shrink and slide it onto the strand. Push it down a bit so it's out of your way.

Cut 3 small (1/4") lengths of 1/8" heat shrink and slide them onto the three wires. Then strip about 1/4" of shielding from each of the wires.

Solder the wires to your ribbon cable. The red wire on the LEDs (+5v) will go to the striped wire on the ribbon cable. Then solder the middle wire (DI) to the middle ribbon cable wire, and then solder the remaining outside wires (G) together.

Slide the small heat shrink over the wire connections and shrink it using your heat gun, keeping the large clear heat shrink out of the way for now. 

Slide the clear heat shrink over your wire connections, making sure it covers both ends. Pump a small amount of hot glue into the heat shrink. While the glue is wet, grab your heat gun and shrink the clear heat shrink down over the glue and the connections.

Be sure the glue squishes out both sides, potting your wire connections completely in plastic. This will hold them in place so they can't get bent or broken without a LOT of force pulling on them.

Cut the connector off the OUT end of your LED strand. Slide on some heat shrink and fill it with hot glue in the same manner, to seal these wires and keep them safe.

Connecting the Strands Together

Now it's time to wire all your strands together. Use the same 2-layer heat shrink & hot glue method to be sure every single wire connection is tight. 

I found it easiest to wire 2-3 strands together with an extension wire that connects to the next set of 2-3 strands. Trying to wire more than 4 connections in one go can be difficult, so connect them all in 2s and 3s and slowly bring the wires together.

Taper all your connections down to one long wire that will lead to your GoPro case. Grab one end of your waterproof connector and solder it to the end of this wire.

Make sure the wire reaches to your pocket or wherever you plan to mount it. You'll need full access to charge the battery and turn the costume on and off, so make it someplace accessible.

Grab one of the female connectors you cut from the end of your LED strand. It has 5 wires: two loose power and ground wires and the three that were connected to the lights.

Solder your male battery connector to the two longer loose power wires: red to red, and black to the other.

On your QT Py, solder a red wire to 5v, a black wire to G, and a white wire to A0. Connect these wires to your connector's remaining 3 wires: red to red, white to the middle wire, and black to the remaining wire.

Test It

Now, plug in your battery and one of your light strands to be sure your wiring is correct and your software is working. If everything looks good, it's time to seal it all up. If you don't see any lights, head to the Troubleshooting section below.

Once you're sure everything is working, cover your QT Py in heat shrink to help keep the wire connections from flexing and breaking or pulling out.

Add your on/off switch by soldering it in-line with the red wire on your power connector. I added a zip-tie for strain relief to help make sure these wires don't break or get pulled out.


If your lights don't work when you plug in your battery, here are a few things to check:

If your lights don't come on at all:

  1. Check all your wire connections against the wiring diagram to be sure everything is wired correctly.
  2. Be sure your battery is charged, and that the wires on the top haven't come loose.
  3. Check to be sure you're connected to the IN end of the LED strip and not the OUT end. It won't work if you connect them the wrong way.
  4. Visit http://mermaid.local/ in your web browser (or whatever URL you set up during software install.) Didn't set one up? Go back to and plug your board in, and click "Install" again. If your software installed correctly, it will lead you back to your controller.
  5. Did you remember to change the GPIO pin number in the WLED software, on the LED Seup page? Pin A0 on the QT Py is digital pin 26, so be sure you've updated that.

If your lights come on in yellow, but you can't control them:

  1. Make sure you're on the correct Wifi network. Your device needs to be on the same network as your lights.
  2. Try reinstalling the software from If your board is recognized, the installer will take you back where you need to be.

Find the remaining side of your waterproof connector. Slide the included cover nut onto the cable with the open side toward the connector, as shown.

Slide the white nut from your cable gland onto the connector facing the other direction, with the open side toward the bare wires.

Open up your GoPro case. Use a 15/32 (12mm) drill bit to drill a hole in the side of the case next to the on/off button. Get it as centered as possible so the nut has room to screw down flush with the case. I found it helped to drill a smaller pilot hole first to keep my drill from wandering.

Screw your cable gland's main section firmly into the hole as shown, with the shorter side on the inside of the case. Thread the included plastic hex nut onto the outside and tighten it with a wrench.

Slip the bare wire end of your waterproof connector into the cable gland from the outside, making sure not to dislodge the foam insert. Adjust it until just the bare wires are sticking out, with the main part of the cable inside the gland. 

Double check that you've got both connector nuts on your connector: the white one from the cable gland, ready to screw to the case, and the black one that came with the connector, ready to screw to the male end of the connector.

Once you're sure it looks right, screw the white connector nut onto the cable gland to lock the connector in place. Tighten with a wrench. 

Grab one of the male connectors you cut off your LED strand. I extended the wires a bit on mine using silicone stranded wire, which is less likely to break when it's flexed a bunch.

Solder the 3-pin NeoPixel connector to the wires on the waterproof connector. Trim the yellow wire since we won't be using it. Connect white to white, red to red, and black to black. Cover the connections with heat shrink and solder.

The LiPoly battery has a metallic covering, which could potentially cause a short if bare wires touch it in a confined space. It also has delicate wire connections at the top, which will break if they get flexed too often. I avoided both these potential problems by covering the battery in electrical tape, making sure to carefully tape the wire leads down to the side of the battery so any strain will not be put on the solder joints.

Place the battery on the bottom of the case. It should fit snugly. Plug the NeoPixel connector into the QT Py and nestle it on top of the battery. Make sure everything fits below the level of the lid -- if you have to squeeze or force the case closed because the insides are too big, your case will leak. This is not a huge deal in most environments, but if you're going to be getting wet, you want a good seal.

Be sure you can easily access the on-off switch, and also the battery connector, so you can recharge the battery without pulling everything out of the case.

Plug the case into your LED strips with the waterproof connector, double check that the gasket is in place, and screw the cover down. Turn your lights on with the on/off switch and gasp with delight.

Assemble your costume, use WLED to make some magical animations, and then go out and light up the world.

This guide was first published on Nov 02, 2022. It was last updated on Mar 08, 2024.