Site icon Making Studio

Sige’s Halloween Costume – NoFace/TwoFace Ghost

YouTube Poster

This Halloween I made a costume as the No-face ghost but made it into a two-face ghost. This is an interactive costume – when I high five with another person, the face of white light will flash red; when I make a heart shape with my hand, the neutral face will change into a love face that flashes pink and blue color.

This costume is inspired by the movie Spirited Away. In the movie, the No Face ghost follows Sen, the young girl, at the end of her journey and onto the train. The Two Face ghost follows me around NYC and on the subway of NYC.

Materials

  1. Black cloth
  2. LED light strips
    • strip lights from the front, cut into 12 sections to make the neutral face and the mouths
    • strip lights from the side, cut into 2 sections to make the hearted eyes
  3. Wires
    • to connect lights
  4. Thick wires
    • to make the frame to support the ghost (cloth)
  5. Solder
    • to connect lights and wires
  6. Zip tie
    • to connect the wire frame
  7. Hot glue
    • to seal the sharp wire edges
  8. Electric tape
  9. Gemma
  10. Power Bank
  11. Vibration sensor
  12. Magnetic switch

Circuit Diagram

Arduino Code

https://www.tinkercad.com/things/dKrVTRXBeRQ-siges-halloween-code?sharecode=1lYuPeBtHUzDRoIwtiQ0rHkCWOYn-FoT_Had3ImEeuQ

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

#define BUTTON_PIN   2

#define VIBRATION_PIN   0

#define PIXEL_PIN    1  // Digital IO pin connected to the NeoPixels.

#define PIXEL_COUNT 77  // Number of NeoPixels

// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

boolean oldStateV = HIGH;
int     modeV     = 0;    // Currently-active animation mode, 0-9
boolean oldStateM = HIGH;
int     mode     = 0;    // Currently-active animation mode, 0-9

void grouponeanimate(uint32_t color, int wait) {
  for(int i=0; i<31 ; i++) { // For each pixel in strip...
    strip.setPixelColor(i, color);         //  Set pixel's color (in RAM)
  }
    strip.show();                          //  Update strip to match
    delay(wait);                           //  Pause for a moment
  }

void grouptwoanimate(uint32_t color, int wait) {
  for(int i=31; i<strip.numPixels(); i++) { // For each pixel in strip...
    strip.setPixelColor(i, color);         //  Set pixel's color (in RAM)
  }
    strip.show();                          //  Update strip to match
    delay(wait);                           //  Pause for a moment
  }

void g2Purple(int wait) {
    for (int fadeValue = 0; fadeValue <= 255; fadeValue += 15) {
      for(int i=31; i<strip.numPixels(); i++) { // For each pixel in strip...
        strip.setPixelColor(i, strip.Color(fadeValue,   0,   255,0));         //  Set pixel's color (in RAM)
      }
        strip.show(); 
        delay(wait); 

    Serial.print("fadevalue= ");
    Serial.println(fadeValue);
      strip.show();                          //  Update strip to match
  

  // fade out from max to min in increments of 5 points:
    for (int fadeValue = 255; fadeValue >= 0; fadeValue -= 15) {
      for(int i=31; i<strip.numPixels(); i++) { // For each pixel in strip...
        strip.setPixelColor(i, strip.Color(fadeValue,   0,   255,0));         //  Set pixel's color (in RAM)
      }
        strip.show();   
        delay(wait);    
    }
    Serial.print("fadevalue= ");
    Serial.println(fadeValue);  }
      strip.show();                          //  Update strip to match
}

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(VIBRATION_PIN, INPUT_PULLUP);
  strip.begin(); // Initialize NeoPixel strip object (REQUIRED)
  strip.show();  // Initialize all pixels to 'off'
}

void loop(){
  boolean newStateV = digitalRead(VIBRATION_PIN);
  boolean newStateM = digitalRead(BUTTON_PIN);

  if(newStateV != oldStateV) {
    // Short delay to debounce button.
    delay(10);
    // Check if button is still low after debounce.
    newStateV = digitalRead(VIBRATION_PIN);
    if(newStateV != oldStateV) {      // Yes
      grouptwoanimate((  0, 0,   0), 50);
      if(++modeV > 1) modeV = 0; // Advance to next mode, wrap around after #1
      switch(modeV) {           // Start the new animation...
        case 0:
          grouponeanimate(strip.Color(180,   180,   255), 50);    // white
          break;
        case 1:
          grouponeanimate(strip.Color(  255, 0,   0), 50);    // red
          break;
      }
    }
      oldStateV = newStateV;
    } else {
      if (newStateM != oldStateM) {
        grouponeanimate(strip.Color(  0, 0,   0), 50);
        g2Purple(50);
        oldStateM = newStateM;
    }
  }
}

Process

1. Make the wire frame for the ghost structure

2. Connect the wire to Arduino and breadboard

I connected 1 long light strip to the Arduino and the breadboard so that I can test the code I will use

3. Write & test code

4. Connect the light and switch and sensor to Gemma, cut light strip into sections, solder them together with wires of various length so I can structure the light strip into the shapes of the face

While I’m soldering the light strips together, I tested the connection after each connection to make sure there’s nothing wrong.

5. Edit the code to fit the number of lights used and the Gemma port

6. Sew the light strip to the black cloth and wire structure

Voila!

Exit mobile version