Want a translucent, colorful, brightly glowing skull, but all you can find at the store is the usual opaque plastic skull? Not to fear! You can harness the power of heat to melt and form a common HDPE (high-density polyethelene) milk jug into a great light-diffusing Milk Jug Glow Skull!

You can then light the Glow Skull from within using a strip of NeoPixels. The HalloWing will provide flickering animation to the pixels, and a couple of 10mm LEDs and holders serve as menacing, blinking eyes! A small speaker is used to play growls and yells.


Here are the parts you'll need:

1 x Adafruit HalloWing M0 Express
Skull-shaped ATSAMD21 board w 1.44" 128x128 TFT display
1 x NeoPixel Strip 0.5 Meter
with 3-pin JST connector
1 x 5V 2.5A Switching power supply
with 20AWG MicroUSB Cable
1 x Mini Oval Speaker - 8 Ohm 1 Watt
Mini Oval Speaker - 8 Ohm 1 Watt

Materials & Tools

In addition to the above parts, you'll also need these materials and tools:

  • Decorative skull made of thick plastic (too thin and it won't resist the heat, and thus melt)
  • One gallon HDPE jug -- milk, juice, and water come in these jugs, just check the bottom for the letters 'HDPE'
  • Sponge
  • Bowl of water
  • Heat gun
  • Hobby knife or box cutter

Optional Skull/Sculpting Stand

You can optionally build a skull stand to make working on the heat forming part of the project a bit easier. For this you'll want:

  • 12" diameter, 3/4" thick plywood round for the base
  • 3/4" O.D. black pipe, 12" long, threaded on both ends
  • Black pipe flange for 3/4" pipe, threaded
  • Black pipe cap for 3/4" pipe
  • Wood screws

Build the Skull

The process of making the heat-formed milk jug skull is straightforward -- you'll be using a heat gun to melt the HDPE plastic until it starts to become transparent, then press it into the details of the reference skull using a damp sponge. The sponge molds the plastic into the shape of the underlying form and cools it once it's in place.

Below are some process photos to give you the gist of it, then we'll go into more detail!

Prep the Reference Skull

If you plan to fit the original skull onto a stand, you may need to cut a hole in the base first.

Glue the Jaw

The original prop skull may have a movable jaw -- you can use a bit of hot glue to keep it from moving.

Mount the Skull

If mounting the skull, place a bit of hot glue on the top of the stand and then fit the skull onto it.



Milk jugs match the shape of skulls for reasons THEY DON'T WANT YOU TO KNOW

Prep the Milk Jug


Mark a line around the neck and handle of the jug, then cut this part off with a hobby knife.


Then, to allow the jug to fit over the original skull, cut a slit from the base in the back up to the top of the skull. NOTE: the milk jug is now oriented upside down to match the shape of the skull.


Cut a few slits where the jug will fit under the jawline.

You can now fit the milk jug over the skull.

Heat and Press


Your now ready to heat the plastic and press it into the original skull like a mold or form. Use the heat gun on high heat setting, and move it around a small area, such as the forehead or eye socket until the plastic becomes clear.


Then, wet and ring out your sponge so it is damp but not dripping. Press the melted plastic into place.


You'll repeat this until you're finished! This timelapse will give you an idea of what the process looks like.

Remove Skull from Form


Use a hobby knife to slit the top of the skull toward the back and down.


Peel the new skull off of the form skull.

Next, we'll wire up the lights and sound!

Wire the HalloWing

Here's how we'll wire the NeoPixels, 10mm eye LEDs, and speaker. Power will be provided by a power supply plugged into the HalloWing's USB port.

Don't plug the LEDs into the 3V output of the HalloWing, instead use a digital pin, such as D13, which has current limiting built in.
Not shown here: the 8 ohm speaker

LED Eye Holders


Mark two spots on the eye sockets for the LED eyes to go.


Puncture the holes and then widen them with a tapered tool, such as a screwdriver handle until they're just wide enough to press fit the LED holders.

Wire the LEDs


Wire the LEDs by pushing their legs into the ends of the wire jumpers as shown. The long, anode legs of the LEDs go to positive (D13) and the short, cathode legs to ground (G) so keep track of the wire colors you use!


Push the LEDs into their holders. Note: the holders may pop out from the sockets as the LEDs go in, then you can push the holders back in place.

Next, plug in the jumper wires as shown, with the anode leg wires in D13 and the ground leg wires into G for ground.

NeoPixel Strip

Now, you can plug the NeoPixel strip into the NeoPixel port on the HalloWing, then loop the strip into the skull. Face the pixels inward to avoid seeing too many individual light sources.

Speaker and Power

Finally, plug in the speaker and USB micro/B cable for programming and tuck the electronics into the skull. Next we'll be programming the HalloWing.

Code with CircuitPython

CircuitPython Setup

To get started, you'll want to set up your HalloWing by following this guide. When you're ready, and can upload code to the board return here.

Adafruit really likes using the Mu editor to edit the CircuitPython code. See this guide on loading and using Mu.


You'll also need to add a code library for this project. Follow this guide on adding libraries. The only one you'll need is the neopixl.mpy file from the Circuit Python bundle in the 'lib' folder, so just drag it from your downloaded, unziped 'lib' folder onto the HalloWing.

Sound Files

The code was designed to call on seven different sound effects. These growls and screams come to us courtesy of the Creative Commons 3.0 licensed sound pack by Freesound.org user enochrooted.

Download this zip file and uncompress it to get the sounds. Drag the .wav files onto your HalloWing (it will show up as the USB drive CIRCUITPY).


Here is the code we'll use. Copy it and then paste in Mu. Save it to your HalloWing as code.py

import time
import board
import digitalio
import audioio
import neopixel

# user variables
pix_rate = 0.03  # Increase the number to slow down the color chase
blink_times = 2  # number of times the eyes blink between color chases
blink_speed = 0.1  # speed of the blinks, lower numbers are faster
rest_time = 3  # time between color changes e.g. '3' = 3 sec, '300'= 5 mins.

#  setup
pixels = neopixel.NeoPixel(NEOPIXEL_PIN, NUM_PIXELS)

led = digitalio.DigitalInOut(board.D13)
led.direction = digitalio.Direction.OUTPUT
led.value = True

ORANGE = (255, 30, 0)
PURPLE = (200, 0, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLACK = (0, 0, 0)



def color_chase(color, wait):
    for i in range(NUM_PIXELS):
        pixels[i] = color

def blink(times, speed):
    for _ in range(times):
        led.value = False
        led.value = True

def play_waves(file_num):
    wave_file = open(wave_files[file_num], "rb")  # open a wav file
    wave = audioio.WaveFile(wave_file)
    audio.play(wave)  # play the wave file
    while audio.playing:  # allow the wav to finish playing
    wave_file.close()  # close the wav file

wave_files = ["alex_deepgrowl1.wav", "alex-highgrowl1.wav", "alex-squeal1.wav",
              "toni-deepgrowl.wav", "toni-highgrowl2.wav","toni-pigsqueal.wav",
audio = audioio.AudioOut(board.A0)

while True:
    for k in range(len(wave_files)):
        blink(blink_times, blink_speed)
        color_chase(COLORS[k], pix_rate)

With the code uploaded to your HalloWing you can now turn down the lights and get ready for the wonderful creepiness of your Milk Jug Glow Skull! Perfect for decorating for Halloween, or even year-round!

This guide was first published on Sep 14, 2018. It was last updated on Sep 14, 2018.