

About The Costume
Team Fairy made LED light-up wings from scratch. We used a variety of materials to create iridescent and beautiful wings representing three different elements: earth, wind, and fire. We chose colors that represented these elements and consistently used them in both the wings and the rest of our costumes. Cyntia is earth and chose green and yellow for her palette. Sama is wind and chose blue and white. Prerna is fire and chose to go with the colors red, orange, and yellow.

Why we made it + how it is to wear it
We made these because we were looking for inspiration on Pinterest and were inspired by all the pretty wing shapes and designs and decided to try our hand at it. Wearing them was actually pretty comfortable but because they were wide we ran into some trouble of knocking into people and things. The crab walk was our friend especially at the halloween parade.
Learnings from the process + what would I do differently
Sama
The most tiring and nerve wracking part of this process was the soldering of the LEDs. I was a solder monkey for about 5 hours soldering all of the joints. I think if I could do it differently I wouldn’t cut my strip so many times to make the soldering easier and more feasible. The most fun part was sketching and designing the wings. Surprisingly, one super time consuming part was wiring and taping the wings to give them more strength. Overall, this process was a lot more complex than I thought it would be going into it, but I’m really proud of the results and enjoyed walking in the parade!
Designing the wings



Soldering the LEDs, wiring and taping wings


Cellophane!


The results


Prerna
The process that took the most amount of time for me was the soldering but the most frustrating was understanding the code. I had a tough time figuring out how to translate what I wanted the lights to do in a language that the Gemma would understand but working with my team really helped.
My strengths lay in the physical making of the project. I really enjoyed designing the shapes of the wings, cutting them out, figuring out how to make them strong and how to attach everything together. Even though the soldering took a while and I had some issues with my connections (due to the LED pointing in the wrong direction) I did really enjoy the whole process.
If I were to do this project again, I would add more a few more LED strips and make the brightness a bit higher.



Cutting out the wings, deciding placements of lights and wiring.


Gluing the cellophane layers with spray adhesive.

Adjusting placement and height of wings.


I am really happy with how the wings turned out! The cellophane reacts really well to the light and also helps with the diffusion.
Cyntia
Creating this costume was more complex than we thought but the most exhausted and frustrating part for me was the soldering. I redid the circuit 3 times and I had a really bad time doing it, but as happens in life, it was part of the process. At the end of the day, the lights turned on and I loved the result and how the green color matched with the cellophane.
Sketching my wings was my favorite part. I tried to create a pattern of leafs as a symbol of Earth.



Designing my wings and wiring them

Circuit working

