Team Fairy: Earth, Wind, & Fire

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

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);
}
%d bloggers like this: