Last Minute Haunted House Automation with Arduino

Posted in Projects by Bill
20 Nov 2013

imgOk, I know I’m late on posting this, but that pretty much sums up this project: Doing things at the last minute made possible by Open Source. Rewind you calendars to October 25. That’s the day I learned my apartment complex wanted to put on a haunted house and asked me to help. I agreed, worried that Halloween was in 6 days. What could I possibly throw together? I had to do it cheap, and I had to do it quickly. I only had 3 week days to get items ordered and delivered and one night to get everything together and working. If it wasn’t for the large open source community behind Arduino, I couldn’t have gotten this done.

The Plan

Six days. That’s all I had. I wan’t alone, I had fellow tenets in the complex helping out. They were good at construction and took care of the maze walls and other major tasks. The plan and execution was up to me.

First, I had to plan out the haunted House. I turned to Google and Pinterest ( I can’t believe I’m admitting this) to get ideas for the rooms. This is the list of what I came up with:

  1. Witch’s Lair – Bubbling cauldron in the kitchen with an actress playing the role of a scary witch
  2. Dot room - 5 dozen day-glow masks in an dark room with only blacklights; hidden actor ready to scare guests
  3. Slasher Window – Opaque window with a killer outside
  4. Scary Hallway - Free floating glowing eyes in the night
  5. Frankenstein’s Lair – The monster awakes in the scientist’s laboratory
  6. Haunted Bathroom – A spooky static room

Two of these rooms require some electronic automation, Witch’s Lair and Slasher Window. I ended up creating the automation by throwing together some parts I had on hand and adding a pinch of Arduino. This post centers on these two rooms. Everything that went into the project happened in just a few hours the night before. I didn’t have time to test. There’s a video walkthrough of the house at the bottom of this post.

The Approach

If I had a month to plan I could have rolled my own boards and written my own libraries. I could have sized enclosures and performed design testing. But I didn’t have a month. I only had a night. People harp on Arduino for being a crutch and mocked when engineers choose to use them. Well to me it’s a tool like any other, and in this case it was the right tool for the job.

My hammer, for now

My hammer, for now. Click to enlarge

Sound and light can make or break a Haunted House and automation is key. Static displays are boring and are the common cause of a failed haunted house. Something needs to move, to jump out, to scream and flash in your face. Witch’s Lair and Slasher Window both need a sound and light element to be effective.

Witch’s Lair was a scary scene showing a witch churn her cauldron in the kitchen. The plan was that the room started dark, and when the actress (the witch) pushed a button the lights and sound would come on to startle the guest. The lights would set the scene of a glowing concoction casting light in the room with the occasional lighting strike accompanied by a audio track of laughing witches.

Find the Sparkfun box

Find the Sparkfun box

Slasher Window consisted of a seemingly innocent and dark sliding glass door guests had to walk by to continue through the maze. When in the right position, a strobe light on the opposite side of the opaque window would activate along with standard ‘thriller killer’ sound effects. An actor would cast a silhouette on the window of an oncoming killer.

IMG_1512

Hardware

I had a few Arduino boards laying around, as well as a Sparkfun MP3 Shield and MP3 Trigger board. Both when paired with an Arduino can provide the automation and sound elements. For the light element, luckily I had access to several DMX controlled RGB LED par cans like this one:

DMX LED light

DMX LED light

These lights are controlled by a protocol called DMX, which is just RS485. With the right hardware an Arduino can easily talk DMX to these lights. Thankfully there is a seller on Amazon that sells inexpensive RS485 breakouts and accepted Amazon Prime (at the time) for fast shipping. Sparkfun sells a similar board. I also ordered the cheapest 3 pin DMX pigtail I could find to cut up and wire to the breakouts.

To protect my last minute project, I turned to the iconic Sparkfun box. It’s surprising resilient for a cardboard box and perfect for the temporary installation.

Sparkfun Project Enclosure

Sparkfun Project Enclosure

One room needed to be user operated. When the guests were in position the ‘witch’ would push a button to start the light and sound effects. I used an arcade button from Sparkfun with one Arduino and the MP3 trigger for this room.

The other room, Slasher Window need to be fully automated. I used a Ping ultrasonic sensor to detect when guests were approaching and activate the sound and lights.

Both kits included plastic standoffs to mount the boards, the RS485 breakout wired to a 3 pin DMX cable, a 9V wall wort power supply and some some perf board with pin headers to distribute power to all the devices.

Mounting

Mounting

 

Stress relief zip tie for the DMX cable

Stress relief zip tie for the DMX cable

 

The 5V 'power strip'

The 5V ‘power strip’

While the Witch’s Lair box simple stayed by the actress’s side, the Slasher Window had to be mounted for the sensor to detect the guests. This would later be covered up by black plastic with holes for the sensor.

You can also see the computer speakers used to create the sounds in those photos.

Software

