Arduino NeoPixels

Crickit makes it really easy to add NeoPixels (WS2812/WS2811/SK6812 chipsets) to your project. The Crickit has a 3-terminal block connector with GroundSignal and 5V power. The signal line has a level shifter on it so it will be 5V logic level, for nice clean signals.

This output is slightly different depending on what kind of Crickit you have.

Crickit for Circuit Playground Express

If you have a Circuit Playground Crickit then the NeoPixels are driven by the Circuit Playground A1 pad by default. 

 

Use the Adafruit_NeoPixel library to control NeoPixels connected to Crickit through Circuit Playground Express pin A1.

 

However, if you want, you can cut the jumper underneath the Crickit and solder closed the ss pad so that the seesaw chip controls the NeoPixels (for advanced hackers only). See below for use.

Crickit Wing for Feather

If you have a Feather Crickit then the NeoPixels are driven by the seesaw chip on the Crickit, and you must send seesaw commands to set colors. But that means no extra pins are needed from your Feather. See below for use.

Crickit for micro:bit

If you have a micro:bit Crickit, NeoPixels are driven by micro:bit Pin P16

 

Use the Adafruit_NeoPixel library to control NeoPixels connected to Crickit through micro:bit P16.

 

However, if you want, you can cut the jumper underneath the Crickit and solder closed the ss pad so that the seesaw chip controls the NeoPixels (for advanced hackers only). See below.

Crickit HAT for Raspberry Pi

Advanced Use - Using Seesaw to Control NeoPixels

Your microcontroller can communicate to the Crickit seesaw chip to have seesaw control the NeoPixels. Adafruit considers this advanced use at the Arduino level and recommends MakeCode or CircuitPython for Crickit NeoPixel. With this in mind, read on.

If you choose to have the NeoPixel driven from the seesaw, note it is on seesaw pin #20. To use seesaw pin 20 on Circuit Playground Express and micro:bit Crickit, you must cut a jumper on the Crickit circuit board on the back. You can always mend this with solder, but it's NOT something you change back and forth.

For FeatherWing for Crickit, the NeoPixels are already connected to seesaw pin 20, you don't need to do the surgery below.

Turn the Crickit over and locate the jumper block on the bottom as circled in yellow in the first image.

 

You will need to take a knife and cut the tiny gold trace pointed by the red arrow to sever the current NeoPixel to microcontroller connection.

 

Using a soldering iron, put a mice bright solder connection between the pads as marked by the blue arrow.

 

The Seesaw Pin 20 is now connected to the NeoPixel connections on Crickit.

The Adafruit_seesaw library has seesaw NeoPixel support. You can get the latest version of this library through the Arduino board manager as described in this guide on the Arduino page.

Your Arduino sketch should include seesaw_neopixel.h which provides the NeoPixel functions for seesaw.

The following example sets up a strand of NeoPixels and runs through some animations.

#include <seesaw_neopixel.h>
#define PIN 10

// 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)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
seesaw_NeoPixel strip = seesaw_NeoPixel(12, 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() {
  Serial.begin(115200);

  if(!strip.begin()){
    Serial.println("ERROR");
    while(1);
  }
  Serial.println("seesaw started!");
  
  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
//colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW
  // 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 (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t 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 (uint16_t 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 (uint16_t 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) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
This guide was first published on May 16, 2018. It was last updated on May 16, 2018. This page (Arduino NeoPixels) was last updated on Jun 25, 2019.