Limelight: DIY Lime-Shaped Presentation Timer With LED Segments

By Mallika Rao & Josh Kotel

For our final design, we were between several ideas. Our pomodoro timer was the frontrunner but we became apprehensive about the lack of time and level of design we wanted to achieve.

We also strongly felt we wanted to design devices that worked as a set–either for communication or otherwise–but offered a shared experience.

Continue reading “Limelight: DIY Lime-Shaped Presentation Timer With LED Segments”

Manya’s Final Project: Sensory Bookmark

This bookmark is designed to make reading an immersive, multisensory experience. Upon opening your book, this bookmark turns into a reading light, automatically illuminating to light up your page. A customizable scent profile enhances the moment. Close the book, and the light turns off while the system enters low-power sleep mode to save battery.

If you’d like to take on an additional challenge, this bookmark has the potential to take on IoT features. Built on the Arduino Nano ESP32 with WiFi capabilities, you can program it to automatically start your favorite reading playlist on Spotify when you open your book, and even enable Do Not Disturb mode on your phone. It allows you to create a distraction-free reading environment and truly get lost in your latest literary escape.

Instructables Link

Continue reading “Manya’s Final Project: Sensory Bookmark”

Rhea’s Final Inner Thoughts Mirror

I wanted my inner thoughts mirror to really go against what we see nowadays. We are being pushed happiness and optimism so much. In the spirit of being a realist, I wanted to create something that reflected one’s actual inner thoughts back to them. In a way, I sometimes think taking optimism too far can skew one’s vision. I wanted to create something real – that perhaps adds a bit of a shock factor. When our thoughts are actually materialized and put in front of us, will we start being more aware and perhaps start reframing?

Tools

  1. Soldering iron
  2. Solder wire
  3. Wire cutters / strippers
  4. Hot glue gun
  5. Scissors
  6. Black tape(will become your best friend! I used an electrical one)

MATERIALS / COMPONENTS

  1. Arduino Nano ESP32
  2. 2.4″ OLED screen(I used an affordable one from Amazon, I would suggest looking one up on Adafruit for better quality and reliability)
  3. Wires
  4. Solderable breadboard
  5. USB-C cable (to program the ESP32)
  6. 6×6 inch two – way see through mirror
  7. 6 x 6 inch Shadow box frame
  8. Cardboard/ Old box
Continue reading “Rhea’s Final Inner Thoughts Mirror”

Tristan’s Final Halloween Costume

For my halloween project assignment I wanted to make something that would be easily portable and detachable without the need for execessive fabric, components, or deep storage.

I wanted the LED part to make sense as an effective component that would help me communicate my costume not add an extra layer to it.

In thinking of the best scifi characters I’d seen I stumbled across a favorite that I often go back to as a reference — Eve, the robot from Wall-E.

Eve

I liked how expressive Eve’s eyes are in comparison to her otherwise sterile Apple inspired form. Not only where her eyes useful for expressing her mood and character, they also seemed to have a specific pattern of states the character designers repeated across the film. This would be perfect for my costume idea and would also lend itself to a clean detachable wearable.

Components

In selecting compontents that would work for my costume I was extra selective of visors/sunglasses that would fit the futuristic aesthetic I was lookign for but also would provide enough ‘real estate’ to house all of the necessary components while still allowing me to see.

This was the same story with lighting and while being knowledgable enough to know I should not dive into wiring together a bunch of strips, I didn’t know enough about what I should order. Again I read product dimensions for a series of different lights in order to decide what would best fit and I also did a few drawings of the different eye states to validate that and 8×8 matrix grid would work to communicate my design.

some early drawings for the different eye states on 8×8 matrix grids

The Code

Once I ordered all compontents, I dove into the code part. After some initial research I knew that making the different eye states would be simple enough, as I’d just be telling which pixel to turn on in each of my grids — and boy was I wrong.

Setting up the Pins and Color were pretty straightforward and looked clean in the code.

The state switching to button press was also relatively straightforward even though I inititially thought we could use the native switch on the Gemma which come to find out is a hard-wire reset button.

Even setting up the eye states were pretty simple although alot of manual work trying to not mistype coordinate data for the x and y positions.

What was a challenge was the coordinate setup for the LED matrices and the way to make it work for two different light panels.

The Wiring

When I did the initial wireup test on the Arduino and bread-board I had only tested it with a single matrix, assuming it would be easy to extend the display to the second matrix. This was something I struggled with later on once wiring to my final Gemma version.