For the software side, a quick Google search pointed me in the direction of a simple DMX library for Arduino. Both Arduino’s use this library for the DMX control. Of course I used my own library to run the MP3 Shield, and pulled in this easy library to run the MP3 Trigger board.

Witch’s Lair was a scary scene showing a witch churn her cauldron in the kitchen. The plan was that the room started dark, and when the actress (the witch) pushed a button the lights and sound would come on to startle the guest. I used Vixen to create a spooky 30 second light show to simulate light from the bubbling brew complete with lightning effect.

Vixen Light Sequence

Vixen Light Sequence

A quick trip through my Vixeno script gave me an array of brightness values I could drop directly into my Arduino sketch.

static uint8_t vixen_channels = 4; 
static uint16_t vixen_frames = 300; 
static uint16_t vixen_frameduration = 50; 

const PROGMEM uint8_t vixen_show_data[4][300] = { 
{0,255,255,253,251,249,255,255,253,251,249,247,245,243,241,255,255,253,251,255,255,...},
{255,255,255,255,253,255,255,255,255,253,251,255,255,253,251,249,247,255,255,255,...},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,255,0,255,0,0,0,0...},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,255,0,255,0,0,0,0,0,...}};

When the actress pushed the trigger button, this code would run to start the sound effect and pipe out the DMX light data:

  //see if button pressed
  if(!digitalRead(2)){
    //start sound playing
    trigger.trigger(1);
    //loop through all frames and channels writting out light show to DMX light
    for(int i = 0; i<vixen_frames; i++){
      long start = millis();
      for(int y = 0; y<vixen_channels; y++){
        DmxSimple.write(y+1,pgm_read_byte(&(vixen_show_data[y][i])));
        }
      delay(vixen_frameduration - (millis() - start));
    }

The DMX light had 4 channels: red, green, blue and amber. All 4 channels needed to be updated for every frame of the show.

Slasher Window was much more simple, when the sensor activated a few seconds later one LED light would strobe red behind the actor on the other side of the window.

void loop() {
  //leave light dim blue for all clear
  DmxSimple.write(3,1);
  //read sensor
  long range = getRange();
  Serial.println(range);
  if(range < trigger && range > 0){
    //warn the actor by turning off dim blue light
    DmxSimple.write(3,0);
    //wait for it
    delay(2000);
    //play sound effect and strobe light!
    MP3player.playTrack(10);
    for(int i=0; i<40; i++){
      DmxSimple.write(1,255);
      delay(50);
      DmxSimple.write(1,0);
      delay(50);
    }
    delay(5000);
  }
  delay(150);
}

I wasn’t sure how wide the path in front of the window would end up being so I wrote in an auto-cal routine during start-up to set the trigger threshold. That way no small guests could escape the horror and the wall wouldn’t trigger the scene.

  //read sensor once at first
  trigger = getRange();
  //set trigger threshold just shorther,
  if (trigger == 0) 
    trigger = 36;
  else 
    trigger -= 4;

Both Arduino sketches are available for download here -> HauntedHouseArduino

Result

The haunted house was a smashing success. For something thrown together the week before Halloween, we scared the bejesus outta some people and the automation worked well all night. This is a picture of everything that went into the automation, taken during breakdown:

IMG_20131109_173427

 


If you found this post interesting or helpful, please consider sending in a donation or disabling any ad-block plugin on my site. Proceeds go to my various education outreach efforts, towards repairing museum exhibits, or to my beer fund.


Share
  1. 2 Comments.

    • Larry SackettNo Gravatar says:

      What pins on the Arduino Uno did you connect to the RS485 breakout? I bought the Sparkfun MP3 player shield and the TinkerKit DMX Master shield. Unfortunately, it appears that digital Pin 2 on the Arduino is used by both shields for different purposes. I see you got around this by using a separate RS485 breakout with DMXSimple. I’m just confused about how to connect the RS485 breakout to the Arduino so that you can use DMXSimple with Pin 3. I’m working on a project for the Battleship North Carolina Memorial to add a sound and light component to the plotting station in the ship. I am very impressed with your MP3 player library. It works like a charm!

      • BillNo Gravatar says:

        Larry,

        I used pin A0, the first analog pin. You can use analog pins like digital pins, their numbers start with 14 for pin A0 and go up from there. So if you look at my code (which you can download above) you see

        /* The most common pin for DMX output is pin 3, which DmxSimple
        ** uses by default. If you need to change that, do it here. */
        DmxSimple.usePin(14);

        So I told the DMX library to use pin 14, which is Analog pin 0.

        Looking at the schematic for the TinkerKit DMX Master shield I think you can still use it. Their appears to be solder jumpers to set the shield to only always transmit (freeing up pins 2 and 5) and to use the hardware uart for the transmission (freeing up pins 3 and 4). But you have to be brave enough to desolder those little resistors.

        Either way, I’ll take a closer look at the Tinkerkit when i can to confirm that. Their documentation isn’t great.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Current day month ye@r *

Notify me of followup comments via e-mail. You can also subscribe without commenting.