Introduction: Interactive Stranger Things Jack-o-Lantern

About: Nerd. Geek. Billionaire crimefighter.

Lost your best friend after a late night D&D session? Look no further! Contact him on the other side with this handy-dandy pumpkin! Features a rolling script of lines from the show and a button you can push to ask Will yes or no questions directly.

Bill of materials

  1. 26 LEDs of varying colors I used cheap, simple LEDs because they looked the most like Christmas light bulbs.
  2. Wire
  3. Momentary, normally open button
  4. Some kind of pumpkin. I don't recommend a real one
  5. Prototyping board
  6. Female and male headers
  7. 3 220 Ohm resistors
  8. 2 74HC595 shift registers (optional)
  9. 2 16 pin IC sockets (optional)
  10. Arduino (I used a pro mini clone)
  11. 9V battery
  12. 9V battery clip

The shift registers will save GPIO pins on your Arduino so that you can use them for other things. However, because the Arduino has 14 GPIO pins, you will have enough with one to spare.

Step 1: The Circuit (no Shift Registers)

There are 26 letters in the English alphabet, and in the show, the letters are arranged in three rows of 8, 9, and 9 letters respectively:




We could address each of these letters individually and order each to turn on or off as needed. That would require 27 IO pins (26 letters, plus one pin for the button). Or, we can multiplex the LEDs, attaching the positive leads of all the LEDs in each row together, and the negative leads of each column together. Then, for example, to turn on the letter A, we send a positive voltage to the first row, and a ground voltage to the first column. Then, we only need 3 rows + 9 columns = 12 GPIO pins.

To make the LED matrix, I stripped some CAT-3 wire (telephone wire) completely, making three rows. I soldered the positive lead of 8, 9, and 9 LEDs to each row, spacing the LEDs reasonably for my pumpkin. Then, I stripped the ends and middles of 9 more pieces of CAT-3 wire, and soldered the negative leads of three rows to form 9 columns. Finally, I soldered lead wires to the ends of each row and each column, and soldered the other ends to a 3 pin male header for the rows, and a 9 pin male header for the columns. Be sure you maintain the proper wire order here. The rows of the LED matrix are attached to digital IO pins 0,1, and 3 on the Arduino. We skip pin 2 because we will need it for the question answering button. Pins 4-12 on the Arduino are used for the columns. Each LED row needs a current limiting 220 ohm resistor to avoid burning out the LEDs.

The "magic 8 ball" question answering button is attached to Arduino pin 2 because this is one of the few pins that support external interrupts (see later). The other button lead is attached to ground, because we want to button to send a low (ground) signal to the Arduino. I attached the button to a 2 pin male header. Finally, I strengthened all the header pin connections with a healthy coating of hot glue.

Power comes from a 9V battery attached to the raw voltage and ground pins of the Arduino, labeled Vin (or RAW or Vraw) and GND. The voltage regulator on the Arduino board will reduce the voltage to the 5V required by the Arduino. I attached a 9V battery clip to a 2 pin male header.

Because I did not intend to use this circuit for my final project, I built it using an Arduino Uno on breadboards.

Here's are Autodesk Circuits breadboard:

Step 2: The Software (no Shift Registers)

The Arduino sketch is attached, including comments on how it works. Essentially, the sketch makes use of the concepts in , where the Arduino millisecond clock is used to time multiple events, making it seem as if the Arduino is doing multiple things at the same time. You can use delay() to time the messages and the individual letters, but delay() locks up the Arduino and keeps it from doing anything else during that time. Instead, we leave the loop() running and check if it's time to do the next thing yet every loop.

Each letter is stored as a row/column pair, and then the letters are combined into messages. The messages in turn are wrapped in a ScriptedMessage class, which keeps track of each message's state and timing. When creating a ScriptedMessage, you can specify timings, like the time each letter is illuminated.

One of the messages is randomized from the whole alphabet. The timing after each letter in this messages is extremely short, too. This produces a "haywire" twinkling effect.

We'll come back to the part of the software controlling the interactive "magic 8 ball" style button in a bit.

Step 3: The Circuit (with Shift Registers)

If you want to save even more GPIO pins for other tasks like I did, you can use shift registers. You can learn more about shift registers and how they work with the Arduino here: Long story short, a shift register is a bucket that holds some bits until you tell it to release them. It then releases the bits, sending a single bit to each of its outputs. The bits are shifted into the shift register, meaning that every time you send a new bit to the register and click the clock forward, it moves the bit down by one. The bits will fall off the other end if they're not released. You can also daisy chain the registers together, so that you can shift a bit all the way down a chain of multiple registers.

