Anusha’s Final Five Nights At Freddy’s Costume For Halloween

Bonnie The Animatronic Bunny

WHO:

Five Nights At Freddy’s Bonnie The Animatronic Bunny

WHY:

I wanted to do something niche, but recognizable to only the fan base. Five Nights fans are CRAZYY and I was immediately recognized many times throughout the night! I also love horror and this concept always stood out to me, as a kid.

WHAT (I USED): Foam, Acrylic Paint, Adhesive Spray, Solder, Gemma, Adafruit Jewels, Battery Pack, Medium Gauge Wire

WHAT (I DID):

The first thing I worked on was the ear headpiece. I cut foam with the band saw into 4 pieces and spent hours sanding them down to the correct shapes. Then, I sprayed them with adhesive spray before painting them.

I separately soldered wire to a metal headband (& later added supports + a second metal headband)

Finally I tackled the part I was most nervous about. I started on tinkered, with a tutorial of a blinking light sequence on the jewels that I was working with.

I played around with the code and used a bit of help from chat gbt to apply a fade between the yellow and red color switch.

Next, I soldered the Gemma to the 2 jewels, measuring them up against the glasses that they would be attached to.

HOW (I FEEL):

I am happy with the accuracy of this costume! And its wearability throughout the night.

Running out of time, during my laptop disaster, I thought I would not be able to pull it all together in the end. But after a last minute re-solder and borrowing Lauren’s laptop on October 31st at 4:45pm, I loaded the light animation onto my Gemma and was ready for the fashion show and parade!

HOW (I CAN DO BETTER):

I should have decreased the brightness significantly. Maybe also take into account my own eye protection. I want to be more fluent in coding language so I can pinpoint issues and troubleshoot with more confidence.

TINKERCAD https://drive.google.com/file/d/1LX8EX3-5uFjP9YvgM3HJ8r1Boct3wSZC/view?usp=share_link

LIGHT ANIMATION https://drive.google.com/file/d/1dGtNRC39YCYtbto4rx-KaEBUfs9AN49W/view?usp=drive_link

TIKTOK! https://drive.google.com/file/d/1GGy32F5IvCR6DhMpf5z_ybv6GBH-VRr7/view?usp=sharing

Wini’s Final Halloween Costume + Documentation 

  • The name of your costume: Stray Robot
  • Category: Halloween Costumes
  • Photos of your completed project (video optional):
  • This Halloween, I built a “Stray Robot” costume as a special tribute to our family. With my husband and I expecting our “second” son at the end of this year, we wanted to make this Halloween all about our “first son,” our orange tabby cat, Apu, putting him in the main spotlight. The costume is inspired by the video game Stray, which was a perfect theme since the main character is an orange tabby cat in a world populated only by robots. Our costume symbolized our deep love for Apu—we would even turn into robots to make him the star. The construction was a learning process; the head was built with an internal support and a waist belt for stability, and I taught myself how to program Arduino for the LED lights. Although it was a success, if I were to make it again, I would definitely design the head to be a bit smaller.
  • List (with links) of materials and parts used:
  1. BTF-LIGHTING WS2812B RGB 5050SMD Individually Addressable Digital 16×16 256 Pixels 6.3in x 6.3in LED Matrix Flexible FPCB Dream Full Color Works with SP802E Controller Image Video Text Display DC5V
  2. BTF-LIGHTING WS2812B IC RGB 5050SMD Pure Gold Individual Addressable LED Strip 16.4FT 300LED 60Pixel/m Flexible Full Color IP30 DC5V for DIY Chasing Color Project(No Adapter or Controller)
  3. Cardboard
  4. Acrylic board
  5. Spray paints
  6. Glass paints
  7. Hot glue
  • Circuit diagram
  • Arduino code
// Simple demonstration on using an input device to trigger changes on your
// NeoPixels. Wire a momentary push button to connect from ground to a
// digital IO pin. When the button is pressed it will change to a new pixel
// animation. Initial state has all pixels off -- press the button once to
// start the first animation. As written, the button does not interrupt an
// animation in-progress, it works only when idle.

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

// Digital IO pin connected to the button. This will be driven with a
// pull-up resistor so the switch pulls the pin to ground momentarily.
// On a high -> low transition the button press logic will execute.
#define BUTTON_PIN   2

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

//#define PIXEL_COUNT 256 // Number of NeoPixels
#define MATRIX_WIDTH 14
#define MATRIX_HEIGHT 16
#define PIXEL_COUNT (MATRIX_WIDTH * MATRIX_HEIGHT)

//#define BRIGHTNESS 10
// Define the brightness values requested
const uint8_t BACKGROUND_BRIGHTNESS = 100; // For the RGB rainbow part
const uint8_t FACE_BRIGHTNESS = 150; // For the RGB components of the white face

