In turn, Adafruit's NeoPixels are based on the WS2812 integrated light source from Worldsemi. This is an incredible little device that is only 5x5 mm square (and about 1 mm thick). Each WS2812 includes a tiny constant-current driver chip, along with three incredibly bright red, green, and blue (RGB) LEDs.

One area of potential confusion is that you sometimes hear people saying WS2811 or WS2812 when referring to these elements. In fact, WS2811 refers to the driver chip, while WS2812 refers to the larger package containing the WS2811 driver chip along with the RGB LEDs.

The great thing about these devices is that they can be daisy chained together, and the entire chain can be controlled using a single digital output pin on your microcontroller. Each WS2812 has four terminals: 5 V (power), 0 V (ground), data in, and data out. When you use your MCU to output a stream of data to the chain, each WS2811 accepts the first 24 bits it sees (eight bits for each RGB color channel) and then buffers and retransmits the remainder of the data stream to the next WS2811 in the chain.

Now, one of the things I really like about the NeoPixels from Adafruit is that they come equipped with an Arduino library and some really easy-to-use examples. You can literally be up and running within a couple of minutes. Let's use some simple pseudo-code examples. First, we instantiate a chain of NeoPixels:

NeoPixel myChain = NeoPixel(60, 6);

In this example, the first parameter (60) is the number of pixels we have in our chain. The second parameter (6) is the digital I/O pin we wish to use to drive the chain. If we wish to set the color values associated with one of the pixels in the chain, we might use a function call like the following:

myChain.setPixelColor(i, c);

In this case, the first parameter ('i') is an integer between 0 and 59 that specifies the pixel of interest. The second parameter ('c') is a 24-bit value comprising three eight-bit fields to define the RGB values to be associated with this pixel.

Of course, we could use loops and other control structures to specify the values of multiple pixels. The important thing to note here is that the "setPixelColor()" function doesn't actually modify the physical pixels. When we originally instantiated myChain, we created an array of 60x24-bit elements in the Arduino's memory. When we use the "setPixelColor()" function, all this does is change a value in the memory array. When we are ready to rock and roll, we use the "show()" function as follows:

myChain.show();

One other thing I really like is the fact that Adafruit's NeoPixel library allows you to instantiate multiple chains. Suppose I decided to use eight chains, each containing 60 pixels. A pseudo-code version of this might be as follows:

Now, I love working with NeoPixels, but there are some downsides. For example, the timing requirements to upload data to a NeoPixel chain are so stringent that Adafruit implemented things using assembly code that runs only on 16MHz Arduino Unos and Megas, both of which are eight-bit machines.

Another small gotcha is that, when you call the "show()" function, it disables the Arduino's interrupts. The CPU is totally dedicated to outputting the data to the chain. Now, suppose we have instantiated multiple chains as shown above. Consider what happens if we do the following:

myChain0.show();
myChain1.show();
myChain2.show();
:

Though this might be advantageous for organizing, visualizing, and controlling a display, it doesn't confer any speed advantages. Each chain is processed one after the other. Apart from anything else, this might result in some unwanted visual artifacts if we are driving long pixel chains.

@perl_geek: Right. I'm still not sure if I have the comment threading here figured out yet.

Some people use th ethreded view for comments, in which case it's easy to see ho wone comment relates to another.

I personally use the "Latest on top" view because I bounce back and forth between so many columns. That's why I reference who I'm answering (e.g., "@perl_geek") and also add a relevant sinppet of their text in italics (e.g., "Right. I'm still not sure if I have the comment threading here figured out yet.") because that way we all know who is saying waht to whom LOL

While the numbers have gone down since the boom of the 1980s and 1990s, I think 1 out of 10 of "us" work in tech. I certainly have never felt alone. Underrepresented perhaps, but never alone.

Then again I am more of a "backroom" engineer, preferring some anonymity. As long as the work gets done, it does not matter who does it. Too much emphasis in modern society is made about winning the lottery, which does not do well for producing good role models.

@Anand: I think the way she handled herself in a male dominated industry is fabulous. Not only did she look after herself but also set even standards, as well as became a role model for other women to read her up and follow her footsteps.

I think the way she handled herself in a male dominated industry is fabulous. Not only did she look after herself but also set even standards, as well as became a role model for other women to read her up and follow her footsteps. Having said that, I think it was a right move to venture into making a new company, because right now the electronics volume is huge in the world, and new companies are sprouting up every day making promises of being better by the minute. So not only is there a healthy competition, there's also a way to market sales through the many faces of social networking and whatnot.

@DrFPGA: If you could find a convenient place to store and share your projects that would allow the rest of us to take your designs and customize them ourselves. Any ideas?

Sure -- when I've got everything up and running for a particular project, I'll post all of the hardware and software design files associated with that project so that anyone can download them and play with them.