The 74HC595 is an inexpensive 8-bit register. We need one bit for each output. We have 12 outputs if you recall. So we need two shift registers, and the last four bits are unused. Rather than connecting our LED rows and columns directly to the Arduino GPIO pins, we connect them to the first 12 outputs of the 2 shift registers, keeping in mind that the first bit we send to the registers will be the last output of the second register because the bits are shifted all the way in.

For the other shift register connections, Vcc (pin 16) and GND (pin 8) go to 5V and ground for both registers, which I took from the Vcc and GND pins on the Arduino. Because we are only lighting a single 3mm LED at a time, it's okay to let the Arduino supply the power. Both shift register OE pins (pin 13) go to ground, and both shift register MR pins (pin 10) go to Vcc.

To connect to the Arduino, pin 11 (the clock pin SH_CP) goes to Arduino pin 11, and pin 12 (the latch pin ST_CP) connects to Arduino pin 8. This is true for BOTH registers. The clock pin should fire every time you push a new bit to the register--that's how it knows. The latch pin should fire when you're ready to dump the register out to the LEDs. The actual input pin, pin 14, connects to the Arduino pin 11 for the first shift register. The second shift register's input pin connects to the first shift register's output pin (pin 9) to make the daisy chain.

Next using protoboard, I soldered two 12 pin female headers in place to make a socket for the Arduino Pro Mini. I also added a 9 pin female header for the columns and a 3 pin female header for the rows. The LEDs need current limiting resistors, so I soldered one 220 ohm resistor for each row onto the protoboard. I added a 2 pin female header for the 9V power input, and a two pin header for the button input. I also soldered two 16 pin IC sockets for the shift registers. These are optional, but they allow you to reuse your shift registers elsewhere.

I also highly recommend prototyping this circuit on a breadboard. I've attached a photo showing how I did it. I used 12 resistors and 12 LEDs. The row LEDs have their positive leads attached (via the resistor) to their shift register pin. The column LEDs have their negative leads attached via resistor to their shift register pin. That way, the appropriate row and column pair should illuminate when a letter is tested.

Here is the Autodesk Circuits breadboard:

Step 4: ​The Software (with Shift Registers)

The software is mostly the same. To shift in bits, we can just send each register an 8-bit number using the built-in shiftOut() function. You can send either an integer between 0-255, a binary number, or a hexadecimal number, for example. I prefer using binary notation, just because it makes it very explicit which bit is high (5V), and which is low (ground).

If you look at the definitons of the letters, they are now of type byte, with one byte for each register. Where the rows (the first 3 bits) are 1 and the columns (bits 4-12) are 0, the light will illuminate.

const byte A[2] = {0b10001111, 0b11110000};

For the letter A, the first row is set to 1, and the others rows to 0. The first column is set to 0, and the rest to 1.

Step 5: Adding a Magic 8 Ball Style Button

We want the pumpkin to stop everything it's doing and immediately go dark and "listen" while the button is held. When it's released, the pumpkin should answer with "yes", "no", or "maybe". Because we want this to happen regardless of anything else the pumpkin is doing, we use an interrupt. The Arduino supports interrupts for only a few pins. We will use pin 2. In this case, we define an interrupt for when the button goes low. The interrupt is attached to a routine that blanks the display and sets the button press state to true. An interrupt function should be short and simple, because it takes the Arduino offline until they're done. Also, timed activities don't work during an interrupt because the timers do not work during an interrupt event.

The actual 8 ball processing happens in the normal loop so that timing works. A random response is selected from the three available using the built-in random() function.

Step 6: Putting It All Together

Once the circuit and software are done and the software is loaded on the Arduino, it's time to put it all together inside a pumpkin. I recommend the carvable foam kind. I had to resort to a plastic pumpkin myself, because apparently the foam ones were sold out everywhere.

Using a still shot from the show as a guide, I used a permanent paint pen to draw the alphabet as it appears on the wall in the show. Then, I drew Christmas light wires with a fine point permanent marker, making bases for each LED bulb. Because my LEDs are 3mm, a 1/8th" drill bit perfectly holds each bulb. I drilled through each bulb location, and then carefully massaged my LED matrix into place, taking care not to short any of the wires. I added a dab of hot clue behind each LED to secure it into place. Finally, I hooked up all the headers. It's easy to get the column header backwards, but you will know because the messages will be nonsense.

Or maybe that's just what the Demogorgon wants you to think.

Halloween Props Contest 2016

Participated in the
Halloween Props Contest 2016

Circuits Contest 2016

Participated in the
Circuits Contest 2016