//   // Get current button state.
//   const uint8_t BACKGROUND_BRIGHTNESS = 20; // For the RGB rainbow part
// const uint8_t FACE_BRIGHTNESS = 35; // For the RGB components of the white face

const byte On_HOLDMap[MATRIX_HEIGHT][MATRIX_WIDTH] = {
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,1,1,0,0,0,0,0,0,0},
  {0,0,0,0,1,1,1,1,0,0,0,0,0,0},
  {0,0,0,0,1,1,1,1,0,0,0,0,0,0}, // Eye
  {0,0,0,0,1,1,1,1,0,0,1,0,0,0}, // Eye
  {0,0,0,0,0,1,1,0,0,0,1,0,0,0}, // Eye
  {0,0,0,0,0,0,0,0,0,0,1,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,1,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,1,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,1,0,0,0},
  {0,0,0,0,0,1,1,0,0,0,1,0,0,0}, // Mouth
  {0,0,0,0,1,1,1,1,0,0,1,0,0,0}, // Mouth
  {0,0,0,0,1,1,1,1,0,0,0,0,0,0},
  {0,0,0,0,1,1,1,1,0,0,0,0,0,0},
  {0,0,0,0,0,1,1,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0}
};

const byte Wink_Map[MATRIX_HEIGHT][MATRIX_WIDTH] = {
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,1,1,0,0,0,0,0,0,0},
  {0,0,0,0,0,1,1,0,0,0,0,0,0,0},
  {0,0,0,0,0,1,1,0,0,0,0,0,0,0}, // Eye
  {0,0,0,0,0,1,1,0,0,0,1,0,0,0}, // Eye
  {0,0,0,0,0,1,1,0,0,0,1,0,0,0}, // Eye
  {0,0,0,0,0,0,0,0,0,0,1,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,1,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,1,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,1,0,0,0},
  {0,0,0,0,0,1,1,0,0,0,1,0,0,0}, // Mouth
  {0,0,0,0,1,1,1,1,0,0,1,0,0,0}, // Mouth
  {0,0,0,0,1,1,1,1,0,0,0,0,0,0},
  {0,0,0,0,1,1,1,1,0,0,0,0,0,0},
  {0,0,0,0,0,1,1,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0}
};

const byte no_words_Map[MATRIX_HEIGHT][MATRIX_WIDTH] = {
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,1,1,0,0,0,0,0,0,0},
  {0,0,0,0,0,1,1,0,0,0,0,0,0,0},
  {0,0,0,0,0,1,1,0,0,0,0,0,0,0}, // Eye
  {0,0,0,0,0,1,1,0,0,0,1,0,0,0}, // Eye
  {0,0,0,0,0,1,1,0,0,0,1,0,0,0}, // Eye
  {0,0,0,0,0,0,0,0,0,0,1,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,1,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,1,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,1,0,0,0},
  {0,0,0,0,0,1,1,0,0,0,1,0,0,0}, // Mouth
  {0,0,0,0,0,1,1,0,0,0,1,0,0,0}, // Mouth
  {0,0,0,0,0,1,1,0,0,0,0,0,0,0},
  {0,0,0,0,0,1,1,0,0,0,0,0,0,0},
  {0,0,0,0,0,1,1,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0}
};

const byte heartMap[MATRIX_HEIGHT][MATRIX_WIDTH] = {
  {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,0,1,1,0,0,0,0,0,0,0,0},
  {0,0,0,1,1,1,1,0,0,0,0,0,0,0}, // Bigger Heart Top
  {0,0,1,1,1,1,1,1,0,0,0,0,0,0},
  {0,0,1,1,1,1,1,1,1,0,0,0,0,0},
  {0,0,1,1,1,1,1,1,1,1,0,0,0,0},
  {0,0,0,1,1,1,1,1,1,1,1,0,0,0},
  {0,0,0,0,1,1,1,1,1,1,1,1,0,0},
  {0,0,0,1,1,1,1,1,1,1,1,0,0,0},
  {0,0,1,1,1,1,1,1,1,1,0,0,0,0},
  {0,0,1,1,1,1,1,1,1,0,0,0,0,0},
  {0,0,1,1,1,1,1,1,0,0,0,0,0,0}, // Bigger Heart Tip
  {0,0,0,1,1,1,1,0,0,0,0,0,0,0},
  {0,0,0,0,1,1,0,0,0,0,0,0,0,0},
  {0,0,0,0,0,0,0,0,0,0,0,0,0,0}
};


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

// Argument 1 = Number of pixels in NeoPixel strip
// Argument 2 = Arduino pin number (most are valid)
// Argument 3 = Pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)