With help from Manya, I wired up my visor with everything installed and taped up nicely and to my surprise it was no longer working

With trouble shooting support from Becky, I realized it was a wiring issue. I insisted I had wired it perfectly but deep down I knew that it was too ‘perfect’ to be true. I had taped up and packaged everything so nicely that I was bound to have to go back and undo some of it.

I then realized that when wiring up my board I had been looking at the OUT nodes on my LED matrix and so the wires going IN were in the wrong order.

I rewired it…

It’s working!! Sort of….

I had one eye working at this point (and one dot in the second panel for some reason). This is the part I fought with in the end as I really wanted to tell the code my 8×8 matrix was a 16×8 matrix to basically extend the display.

While setting that up I began tweaking my states to reflect a 16×8 grid. However once setup the second eye didn’t wouldn’t display the eye correctly. The eye was always backwards or rotated or skewed in a different direction.

At one point I even ripped off the second eye and manually rotated the panel 180 degrees in the hope that it would fix this problem — it didnt and I ended up mirroring the displays which proved to be a really simple fix.

At this point I wanted something to show for all of my fiddling so I decided to continue with my original plan and add a blink animation to my eyes to give them more character. Instead of animating a blink I went with just togglign between the states and a blink state which is just a horizontal line. In the code it toggles to a blink every 6 seconds with a 250ms blink.

In the end

I learned alot from this process and while my costume looks more like a creepy NEO facotry robot more than it does Eve from Wall-e, I’m happy with the result.

If I were to take this process a step further I’d want to increase visibility in the visor while also finding a way to hook up a smaller battery in the visor to make it more self contained.

Lauren’s Final Spear | Halloween Costume



My goal for this project was to create a staff/walking stick/spear based on Spinel from Steven Universe. I wanted it to be something fun to carry around to Halloween parties for the rest of the week. Something striking and eye catching, creating it in my own style while keeping the tone of Spinel’s [dark + twisted love].

I really enjoy how this project came out, it feels really true to me and I was able to experiment with a few different techniques [laser. cutting, 3d printing]. I’m super interested in making more variations of this object, maybe based on different characters or moods.

Materials + Parts

3/4 inch pvc pole

Acrylic 1/8 Acrylic scrap: I ended up testing multiple various sizes and colors of acrylic sheets to see how they diffused the light

Adafruit Gemma M0

1 RGBW LED Neopixel Stick

Electrical Wires

USB Battery Pack

Solder

1 Black Feather Boa

Hot Glue

Transparent PLA

Stuffing

3D Print File Credits

Spinels Scythe Rejuvenator

Struggles
My biggest struggle was probably the 3d printing. While trying to print I ended up going through multiple versions of my design in order to troubleshoot the most efficient way to include the supports. I really enjoyed exploring the 3d printing community files, I have some printing experience but it was never something that really excited me. However, I found it really fun looking through all of the 3d print files that people upload to places like Thingiverse.

++ clearing out the supports out of something so narrow + long like the gem was way more tricky than I was expecting.

++ I did have to re-solder my Gemma 3 times because I kept messing up the ins/outs. Shoutout to Mallika + Tristan for helping me figure out what was wrong.

Sketch + 3D Printing

Circuit Diagram:


Code:

#define PIN 1
#define NUMPIXELS 8

Adafruit_NeoPixel strip(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
strip.begin();
strip.show();
}

void loop() {
// two quick pulses then rest
heartbeat();
delay(1000);
}

void heartbeat() {
for (int i = 0; i < 2; i++) {
pulse(255, 20, 100, 600, 200); // pinkish pulse: r,g,b, rise ms, fall ms
delay(150);
}
}

void pulse(int r, int g, int b, int riseTime, int fallTime) {
int steps = 30;
for (int i = 0; i <= steps; i++) { float bLevel = (float)i / steps; strip.fill(strip.Color(r * bLevel, g * bLevel, b * bLevel)); strip.show(); delay(riseTime / steps); } for (int i = steps; i >= 0; i–) {
float bLevel = (float)i / steps;
strip.fill(strip.Color(r * bLevel, g * bLevel, b * bLevel));
strip.show();
delay(fallTime / steps);
}
}

**I do feel like the photographer that was in the VFL got more progress shots than I did of this project so I’m hoping we get access to those. This was the least amount of documenting I’ve done for a project, which was surprising because initially i felt like I was capturing every step.

Halloween Costume–GuangyuWang

https://docs.google.com/presentation/d/1O_y3t_LMQEgUsuWVn4fftuYmNXf8ajmH0e4Q5ACRW4Y/edit?usp=sharing