Materials List
- Wire (from Blick)
- White Duct Tape (Blick)
- Clear tape (Michaels)
- Strip LEDs ( https://www.amazon.com/dp/B01N49DSC1?psc=1&ref=ppx_yo2ov_dt_b_product_details)
- Arduino Gemma
- Cellophane (Blick and online)
- Ribbon (Michaels)
- Power Bank
- Butterfly clips and paste on jewels (Amazon)
Circuit diagram

Arduino code
Sama
// NeoPixel test program showing use of the WHITE channel for RGBW
// pixels only (won't look correct on regular RGB NeoPixel strips).
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1:
#define LED_PIN 1
// How many NeoPixels are attached to the Arduino?
#define LED_COUNT 48
// NeoPixel brightness, 0 (min) to 255 (max)
#define BRIGHTNESS 20 // Set BRIGHTNESS to about 1/5 (max = 255)
// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRBW + 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)
void setup() {
// These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
// Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
// END of Trinket-specific code.
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
strip.show(); // Turn OFF all pixels ASAP
strip.setBrightness(BRIGHTNESS);
}
void loop() {
//fadeFire(50);
fadeWind(50);
//fadeEarth(50);
}
// ------ Wind ---------------------------------------
// colorWipe(strip.Color(0, 0, 0, 255) ,50); //White
// colorWipe(strip.Color(0, 255, 216, 0) ,50); // Teal
// colorWipe(strip.Color(90, 0, 255, 0) ,50); //Indigo
// colorWipe(strip.Color(0, 0, 255, 0) ,50); //Blue
void fadeWind(int wait) {
// Fade from White (0, 0, 0, 255) to Teal (0, 255, 216, 0)
for (int fadeValue = 0; fadeValue <=216; fadeValue += 100) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, strip.Color(0,fadeValue, fadeValue, 255)); //use two fadeValues to add both green + blue = teal
// Final Color (0, 216, 216, 255)
strip.show();
delay(50);
}
strip.show();
delay(50);
}
// Add blue 216 -> 255
for (int fadeValue = 216; fadeValue <=255; fadeValue += 100) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, strip.Color(0,216, fadeValue, 255)); //add to 255 of blue
// Final Color (0, 216, 255, 255)
strip.show();
delay(50);
}
strip.show();
delay(50);
}
// Fade from teal/blue(0, 216, 255, 255) to Blue (0, 0, 255, 0)
for (int fadeValue = 255; fadeValue>=0; fadeValue -= 100) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, strip.Color(0, fadeValue, 255, fadeValue)); //fading green and white out to get blue
// Final Color (0, 0, 255, 0)
strip.show();
delay(50);
}
strip.show();
delay(50);
}
// Fade from Blue (0, 0, 255, 0) to White (0, 0, 0, 255)
for (int fadeValue = 0; fadeValue <=255; fadeValue += 100) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, strip.Color(0,0, 255, fadeValue)); //increment white up
// Final Color (0, 0, 255, 255)
strip.show();
delay(50);
}
strip.show();
delay(50);
}
// Fade out blue and keep white
for (int fadeValue = 255; fadeValue>=0; fadeValue -= 100) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, strip.Color(0,0, fadeValue, 255)); //increment blue down to leave only white
// Final Color (0, 0, 0, 255)
strip.show();
delay(50);
}
strip.show();
delay(50);
}
// // Fade from no color to White (0, 0, 0, 255)
// for (int fadeValue = 0; fadeValue <=255; fadeValue += 5) {
// for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
// strip.setPixelColor(i, strip.Color(0, 0, 0, fadeValue)); //fades up white only
// Final Color (0, 0, 0, 255)
// strip.show();
// delay(50);
// }
// strip.show();
// delay(50);
// }
}
// ------------------------------- Original function ------------------------
//--- Original Function Call (Void Loop) -----
// Fill along the length of the strip in various colors...
//colorWipe(strip.Color(0, 255, 0) , 50);
// colorWipe(strip.Color (0, 255, 44) , 50);
// colorWipe(strip.Color(174, 255, 0) , 50);
// colorWipe(strip.Color(255, 216, 0, 0) ,50);
void colorWipe(uint32_t color, int wait) {
int i = 0;
int fadeValue = 0;
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
}
for (int fadeValue = 0; fadeValue <=255; fadeValue += 5) {
strip.setPixelColor(i, strip.Color(255, 0, fadeValue));
delay(30);
}
}
Prerna
// NeoPixel test program showing use of the WHITE channel for RGB
// pixels only (won’t look correct on regular RGB NeoPixel strips).
#include <Adafruit_NeoPixel.h>
#ifdef _AVR_
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1:
#define LED_PIN 1
// How many NeoPixels are attached to the Arduino?
#define LED_COUNT 100
// NeoPixel brightness, 0 (min) to 255 (max)
#define BRIGHTNESS 20 // Set BRIGHTNESS to about 1/5 (max = 255)
// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRBW + 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)
void setup() {
// These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
// Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
// END of Trinket-specific code.
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
strip.show(); // Turn OFF all pixels ASAP
strip.setBrightness(BRIGHTNESS);
Serial.begin(9600);
}
void loop() {
fadeFire(50);
// Fill along the length of the strip in various colors...
//colorWipe(strip.Color(0, 255, 0) , 50);
// colorWipe(strip.Color (0, 255, 44) , 50);
// colorWipe(strip.Color(174, 255, 0) , 50);
// colorWipe(strip.Color(255, 216, 0, 0) ,50);
}
// ------ Fire ---------------------------------------
// colorWipe(strip.Color(255, 255, 0) ,50); //Yellow
// colorWipe(strip.Color(255, 50, 0) ,50); //Orange
// colorWipe(strip.Color(255, 0, 0) ,50); //Red
void fadeFire(int wait) {
//from red (255, 0, 0) to orange (255, 50, 0)
for (int fadeValue = 0; fadeValue <=50; fadeValue += 100) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, strip.Color(255, fadeValue, 0)); // Set pixel’s color (in RAM)
// Serial.print("red= 255 green= ");
// Serial.print(fadeValue);
// Serial.println(" blue= 0");
strip.show(); // Update strip to match
delay(50);
}
}
strip.show(); // Update strip to match
delay(50);
//from orange (255, 50, 0) to yellow (255, 100, 0)
for (int fadeValue = 50; fadeValue <=100; fadeValue += 100) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, strip.Color(255,fadeValue, 0)); // Set pixel’s color (in RAM)
// Final color (255, 100, 0)
Serial.print("orange to yellow! red= 255 green= ");
Serial.print(fadeValue);
Serial.println(" blue= 0");
strip.show(); // Update strip to match
delay(10);
}
}
strip.show(); // Update strip to match
delay(10);
//from yellow (255, 100, 0) to orange (255, 50, 0)
for (int fadeValue = 100; fadeValue >=50; fadeValue -= 100) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, strip.Color(255,fadeValue, 0)); // Set pixel’s color (in RAM)
// // Final color (255, 50, 0)
strip.show(); // Update strip to match
delay(50);
}
}
strip.show(); // Update strip to match
delay(50);
//from orange (255, 50, 0) to red (255, 0, 0)
for (int fadeValue = 50; fadeValue>=0 ; fadeValue -= 100) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, strip.Color(255,fadeValue, 0)); // Set pixel’s color (in RAM)
// // Final color (255, 0, 0)
strip.show(); // Update strip to match
delay(50);
}
}
strip.show(); // Update strip to match
delay(50);
}
// //from red to orange
// for (int fadeValue = 255; fadeValue>=0; fadeValue += 5) {
// for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
// strip.setPixelColor(i, strip.Color(255,fadeValue, 0)); // Set pixel’s color (in RAM)
// // // Final color (255, 100, 0)
// Serial.print("red to orange! red= 255 green= ");
// Serial.print(fadeValue);
// Serial.println(" blue= 0");
// strip.show(); // Update strip to match
// delay(50);
// }
// }
// strip.show(); // Update strip to match
// delay(50);
// }
Cyntia
// NeoPixel test program showing use of the WHITE channel for RGBW
// pixels only (won’t look correct on regular RGB NeoPixel strips).
#include <Adafruit_NeoPixel.h>
#ifdef _AVR_
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1:
#define LED_PIN 1
// How many NeoPixels are attached to the Arduino?
#define LED_COUNT 8
// NeoPixel brightness, 0 (min) to 255 (max)
#define BRIGHTNESS 20 // Set BRIGHTNESS to about 1/5 (max = 255)
// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_RGB + 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)
void setup() {
// These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
// Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
// END of Trinket-specific code.
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
strip.show(); // Turn OFF all pixels ASAP
strip.setBrightness(BRIGHTNESS);
}
void loop() {
fadeEarth(50);
// Fill along the length of the strip in various colors...
//colorWipe(strip.Color(0, 255, 0) , 50);
// colorWipe(strip.Color (0, 255, 44) , 50);
// colorWipe(strip.Color(174, 255, 0) , 50);
// colorWipe(strip.Color(255, 216, 0, 0) ,50);
}
// ------ Wind ---------------------------------------
// colorWipe(strip.Color(0, 240,0); //Green
// colorWipe(strip.Color(0, 240, 55); //Green blue
// colorWipe(strip.Color(55, 240, 55); //Forest
// colorWipe(strip.Color(140, 240, 159); //Pistacchio
// colorWipe(strip.Color(140, 240, 0); //yellow green
void fadeEarth(int wait) {
for (int fadeValue = 0; fadeValue <=55; fadeValue += 5) {
// Fade from green to green blue
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, strip.Color(0, 240, fadeValue));
strip.show();
delay(50);
}
}
strip.show(); // Update strip to match
delay(50);
// Fade from green blue to forest
for (int fadeValue =0 ; fadeValue<=54; fadeValue += 5) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, strip.Color(fadeValue,240, 55)); // Set pixel’s color (in RAM)
// Pause for a moment
strip.show(); // Update strip to match
delay(50);
}
}
strip.show(); // Update strip to match
delay(50);
// Fade from forest to pistacchio
for (int fadeValue = 0; fadeValue<=55; fadeValue += 5) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, strip.Color(fadeValue,240, 55)); // Set pixel’s color (in RAM)
// Pause for a moment
strip.show(); // Update strip to match
delay(50);
}
}
strip.show(); // Update strip to match
delay(50);
// Fade from forest to pistacchio
for (int fadeValue = 55; fadeValue<=150; fadeValue += 5) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, strip.Color(fadeValue,240, fadeValue)); // Set pixel’s color (in RAM)
// Pause for a moment
strip.show(); // Update strip to match
delay(50);
}
}
strip.show(); // Update strip to match
delay(50);
// Fade from pistacchio to yellow green
for (int fadeValue = 150; fadeValue>=0; fadeValue -= 5) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, strip.Color(150, 240, fadeValue)); // Set pixel’s color (in RAM)
// Pause for a moment
strip.show(); // Update strip to match
delay(50);
}
}
strip.show(); // Update strip to match
delay(50);
}