boolean oldState = HIGH;
int     mode     = 0;    // Currently-active animation mode, 0-9
int brightness = 25;
void setup() {
  
  strip.setBrightness(brightness);
  
    
  
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  strip.begin(); // Initialize NeoPixel strip object (REQUIRED)
  strip.show();  // Initialize all pixels to 'off'

  

}

void loop() {

 
 
  boolean newState = digitalRead(BUTTON_PIN);



  // Check if state changed from high to low (button press).
  if((newState == LOW) && (oldState == HIGH)) {
    // Short delay to debounce button.
    delay(20);
    // Check if button is still low after debounce.
    newState = digitalRead(BUTTON_PIN);
    if(newState == LOW) {      // Yes, still low
      if(++mode > 9) mode = 0; // Advance to next mode, wrap around after #8
      switch(mode) {           // Start the new animation...
        case 0:
          colorWipe(strip.Color(  0,   0,   0), 50);    // Black/off
          
          break;
        case 1:
        drawPattern_on_hold_face();
          
          break;
        case 2:
        drawPattern_wink_face();
        //
         
          break;
        case 3:
          //colorWipe(strip.Color(  0,   0, 255), 50);    // Blue
          drawPattern_on_hold_face();
          break;
        case 4:
          //theaterChase(strip.Color(127, 127, 127), 50); // White
          //drawCirclePattern();
          drawPattern_rainbow_heart_face();
          
          break;
        case 5:
          drawPattern_on_hold_face();
          
          //theaterChase(strip.Color(127,   0,   0), 50); // Red
          break;
        case 6:
        drawPattern_no_words_face();
          //theaterChase(strip.Color(  0,   0, 127), 50); // Blue
          break;
        case 7:
          //rainbow(10);
          //drawCirclePattern();
          drawPattern_heart_face();
          break;
        case 8:
          theaterChaseRainbow(50);
          break;
      }
    }
  }

  // Set the last-read button state to the old state.
  oldState = newState;
}

void drawPattern_on_hold_face() {
  // Iterate over every pixel in the matrix.
  for (int y = 0; y < MATRIX_HEIGHT; y++) {
    for (int x = 0; x < MATRIX_WIDTH; x++) {
      // Get the 1D index for the pixel at (x,y) coordinates.
      int pixelIndex = getPixelIndex(x, y);

      // Check the bitmap to see if this pixel is part of the smiley.
      if (On_HOLDMap[y][x] == 1) {
        // This pixel is part of the face.
        uint8_t current_brightness = FACE_BRIGHTNESS;
        // Add vertical stripe effect by brightening odd-numbered columns.
        if (x % 2 != 0) {
          // Add brightness for the stripe, ensuring it doesn't exceed 255.
          current_brightness = min(255, current_brightness + 15);
        }
        // Set an RGB white color by setting R, G, and B to the same value.
        strip.setPixelColor(pixelIndex, strip.Color(current_brightness, current_brightness, current_brightness));

      } else {
        // This pixel is part of the background.
        // To reverse the rainbow direction (green->yellow->red...), we start
        // at the green hue (21845) and SUBTRACT a value that increases
        // across the diagonal. This makes the hue decrease.
        uint16_t hue = 21845 - (((uint32_t)((x - y) + (MATRIX_HEIGHT - 1)) * 65535) / (MATRIX_WIDTH + MATRIX_HEIGHT - 2));

        uint8_t current_brightness = BACKGROUND_BRIGHTNESS;
        // Add vertical stripe effect by brightening odd-numbered columns.
        if (x % 2 != 0) {
          current_brightness += 8; // Make stripes on background brighter
        }

        // Get the 32-bit color value from HSV (Hue, Saturation, Value/Brightness).
        uint32_t color_background = strip.ColorHSV(hue, 255, current_brightness);
        
        strip.setPixelColor(pixelIndex, color_background);
      }
    }
  }

  // After setting all the pixel colors, push the data to the strip.
  strip.show();
}