Description and Intention

This project recreates the iconic “?” Question Box from the Super Mario video game series as an interactive prop.
When someone punches or taps the bottom of the box, it lights up brightly and plays a Mario coin sound, just like in the game when Mario collects a coin or power-up.

The intention behind this costume prop is to bring nostalgia and fun to Halloween.
It’s not designed to scare people — it’s designed to make people smile and feel like they’re inside the Mario world.
When friends see the glowing box and hear the coin sound, they immediately recognize it and often want to “hit” it themselves!
It’s both interactive and playful, perfect for a group or gaming-themed costume.

Concept:
Inspired by the iconic Question Block from the Super Mario games, this interactive box lights up and changes color whenever it’s “hit” from below — just like in the game when Mario punches it to release a coin or power-up.
The project uses NeoPixel LEDs for vivid lighting effects and an impact sensor (or push button) at the bottom to detect the punch or tap.

Objective:
To recreate a nostalgic video game interaction using Arduino and NeoPixel LEDs, demonstrating how sensors can trigger real-time lighting animations.

Take Away…

I chose the Mario Question Box as my Halloween costume because Super Mario has always been one of my favorite games. I’m obsessed with its playful, dynamic style—so I decided to bring the iconic question mark box to life! My first plan was to buy the costume online and then build the box myself. After discussing the idea with Becky, I began modeling the design, bought two rolls of filament, and started 3D printing in the wood shop. Everything went smoothly, except for the printing time—it took almost two full days! Thankfully, Becky kindly provided me with a sound board, and Wini helped me a lot with the circuit assembly.Besides, thanks for woodshop staff members helping me to set up the printer!

During the soldering phase, I experimented with different ways to prevent short circuits on the Gemma board while ensuring there was enough power for the speaker. It was a long and sometimes frustrating process, but eventually, the LEDs worked perfectly and the soundboard played flawlessly. Through this project, I learned two important lessons: patience in problem-solving and the true value of teamwork.

If I had the chance to redo it, I would design a more elastic mechanism to switch the lights on and off, and connect the sound board to a more stable power source for better performance.

Thank You!

Yiran’s Final Halloween Costume—Portable Karen

What my costume is:
For this project, I chose to cosplay Karen, the electronic wife of Plankton from SpongeBob SquarePants.
I mainly focused on recreating Karen’s head—the computer screen, and turned it into a handheld interactive device.
To complete the look, I paired it with a silver outfit that enhances the metallic, robotic feel of the character.

Why I made it:
I grew up watching SpongeBob SquarePants, and Karen has always been one of my favorite characters.
Cosplaying an intelligent computer felt both funny and fascinating—it’s not just a character, but also a machine with a personality.
Another reason I wanted to make this costume is the interactive potential: I can design multiple facial expressions and animations for the screen and switch between them during the Halloween parade, which makes the performance dynamic and playful.

How it is to wear it:
Since the device is handheld, I carried it throughout the parade.
The grip felt quite comfortable and the overall weight was manageable.
It was fun to hold and show to others, although I did notice that the screen tended to tilt slightly forward when posing for photos—something I’ll try to adjust in the future.

What I learned in the process:
This project taught me a lot—from building circuits based on my own design, to modifying Arduino code and making my idea come to life through interactive electronics.
It was a great opportunity to overcome my fear of circuitry and programming.
Now I feel much more confident about creating interactive and responsive objects in future design projects.

What I would do differently:
If I had more time, I would add more animated expressions to the screen.
Right now, Karen only has three facial states, but adding more—like a dramatic shift from a happy face to an angry red one, then transitioning into moving lines—could create a small visual “storyline.”
That would make the character’s expression and behavior even more alive and theatrical.

List (with links) of materials and parts used

1️⃣ BTF-LIGHTING WS2812B 16×16 RGB LED Matrix Panels (2 packs)
https://www.amazon.com/dp/B09XWQTZZN?ref=ppx_yo2ov_dt_b_fed_asin_title&th=1 (Wini Recomand)

2️⃣ Arduino Gemma Microcontroller Board

3️⃣ Push Button Switch

4️⃣ Black Translucent Acrylic Sheet (VFL)+ Black Silicone Sealant(Borrowed from Wini)
5️⃣ Foam Board

6️⃣ Silver Metallic Cardstock Paper (Bought from Blick)

7️⃣ Electrical Wires for Soldering

8️⃣ Portable Power Bank

Circuit diagram

