Segmenting the Neopixel strandtest

Hi all,

I’ve been handed a Mega 2560, a meter strip of neopixels from sparkfun, and asked to do something interesting with the NeoPixel_Library strandtest.

We are testing a system intended to be used under the lips of a flight of 8 steps. I’ve read many forum posts on the topic. I have an idea, but the testing phase raises a few problems.

I’ve isolated the portion of the strandtest that I’m being asked to work with. Specifically, the RainbowCycle. I’ve commented out everything but the RainbowCycle. The goal is to have each step run the RainbowCycle in “steps” so to speak. While the first step is red, the second step is purple, the third step is blue, and so on. All 8 steps are cycling at the same rate, but on different points of the spectrum. Specifically, we would like to be able to control the color “step” of each neopixel strip by a fraction of the 256 colors available (One step is on 8, the next 16, the following 24, etc.).

Eventually we will have 8 strands of neopixels on 8 PWM pins. Right now I have one meter of 60 pixels, which I would like to address as 8 segments of 7 pixels each (leaving the last four pixels off). This is so that we can create a color pattern now, inside, before we have all of the strips cut and placed.

Essentially I would like some direction on how to address multiple RainbowCycles at once, on different timings. For now, I’d like to do this in one strand.

Can I isolate 7 pixel segments via some variation of the code I found in a FastLED library?

void loop() {
   leds[0] =

I wasn’t able to make that reference more than one pixel at a time, and I don’t know if I can add a function after it.

I’ve done a lot of forum/Google searching. I also have some reference books available. But if someone would be willing to point me in a more specific direction of where to research what I’m doing in addressing NeoPixels in this way, I’d greatly appreciate it.

Thanks!

This is what I’ve done to the strandtest to isolate the part of the strandtest I want, if it helps:

#include <Adafruit_NeoPixel.h>
#include <avr/power.h>

#define PIN 6

// 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(60, 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.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) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else if(WheelPos < 170) {
    WheelPos -= 85;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  } else {
   WheelPos -= 170;
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
}

Read the adafruit guide on Neopixels, should make most of your wiring issues trivial.

Edit: https://learn.adafruit.com/adafruit-neopixel-uberguide

Then you can just create each strip in the code (strip1, strip2, strip3, etc).

Looks like if you stagger the value of j in rainbowCycle, you can start anywhere you want in the loop.