void drawPattern_no_words_face() {
  // Iterate over every pixel in the matrix.
  for (int y = 0; y < MATRIX_HEIGHT; y++) {
    for (int x = 0; x < MATRIX_WIDTH; x++) {
      // Get the 1D index for the pixel at (x,y) coordinates.
      int pixelIndex = getPixelIndex(x, y);

      // Check the bitmap to see if this pixel is part of the smiley.
      if (no_words_Map[y][x] == 1) {
        // This pixel is part of the face.
        uint8_t current_brightness = FACE_BRIGHTNESS;
        // Add vertical stripe effect by brightening odd-numbered columns.
        if (x % 2 != 0) {
          // Add brightness for the stripe, ensuring it doesn't exceed 255.
          current_brightness = min(255, current_brightness + 15);
        }
        // Set an RGB white color by setting R, G, and B to the same value.
        strip.setPixelColor(pixelIndex, strip.Color(current_brightness, current_brightness, current_brightness));

      } else {
        // This pixel is part of the background.
        // To reverse the rainbow direction (green->yellow->red...), we start
        // at the green hue (21845) and SUBTRACT a value that increases
        // across the diagonal. This makes the hue decrease.
        uint16_t hue = 21845 - (((uint32_t)((x - y) + (MATRIX_HEIGHT - 1)) * 65535) / (MATRIX_WIDTH + MATRIX_HEIGHT - 2));

        uint8_t current_brightness = BACKGROUND_BRIGHTNESS;
        // Add vertical stripe effect by brightening odd-numbered columns.
        if (x % 2 != 0) {
          current_brightness += 8; // Make stripes on background brighter
        }

        // Get the 32-bit color value from HSV (Hue, Saturation, Value/Brightness).
        uint32_t color_background = strip.ColorHSV(hue, 255, current_brightness);
        
        strip.setPixelColor(pixelIndex, color_background);
      }
    }
  }

  // After setting all the pixel colors, push the data to the strip.
  strip.show();
}




void drawPattern_wink_face() {
  // Iterate over every pixel in the matrix.
  for (int y = 0; y < MATRIX_HEIGHT; y++) {
    for (int x = 0; x < MATRIX_WIDTH; x++) {
      // Get the 1D index for the pixel at (x,y) coordinates.
      int pixelIndex = getPixelIndex(x, y);

      // Check the bitmap to see if this pixel is part of the smiley.
      if (Wink_Map[y][x] == 1) {
        // This pixel is part of the face.
        uint8_t current_brightness = FACE_BRIGHTNESS;
        // Add vertical stripe effect by brightening odd-numbered columns.
        if (x % 2 != 0) {
          // Add brightness for the stripe, ensuring it doesn't exceed 255.
          current_brightness = min(255, current_brightness + 15);
        }
        // Set an RGB white color by setting R, G, and B to the same value.
        strip.setPixelColor(pixelIndex, strip.Color(current_brightness, current_brightness, current_brightness));

      } else {
        // This pixel is part of the background.
        // To reverse the rainbow direction (green->yellow->red...), we start
        // at the green hue (21845) and SUBTRACT a value that increases
        // across the diagonal. This makes the hue decrease.
        uint16_t hue = 21845 - (((uint32_t)((x - y) + (MATRIX_HEIGHT - 1)) * 65535) / (MATRIX_WIDTH + MATRIX_HEIGHT - 2));

        uint8_t current_brightness = BACKGROUND_BRIGHTNESS;
        // Add vertical stripe effect by brightening odd-numbered columns.
        if (x % 2 != 0) {
          current_brightness += 8; // Make stripes on background brighter
        }

        // Get the 32-bit color value from HSV (Hue, Saturation, Value/Brightness).
        uint32_t color_background = strip.ColorHSV(hue, 255, current_brightness);
        
        strip.setPixelColor(pixelIndex, color_background);
      }
    }
  }

  // After setting all the pixel colors, push the data to the strip.
  strip.show();
}

void drawPattern_heart_face() {
  // Iterate over every pixel in the matrix.
  for (int y = 0; y < MATRIX_HEIGHT; y++) {
    for (int x = 0; x < MATRIX_WIDTH; x++) {
      // Get the 1D index for the pixel at (x,y) coordinates.
      int pixelIndex = getPixelIndex(x, y);

      // Check the bitmap to see if this pixel is part of the heart.
      if (heartMap[y][x] == 1) {
        // This pixel is part of the heart.
        uint8_t current_brightness = FACE_BRIGHTNESS;
        // Add vertical stripe effect by brightening odd-numbered columns.
        if (x % 2 != 0) {
          // Add brightness for the stripe, ensuring it doesn't exceed 255.
          current_brightness = min(255, current_brightness + 15);
        }
        // Set an RGB red color.
        strip.setPixelColor(pixelIndex, strip.Color(current_brightness, 0, 0));

      } else {
        // This pixel is part of the background.
        // Set a static sky blue color.
        uint16_t sky_blue_hue = 36000; // A nice cyan/sky blue hue.

        uint8_t current_brightness = BACKGROUND_BRIGHTNESS;
        // Add vertical stripe effect by brightening odd-numbered columns.
        if(x == 0 && y == 0){
          Serial.print("before: ");
          Serial.println(current_brightness);
        }
        // if (x % 2 == 0) {
        //   current_brightness += 8; // Make stripes on background brighter
        // }
        if(x == 0 && y == 0){
          Serial.print("after: ");
          Serial.println(current_brightness);
        }
        

        // Get the 32-bit color value from HSV (Hue, Saturation, Value/Brightness).
        uint32_t color_background = strip.ColorHSV(sky_blue_hue, 255, 255);
        
        strip.setPixelColor(pixelIndex, color_background);
      }
    }
  }

  // After setting all the pixel colors, push the data to the strip.
  strip.show();
}