A circuit diagram showing the connections for RGB LED matrix panels, a power bank, and a push button switch.

Arduino code

In-progress images/sketches

🙏 Special Thanks

Huge thanks to Wini — honestly, I couldn’t have even started this project without her. She helped me with everything — from figuring out the circuit wiring to writing and debugging the Arduino code. She was super patient and always there when I got stuck. I’m so, so grateful for all her help.
And also to Jay, who gave me tons of guidance with the circuit setup — your advice really made things a lot smoother.

Thank you both so much!

Mallika’s ‘Mine-crafted life’ Halloween Costume


The thought behind the project

The severed Minecraft head is a prop for a halloween costume, acting like a trick or treat basket. Constructed from acrylic/polyethylene/polypropylene sheets, the head is painted with the signature pixelated aesthetic and features internal RGBW LED strips inside the box. 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 prop’s intention is to blend the nostalgia of my brother and my shared love for Minecraft with a playful Halloween fright. By presenting the instantly recognizable Creeper head in a dark context—a “severed neck” basket—it introduces a darkly humorous twist on a beloved game element. The dynamic, shifting NeoPixel lights (from “angry” red to “sad” blue) use in-game visuals to create an eerie, mood-depicting glow, transforming our childhood interests into a uniquely personal and subtly unsettling costume piece.

Concept sketch

Materials & Parts

  • 1/4″ white translucent acrylic sheet – For the main structure, laser cut to make a 8×8″ cube. Purchased from the VFL.
  • (2) RGBW LED Neopixel Sticks – For the light source, I had one in my kit. Borrowed another one from Jay.
  • Adafruit Gemma M0For the code, already there in my kit.
  • Electrical wires – For the light source, already there in my kit.
  • USB Battery Pack – For the battery, already there in my kit.
  • Solder – For the light source, taken from the VFL.
  • Acrylic paint – For the tones in the light, to paint the pixels on the inside surface of the sheet.
  • Acrylic cementSolvent that helps join the acrylic together.
  • Paint brushes – To paint the pixels. Already had them, any paintbrushes work.
  • Hot glue gun – To glue the top and bottom to the acrylic box. Taken from PoD.
  • Foam board – To make the severed neck of the head. Already had some.
  • 2.5 mm wire – To make the handle, taken from the VFL.

TinkerCAD circuit

https://www.tinkercad.com/things/39yYl1YGqdN-halloween-tinkering

Code

Process

Soldering the physical circuit
Laser cutting the 1/4″ acrylic
Testing the translucency of light
Painting the face & pixels on acrylic
Painting the pixels on foam board
Assembly of the prop
Attaching the handle and testing the light

The completed ‘Mine-Crafted’ life prop


At the NYC Halloween Parade

My journey and experience

Crafting a Minecraft head costume with NeoPixel sticks illuminating it from within was honestly an ambitious but fun project. While the soldering proved to be a real challenge, trying to attach those tiny wires to the compact Gemma M0 board tested both my patience and my dexterity, the final result made it all worthwhile. Parading through the streets of NYC for the Halloween parade was an incredible cultural experience, with the energy of the crowd and the creativity on display making every frustrating moment at my workbench fade away. Looking back, if I were to build this prop again, I’d construct the top and bottom sections in acrylic as well, rather than just the sides, to achieve a fully translucent effect that would really let those NeoPixels shine through every surface and create an even more striking glow.

A special mention and big thank you to everyone, especially Becky, Josh, the entire VFL team, Rhea and Manya who helped me see this project through till the end, believing that I could execute it! Thank you to Becky and Smokey for accompanying my friends and I to the parade as well! Thank you for your support!



Jimmy’s Final Halloween Costume

The Plague Doctor

My Halloween costume is composed of three main parts: a 3D-printed white PLA crow mask, a black cape with a hood, and a set of three mechanical finger claws. The mask takes most of the technical work. I first used the Polycam app to scan my head and modeled the crow form around it so it would fit perfectly.

Each eye has a 12-pixel NeoPixel ring, friction-fit into an indent with wiring channels and openings for two frosted acrylic donut-shaped plates that diffuse the light. A small side button placed near my temple switches between two light patterns—a loading animation and a red glowing one.

All electronics sit inside the mask, with the wiring taped neatly along the inner surface. Felt pads and EVA foam along the edges add comfort where it touches the face, and an elastic headband—stitched through pre-modeled holes—keeps it secure. The circuit board itself is sewn to the back of the band, making everything self-contained.

