Overview

Ring in the new year or any cause for celebration with your own NeoPixel glasses!

For this project you will need:

If you can glue the NeoPixel rings to the frames without covering the connections on the PCB, go for it. This will make it easier to make tidy wire connections. Hot glue is ok for now, but if you can permanantly affix them with E6000 or epoxy, go for it. Invest in a sturdy platform that won't fall apart during the subsequent steps.

Circuit Diagram

You can create a design by chaining NeoPixel rings, sticks, strips, and jewels to your heart's content. These party glasses use two 24x NeoPixel rings and two NeoPixel sticks. For a more basic design, follow the NeoPixel Goggle diagram.

Wire connections are as follows (click to enlarge diagram):

  • Trinket BAT+ to NeoPixel stick 4-7VDC or NeoPixel ring PWR
  • Trinket Gnd to NeoPixel stick GND
  • Trinket #1 to NeoPixel stick DIN
  • NeoPixel stick DOUT to NeoPixel ring IN
  • NeoPixel ring OUT to second NeoPixel ring IN
  • NeoPixel ring G to second NeoPixel ring G
  • NeoPixel ring PWR to second NeoPixel ring PWR
  • second NeoPixel ring OUT to second NeoPixel stick DIN
  • second NeoPixel ring G to second NeoPixel stick GND
  • second NeoPixel ring PWR to second NeoPixel stick 4-7VDC
  • second NeoPixel stick 4-7VDC to battery connector +
  • second NeoPixel stick GND to battery connector -

You may optionally connect a switch that interrupts power either on the Trinket side or battery side of the glasses.

Assemble Circuit

Carefully prep NeoPixel sticks by soldering small lengths of wires to the circuit board pads, which will be covered when you glue the stick to the sides of your glasses frames. Use hot glue to do that now, too.

Do not use permanent adhesive on your NeoPixel sticks yet, just in case you need to pop one off to troubleshoot your circuit in the next step.

Trim wires to length and carefully solder wires to NeoPixel ring connections as illustrated in the circuit diagram.

The trick to this project is tidy wiring, so really take your time to route the wires carefully, then strip, twist, and tin the ends before soldering.

Solder wire connections to a battery connector at the end of the NeoPixel chain (from above, the battery connector ground is on the left).

Use hot glue to temporarily affix the battery connector to the frames.

On the other end of the circuit, hot glue Trinket in place and make wire connections as per the circuit diagram.

Trim excess wire leads and check over circuit for completeness and quality. Clean up your work surface so there aren't bits of wire all over.

Test and Glue

Plug in your Trinket over USB and load the code below. Check out the Introducing Trinket guide for more info.

Download: file
#include <Adafruit_NeoPixel.h>

#define PIN 1

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 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)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(64, PIN, NEO_GRB + NEO_KHZ800);

// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.

void setup() {
  strip.begin();
  strip.setBrightness(40); //adjust brightness here
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  // Some example procedures showing how to display to the pixels:
  //colorWipe(strip.Color(255, 0, 0), 50); // Red
  //colorWipe(strip.Color(0, 255, 0), 50); // Green
  //colorWipe(strip.Color(0, 0, 255), 50); // Blue
  // Send a theater pixel chase in...
  theaterChase(strip.Color(127, 127, 127), 50); // White
  theaterChase(strip.Color(127,   0,   0), 50); // Red
  theaterChase(strip.Color(  0,   0, 127), 50); // Blue

  //rainbow(20);
  //rainbowCycle(20);
  theaterChaseRainbow(50);
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
  }
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();
     
      delay(wait);
     
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
        }
        strip.show();
       
        delay(wait);
       
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, 0);        //turn every third pixel off
        }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
   WheelPos -= 170;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

The pixels are only wired to Trinket's battery power, to they won't light up yet.

Unplug the USB cable, then connect your battery (and switch it on if applicable). If they don't , disconnect the battery and double check your wiring. It's easy to flip a NeoPixel stick around backwards or make other mistakes.

Also double check your code is sending data to the same pin connecting your NeoPixels' data!

The battery we recommend goes with the code above, which animates the NeoPixels-- only some are on at any given time and we've limited the brightness. Modifying these parameters may significantly alter battery life.

Once all your NeoPixels are working it's time to add more permanant adhesive. I like E6000 for this because it dries clear and flexible, not brittle like super glue or epoxy. Glue up the rings, sticks, wires, Trinket and battery connector and let cure for 24 hours before wearing.

Use gaffer tape to reinforce where the wires meet the lipoly cell. Contine to wrap the battery in tape, affixing a hair clip while you're at it.

This alternate design uses the same circuit as the NeoPixel ring goggles

Wear 'em!

Clip the battery in your hair and wear your fab new specs! They're not waterproof so stay away from the pool and power down if it starts raining.

Now it's your turn to make these glasses your own! Would you add a temperature sensor, realtime clock for counting down to midnight, or accelerometer to control the animations? Try it out and share your project on our weekly G+ Hangout Show and Tell. Happy new year!

This guide was first published on Jan 07, 2015. It was last updated on Jan 07, 2015.