void drawPattern_rainbow_heart_face() {
  // Iterate over every pixel in the matrix.
  for (int y = 0; y < MATRIX_HEIGHT; y++) {
    for (int x = 0; x < MATRIX_WIDTH; x++) {
      // Get the 1D index for the pixel at (x,y) coordinates.
      int pixelIndex = getPixelIndex(x, y);

      // Check the bitmap to see if this pixel is part of the smiley.
      if (heartMap[y][x] == 1) {
        // This pixel is part of the face.
        uint8_t current_brightness = FACE_BRIGHTNESS;
        // Add vertical stripe effect by brightening odd-numbered columns.
        if (x % 2 != 0) {
          // Add brightness for the stripe, ensuring it doesn't exceed 255.
          current_brightness = min(255, current_brightness + 15);
        }
        // Set an RGB white color by setting R, G, and B to the same value.
        strip.setPixelColor(pixelIndex, strip.Color(current_brightness, current_brightness, current_brightness));

      } else {
        // This pixel is part of the background.
        // To reverse the rainbow direction (green->yellow->red...), we start
        // at the green hue (21845) and SUBTRACT a value that increases
        // across the diagonal. This makes the hue decrease.
        uint16_t hue = 21845 - (((uint32_t)((x - y) + (MATRIX_HEIGHT - 1)) * 65535) / (MATRIX_WIDTH + MATRIX_HEIGHT - 2));

        uint8_t current_brightness = BACKGROUND_BRIGHTNESS;
        // Add vertical stripe effect by brightening odd-numbered columns.
        if (x % 2 != 0) {
          current_brightness += 8; // Make stripes on background brighter
        }

        // Get the 32-bit color value from HSV (Hue, Saturation, Value/Brightness).
        uint32_t color_background = strip.ColorHSV(hue, 255, current_brightness);
        
        strip.setPixelColor(pixelIndex, color_background);
      }
    }
  }

  // After setting all the pixel colors, push the data to the strip.
  strip.show();
}


void drawCirclePattern() {

  
  // Define the colors we will use.
  uint32_t color_circle = strip.Color(255, 255, 255); // White
  uint32_t color_background = strip.Color(255, 0, 0);  // Green

  // Define the center of the matrix (using float for accuracy).
  float centerX = (MATRIX_WIDTH - 1) / 2.0f;
  float centerY = (MATRIX_HEIGHT - 1) / 2.0f;

  // Define the radius of the circle.
  float radius = 1.0f;
  // This value controls the thickness of the circle's line.
  float thickness = 1.0f;

  // Iterate over every pixel in the matrix.
  for (int y = 0; y < MATRIX_HEIGHT; y++) {
    for (int x = 0; x < MATRIX_WIDTH; x++) {
      // Calculate the distance of the current pixel (x, y) from the center.
      float distance = sqrt(pow(y - centerY, 2) + pow(x - centerX, 2));

      // Get the 1D index for the pixel at (x,y) coordinates.
      int pixelIndex = getPixelIndex(x, y);

      // Check if the distance is within the circle's line.
      if (fabs(distance - radius) < thickness) {
        // This pixel is part of the circle, set it to white.
        strip.setPixelColor(pixelIndex, color_circle);
      } else {
        // This pixel is part of the background, set it to green.
        strip.setPixelColor(pixelIndex, color_background);
      }
    }
  }

  // After setting all the pixel colors in memory, push the data to the strip.
  strip.show();
}










int getPixelIndex(int x, int y) {
  if (y % 2 == 0) {
    // Even row: 0, 2, 4,...
    return y * MATRIX_WIDTH + x;
  } else {
    // Odd row: 1, 3, 5,...
    return y * MATRIX_WIDTH + (MATRIX_WIDTH - 1 - x);
  }
}



// Fill strip pixels one after another with a color. Strip is NOT cleared
// first; anything there will be covered pixel by pixel. Pass in color
// (as a single 'packed' 32-bit value, which you can get by calling
// strip.Color(red, green, blue) as shown in the loop() function above),
// and a delay time (in milliseconds) between pixels.
void colorWipe(uint32_t color, int wait) {
  for(int i=0; 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
  }
}