The cape is store-bought, simple, and helps emphasize the mysterious silhouette of the mask.
The finger claws are fully mechanical: each uses a parallelogram linkage system that extends or retracts the claw as I curl and straighten my fingers, creating a kind of living, mechanical gesture.

Wearing it feels quite straightforward. The claws are pretty identical, so I marked them inside to avoid confusion when putting them on. The mask, however, demands more patience. Since the wiring runs along the same path as the elastic band, the band stretches but the wires don’t, which sometimes causes them to curl up or catch slightly in my hair. The visibility is also limited—mainly because the eye holes are thickened to fit both the LED rings and the acrylic diffusers—so it feels like looking through a narrow tunnel of light.

Through this project, I get to integrate electronics with 3D-printed structures for the first time—how to design around wires, embed boards, and plan assembly digitally before making it physical. I also learned about comfort, weight, and cable management that only appear when you actually wear what you’ve built. If I were to do it again, I would refine the eye geometry to widen the field of view and create more space between the LED ring and the acrylic to enhance the diffusion effect. I would also add more internal padding, especially near the forehead, to keep the wires from pressing awkwardly against the skin.

Material List

  1. 3D pRinter (https://us.store.bambulab.com/products/a1?from=navigation)
  2. PLA filament (https://us.store.bambulab.com/products/pla-matte)
  3. Neo-Pixel Ring *2 (https://www.adafruit.com/product/1643)
  4. Electrical Tape (https://www.amazon.com/Avery-Dennison-Electrical-Commercial-Insulating/dp/B0DQKJV3J4/ref=sr_1_1_sspa?crid=2EQY92WV5OXXZ&dib=eyJ2IjoiMSJ9.lNltt7cumfXsZCkJlMxFYYmx3VDRxwNZBWDZ6mlwLvOONifJA0cbp78rUD3IUGnUBvTgeALCPv1XYlRk49YMiQcDfasuAocTQKEx0ukAZe4KMaFOgrWSC-I5Hq4JO5K8iaXtCNuLT73f79heuIttAIeKtHWw0fzF2GeUK58IKy_nhB-tkTxc7c1VouFUgAj6QsIeQWvo1lfSxh4sSySpATnl2hiqPk1k5m_RY5Fg91ojRj3V-GyE6N9Kb6xyM4gzwqog3yt4mFePmF_iSGklsKl0BiICiTtYsUYw01d_A30.XL2Oq-d_vKzHNwKh_-I81-xds2quiTYmpFHD4Gb_WYk&dib_tag=se&keywords=electrical%2Btape&qid=1762299049&s=industrial&sprefix=electrical%2Btap%2Cindustrial%2C263&sr=1-1-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&th=1)
  5. Wires (https://www.amazon.com/TUOFENG-Hookup-Wires-6-Different-Colored/dp/B07TX6BX47/ref=sr_1_1?crid=KVXX8XCZZ5NZ&dib=eyJ2IjoiMSJ9.7QKOdOh0TX6RJzvhBg5Wt1hMobRmxA8YSVMtDCQYCIWI36E-BTkWi1kmCKoq1bvwgGOWhBP7xjQOfb1znb9dQG8fNdqo_7EdUEhqQcJYXGXaPngwFeiIRaaDJqGL22EBsCL5HPtJkmogqW8nxikbR8RWb2fhLNQ1Ed6hr-aQEMO7HF27m281Ci0bJsmk2aptTEuFhorgAikTcjRD_azFEjU_Q0_Pj-SqXF8GHJeWxYEaMiZGTUnc1Fjd2JtemYwE-XwELjimlfLSCtwjFk5NE44CRLG4MdSieIm3UtuSO4I.TIY2x1I6rTAkLZ9KPQinD521UtCnT1EoPmRl5swzVQ8&dib_tag=se&keywords=wire&qid=1762299071&s=industrial&sprefix=wi%2Cindustrial%2C355&sr=1-1&th=1)
  6. EVA Foam 4mm (https://www.amazon.com/Premium-Cosplay-Density-Projects-MEARCOOH/dp/B0BC8RN251/ref=sr_1_1_sspa?crid=OG4F3FRY7IT6&dib=eyJ2IjoiMSJ9.oPwXWY4rs4WfXiN6Et0T3JOS4TOqEbsVcFm2sRnqlYmqM5P59vwxAtHcVN488Osa8uvGeV5EbCFbyara6aSjwubKr3pnUazGggwwY1xf2cLWo2Uymwpj7HV4lIfwh0fLrTBF0TNdTa32R0av8xp_AX2_dvvUmE3kZpkZ4RjcI7se38bam_a-scvIHRL4ZtJSUJ_mfe9-8mNvsRj-DG6mw5x4uMSJ2D2KbgSxcKpQL9Ujy29yiW7jzMqWmgRTnrMKVB8rruPGn5h-4F3N8cUmgWDRETmiJsUgBhw-BaWLw6w.Uqkh7_Iq5tuSXMyyYD7P3O6MwU1GlZdZ–vCyWuuAQ8&dib_tag=se&keywords=eva%2Bfoam&qid=1762298981&s=industrial&sprefix=eva%2Bfoam%2Cindustrial%2C204&sr=1-1-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&th=1)
  7. Frosted Acrylic (https://www.amazon.com/dp/B07R9YJ29T?ref=ppx_yo2ov_dt_b_fed_asin_title)
  8. Cape (https://www.amazon.com/dp/B0DSRPDYDZ?ref=ppx_yo2ov_dt_b_fed_asin_title&th=1)
  9. GEMMA M0 (https://www.adafruit.com/product/3501)

Circuit Diagram

Arduino code

#include <Adafruit_NeoPixel.h>

// Pin definitions
#define BUTTON_PIN 0
#define RING1_PIN 1
#define RING2_PIN 2
#define NUM_LEDS 12

Adafruit_NeoPixel ring1 = Adafruit_NeoPixel(NUM_LEDS, RING1_PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel ring2 = Adafruit_NeoPixel(NUM_LEDS, RING2_PIN, NEO_GRB + NEO_KHZ800);

int currentMode = 0;
int buttonState = 0;
int lastButtonState = 0;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

int loadingPos = 0;
unsigned long lastLoadingUpdate = 0;
int loadingDelay = 100;

bool oddLedsOn = true;
unsigned long lastAlternateUpdate = 0;
int alternateDelay = 250;

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  
  ring1.begin();
  ring2.begin();
  ring1.show();
  ring2.show();
  ring1.setBrightness(50);
  ring2.setBrightness(50);
}

void loop() {
  handleButton();
  
  if (currentMode == 0) {
    loadingPattern();
  } else {
    alternatingRedPattern();
  }
}

void handleButton() {
  int reading = digitalRead(BUTTON_PIN);
  
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }
  
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
      
      if (buttonState == LOW) {
        currentMode = 1 - currentMode;
        
        clearRings();
      }
    }
  }
  
  lastButtonState = reading;
}

void loadingPattern() {
  if (millis() - lastLoadingUpdate > loadingDelay) {
    lastLoadingUpdate = millis();
    
    for (int i = 0; i < NUM_LEDS; i++) {
      if (i == loadingPos || i == (loadingPos + 1) % NUM_LEDS) {
        ring1.setPixelColor(i, ring1.Color(0, 0, 0));
      } else {
        ring1.setPixelColor(i, ring1.Color(255, 255, 255));
      }
    }
    
    for (int i = 0; i < NUM_LEDS; i++) {
      int mirrorPos = (NUM_LEDS - loadingPos) % NUM_LEDS;
      if (i == mirrorPos || i == (mirrorPos + 1) % NUM_LEDS) {
        ring2.setPixelColor(i, ring2.Color(0, 0, 0));
      } else {
        ring2.setPixelColor(i, ring2.Color(255, 255, 255)); 
      }
    }
    
    ring1.show();
    ring2.show();
    
    loadingPos = (loadingPos + 1) % NUM_LEDS;
  }
}

void alternatingRedPattern() {
  if (millis() - lastAlternateUpdate > alternateDelay) {
    lastAlternateUpdate = millis();
    
    oddLedsOn = !oddLedsOn;
    
    for (int i = 0; i < NUM_LEDS; i++) {
      if ((i % 2 == 0 && oddLedsOn) || (i % 2 == 1 && !oddLedsOn)) {
        ring1.setPixelColor(i, ring1.Color(255, 0, 0));
        ring2.setPixelColor(i, ring2.Color(255, 0, 0));
      } else {
        ring1.setPixelColor(i, ring1.Color(0, 0, 0));
        ring2.setPixelColor(i, ring2.Color(0, 0, 0));
      }
    }
    
    ring1.show();
    ring2.show();
  }
}

void clearRings() {
  for (int i = 0; i < NUM_LEDS; i++) {
    ring1.setPixelColor(i, ring1.Color(0, 0, 0));
    ring2.setPixelColor(i, ring2.Color(0, 0, 0));
  }
  ring1.show();
  ring2.show();
}