// Theater-marquee-style chasing lights. Pass in a color (32-bit value,
// a la strip.Color(r,g,b) as mentioned above), and a delay time (in ms)
// between frames.
void theaterChase(uint32_t color, int wait) {
  for(int a=0; a<10; a++) {  // Repeat 10 times...
    for(int b=0; b<3; b++) { //  'b' counts from 0 to 2...
      strip.clear();         //   Set all pixels in RAM to 0 (off)
      // 'c' counts up from 'b' to end of strip in steps of 3...
      for(int c=b; c<strip.numPixels(); c += 3) {
        strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
      }
      strip.show(); // Update strip with new contents
      delay(wait);  // Pause for a moment
    }
  }
}

// Rainbow cycle along whole strip. Pass delay time (in ms) between frames.
void rainbow(int wait) {
  // Hue of first pixel runs 3 complete loops through the color wheel.
  // Color wheel has a range of 65536 but it's OK if we roll over, so
  // just count from 0 to 3*65536. Adding 256 to firstPixelHue each time
  // means we'll make 3*65536/256 = 768 passes through this outer loop:
  for(long firstPixelHue = 0; firstPixelHue < 3*65536; firstPixelHue += 256) {
    for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
      // Offset pixel hue by an amount to make one full revolution of the
      // color wheel (range of 65536) along the length of the strip
      // (strip.numPixels() steps):
      int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
      // strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
      // optionally add saturation and value (brightness) (each 0 to 255).
      // Here we're using just the single-argument hue variant. The result
      // is passed through strip.gamma32() to provide 'truer' colors
      // before assigning to each pixel:
      strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
    }
    strip.show(); // Update strip with new contents
    delay(wait);  // Pause for a moment
  }
}

// Rainbow-enhanced theater marquee. Pass delay time (in ms) between frames.
void theaterChaseRainbow(int wait) {
  int firstPixelHue = 0;     // First pixel starts at red (hue 0)
  for(int a=0; a<30; a++) {  // Repeat 30 times...
    for(int b=0; b<3; b++) { //  'b' counts from 0 to 2...
      strip.clear();         //   Set all pixels in RAM to 0 (off)
      // 'c' counts up from 'b' to end of strip in increments of 3...
      for(int c=b; c<strip.numPixels(); c += 3) {
        // hue of pixel 'c' is offset by an amount to make one full
        // revolution of the color wheel (range 65536) along the length
        // of the strip (strip.numPixels() steps):
        int      hue   = firstPixelHue + c * 65536L / strip.numPixels();
        uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB
        strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
      }
      strip.setBrightness(10);
      strip.show();                // Update strip with new contents
      
      delay(wait);                 // Pause for a moment
      firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames
    }
  }
}
  • In-progress images/sketches:

Jay’s Halloween Costumes (#Final)

Ghost Doll Cat

Why

My costume, “Ghost Doll Cat,” represents both comfort and invisibility — it’s a little spooky but also silly and cute.
I wanted to be like a real plush cat doll: quietly sitting in the corner, sometimes calm, sometimes playful, always just being myself.

I designed this costume as a kind of soft shield — something that hides me, yet lets me join everyone at the same time. The glowing fishbone pillow adds a bit of humor and life to the ghostly form. I chose a cat because cats always do whatever they want — even as ghosts, they remain mysterious and independent.

How to wear

To wear the costume, locate it through the red eyes first and adjust the ear positions. Each time it fits slightly differently, and the feeling varies depending on the person’s body shape under the cover, which I find very interesting.

What I learn

I learned how to use an electric embroidery machine — it was so much fun (though a bit expensive), and it made me more thoughtful about my design patterns. I also learned how to set up the Gemma board and connected the NeoPixel light strips.

What I would do differently

If I could remake it, I’d probably make the eye area smaller and use a more transparent fabric. Although I can still see people through the cloth, it’s not very convenient to move around. Next time, I’d also add an elastic band around the neck to create a Sunnyday Doll “teru teru bozu” style doll shape — to make it look even creepier and more doll-like.

materials

White fabric (photography backdrop) – main ghost part (https://a.co/d/fiu8FMx)
Black fabric (thick curtain) – fishbone cushion (https://a.co/d/iN3wOLF)
Red fabric (translucent) – eyes
White embroidery thread and white ribbon – fishbone pattern (https://a.co/d/jlelgSO)
Black embroidery thread and black marker – eyes
Neo pixel x 99, one Gemma, soldering wire (https://a.co/d/a3CFcol)

Circuit

Arduino code
https://www.tinkercad.com/things/c0ao1gyHsN3-spectacular-crift

Progress & Sketches

Mallika’s Halloween Costume Pt.4

‘Mine-crafted life’

Progress

Final 4 moods with RGBW color codes
Planned pixel map for the box

Updated TinkerCAD Circuit link
https://www.tinkercad.com/things/39yYl1YGqdN-halloween-tinkering

Updated Code for Gemma

Soldering physical circuit

Re-soldering the wires to
the Neopixel stick
Cables soldered to both
Neopixel sticks
Wires twisted and soldered to Gemma

Physical circuit running code

Process photos of the Box

Laser cutting the 1/4″ Acrylic sheet
Laser cut pieces
(4 faces + 3 testers for light)
Temporarily assembled box
Gathering supplies to paint the pixels
Testing the opacity of paint
on the testers cut
Realizing the pixels should be
painted on the inside of the box
Experimenting with light and
tones with 3 testers
Final shades of yellow
Final shades of red
Final shades of green
Final shades of blue
Making the grid lines for
pixels on the inside of the box
Painting the eyes and mouth of
the Minecraft head

T0-Do list

  • Painting the pixels on acrylic
  • Make remaining components (top and bottom of the head, severed neck and handle out of chipboard)
  • Gluing the structure together
  • Final assembly of the prop

Thank you!

Wini’s Halloween Costume Pt.3

Completed the single-button LED cycling function for Momo bot’s face.

Started building the initial prototype for the Momo bot’s head.

Task List:

  • Soldering: Complete the main LED pad.
  • Modeling: Add final details to the Momo bot’s head.
  • Assembly: Install the head’s bonding structure.
  • Finishing: Apply color to the head.
  • Electronics: Swap the Arduino Uno with the Gemma board.
  • Final Assembly: Mount the LEDs and Gemma inside the head model.

Mallika’s Halloween Costume Pt.3

‘Mine-crafted life’

Recap with updates

The severed Minecraft head is a prop for a halloween costume, acting like a trick or treat basket. Constructed from 1/4″ white translucent acrylic sheets, the head is painted with the signature pixelated aesthetic and features 2 internal RGBW LED Neopixel sticks placed in the center of the cube, covered with an opaque material (like chipboard) on the top and bottom faces. The primary function is to express four distinct “moods”—Angry (red light), Sad (blue light), Disgust (green light), and Happy (yellow light)—by dynamically shifting the color of the internal lighting. The basket includes a red handle and a “severed neck” base, with black paint for the eyes and mouth, ensuring both visual impact and a clear pathway for the light to shine through. The shades of the pixels are created by painting multiple coats of acrylic paint on the surface to help create a opaque and translucent light dispersal. The updated size for the cube is 8″x8″, with 1″x1″ pixels.

Updated Materials List

  • 1/4″ white translucent acrylic sheet – For the main structure, laser cut to make a 8×8″ cube. I will purchase this from the VFL once the laser cutting machine is functional on Friday.
  • (2) RGBW LED Neopixel Sticks – I had one in my kit, borrowed another one from Jay.
  • Poly-fill – To disperse the light inside the cube, already there in my kit.
  • Adafruit Gemma board – Already there in my kit.
  • Electrical wires – Already there in my kit.
  • USB Battery Pack – Already there in my kit.
  • Acrylic paint – To paint the pixels on the surface of the sheet and create tonality. I have some at home, will get more from Michaels if needed.
  • Solder – From the VFL.

Tools

  • Laser cutter (The filtration system of the laser cutter is currently down, it will be replaced on Thursday, I can cut out the structure on Friday. I thought of cutting the acrylic using an acrylic cutter but I have been advised against that by the VFL because of the thickness of the acrylic.)
  • Soldering Iron (Available in the VFL)
  • Acrylic joining solvent (Available in the VFL)
  • Wire strippers (Available in the VFL)
  • Wire snips (Available in the VFL)
  • X-acto knife (I have my own)
  • Acrylic cutter (Available in the VFL)

Progress

Making a 4 sides box frame in acrylic with finger joints, the top and bottom will be covered with chipboard with a grey scale pixel pattern.

Laser cutting file is ready.

  • Tinkering with the Arduino code

TinkerCAD circuit with my code on it

I made the circuit public but it is showing pending on TinkerCAD.

Tinkering with my own code
My tinker code
Tinkering with the Chat GPT code
Chat GPT’s tinker code

To-Do list

  • Test light dispersion on small pieces of acrylic to see light and shadows with white paint
  • Make components
  • Final Arduino code
  • Laser cutting of structure
  • Solder the Neopixel sticks to each other
  • Load code on Gemma
  • Assembly

Thank you!

Jay’s Halloween Costumes (#3)

ThinkCAD & Arduino video link:

https://www.tinkercad.com/things/c0ao1gyHsN3-spectacular-crift

https://drive.google.com/drive/folders/1cQIgQ42XmMttT54Uchr8u547O072Qw93?usp=share_link

Matrial:

headband, foam, and hot glue for cat ear
white fabric and see-through fabric for the main body part
black fabric for the tail part
black fabric and white thread for fish bone
neopixel, gemma, and power bank for light part

Next:

Fix the cat ears in place, get a model to help me mark and cut the eye holes, trim off the extra hem, and attach the tail.
Install the light section.
Use an embroidery machine to stitch the design onto the black fabric, sew it up, and then fill it with stuffing.

Process:

Yiran’s Halloween Costume Pt.2

I still prefer my first idea — cosplaying as Plankton’s electronic wife, Karen, from SpongeBob SquarePants.
Although my second idea, the angel wings, is visually beautiful, it doesn’t feel as conceptually interesting.
However, wearing a large “computer” on my head during the Halloween parade would not be safe.
So I’m thinking about transforming the computer into a handheld screen or a portable box, while dressing myself in a mechanical or cyber-inspired outfit.

This way, I can ensure safety during the parade, and when taking photos, I can lift the screen up to my face to recreate Karen’s look —
it would still be visually striking and conceptually playful.

Illustration of a handheld electronic screen designed for a cosplay, featuring a heart rate line graphic and a mechanism for wearability or hand holding.

1.Structure & Function

The device functions as a portable electronic screen that displays animated graphics and patterns.
A button allows the user to switch between multiple display modes (heartbeat line, smile, or flat signal),
recreating the reactive visual behavior of Karen from SpongeBob SquarePants.

2.Materials

Main Board:Use an Arduino UNO as the main control board to manage lighting and button interactions.

Display Module:BTF-LIGHTING WS2812B IC RGB 5050SMD Pure Gold Individual Addressable LED Strip 16.4FT 300LED 60Pixel/m Flexible Full Color IP30 DC5V for DIY Chasing Color Project

Light Source:Apply green LEDs or RGB lights (green channel only) to recreate Karen’s iconic electronic green glow.

Button:Add a small push button to switch between different facial expressions or animation modes.

Outer Shell:Construct the outer shell with foam board, PVC sheet, or acrylic sheet — lightweight, durable, and easy to shape.https://www.amazon.com/UU-FIL-Semi-Frosted-Gray-Black-Plexiglass/dp/B0DD1H9Q3F/ref=sr_1_3?crid=A07WVMWO7HBB&dib=eyJ2IjoiMSJ9.63A-wNk2kFjmm803p6lOB0KM12WCM0PAyZl8GzxAGGQK9Qazrv76rlv6oPYp_eUCjh7_F5N1HmbrJGXbbOFRk0Bk88C2L0fAkweXScC2v3BdRHm0hvHOZW5zvypu03I0y9U3YQzM4r_Fqv-2Gnez9DsCS_Jym7WVyhyhu8AEc8cCRj5keGIStKtv2I53fDPktljrN7cAcexaUQEmm19IPIiFrQUpZlwQnI-fUn8aEp0.h9WwCjcIGRwQdgJh8rLbhGkhdvLQZfamFDuTYU10ou0&dib_tag=se&keywords=frosted+acrylic+black&qid=1760538426&sprefix=frosted+acrylic+black%2Caps%2C127&sr=8-3

Diffusion Layer:Place a frosted acrylic or translucent plastic layer in front of the LEDs to create a soft, diffused glow.

Handle:Attach an acrylic or leather handle that can be held or worn on the hand for easy and safe interaction.

Tristan’s Halloween Costume

I’ve decided to move ahead with my halloween costume resembling Eve from Pixar’s Wall-E. I’m particularly interested in Eve’s vocabulary of moods as demonstrated through her different eye-states. This is an important part of her character building in Wall-E as we see her character go from a mindless mission driven robot to the considerate and caring character that audiences love.

To tackle these different mood-states I’ve decided to use an LED matrix for each of Eve’s eyes and glue them to the inside of a full-face sunglass visor.
Below are a few examples of different mood states I could express via the LED matrix. It’s particularly useful in this case that I may be able to use different colors through the RGB matrix to express enhanced states like anger.

I think I will mostly have a loop of alert with a ‘blinking’ animation loop to give the eyes effect. I will include a button on the visor or battery pack to toggle between mood states.

Shopping List

2x 8×8 RGB LED Matrix (Reminder to ask Becky which is best)
1x Sunglasses Visor
1x Rubber Gasket (to create distance between the visor + matrix and the face)
1x White Headcover
1x Adafruit Gemma
1x Battery Pack
1x Tactile Switch Button
__x Jumper Wire
__x Heat Seal Gasket
__x Glue (Reminder to ask Becky which is best)