Neopixel help

Ok, need some help here. I have very limited skills programming so take that into consideration.
I have no experience with addressable LEDs either.
I’m going to be using WS2812B RGB strip LEDS. Don’t have exact numbers yet but let’s say 300 RGB LEDs.
I need 4 modes. Ideally one micro switch would toggle through the 4 modes, 5th being off.
Mode 1: All Blue
Mode 2: All Red
Mode 3: Specific groups of LEDs in Blue (for example LEDS 10 – 20, 30 -40, 70-80, etc.…) Mode 3 and 4 will have some common sections.
Mode 4: Another specific group of Blue LEDs. (for example LEDS 10 – 20, 30 -40, 70-80, etc.…) Mode 3 and 4 will have some common sections.
Mode 5: Off
Repeat…

I have looked at the buttoncycler sketch from the Neopixel library, but I need the ability to define sections of LEDS for each particular mode.
For example, LEDS 10 – 20, 30 -40, 70-80 All blue, others being off. I don’t require any effects, just solid colors, noted above.
I think the buttoncycler sketch gets me close. I have been researching but cannot find clear enough instructions ( for me anyway).
Any help with this would be greatly appreciated.

Thanks….

Dan

Basically all you do is load the array in memory with the colours/brightness.
Once the array is loaded you update the the display.
Not that difficult.
.

Thanks for the reply.
I'm sure it's not very difficult for most, but as someone
just starting out, your response isn't very Informative.
I'll just keep digging.
Thanks for your time.

Read this:

.

All you need to learn is how to set values in your pixel array.
For that learn to do a for(){} loop and have the index point to a word in the array.

void mode3(uint16_t wait)
{
     uint32_t colorBlue = strip.Color(0, 0, 255);
     uint32_t colorRed = strip.Color(255, 0, 0);

      for (int i=0; i < 10; i++) {
        strip.setPixelColor(i, colorBlue);
      }
      for (int i=10; i < 20; i++) {
        strip.setPixelColor(i, colorRed);
      }
      strip.show();
     delay(wait);
}

sonyhome

Thanks for that response. It definitely clarified some things.
The code below is what I have stumbled through so far. I modified the Neopixel buttoncycler sketch
to get me partially what I need. What it does is cycle through 4 modes (case) then the 5th button press is off. I disabled the other unneeded features of the sketch. I left them in the code for reference.
Where im at a stopping point is getting each mode (case) to stop the scrolling color change
and just all light up. Right now it scrolls until all on.

2nd issue: Instead of all lighting up, I need just certain pixels to light in modes 3 and 4. That is where your (sonyhome) code clarifies some things. How do I integrate that into mode 3 and 4?

Thanks...

// This is a demonstration on how to use an input device to trigger changes on your neo pixels.
// You should wire a momentary push button to connect from ground to a digital IO pin.  When you
// press the button it will change to a new pixel animation.  Note that you need to press the
// button once to start the first animation!

#include <Adafruit_NeoPixel.h>

#define BUTTON_PIN   2    // Digital IO pin connected to the button.  This will be
                          // driven with a pull-up resistor so the switch should
                          // pull the pin to ground momentarily.  On a high -> low
                          // transition the button press logic will execute.

#define PIXEL_PIN    6    // Digital IO pin connected to the NeoPixels.

#define PIXEL_COUNT 12

// Parameter 1 = number of pixels in strip,  neopixel stick has 8
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_RGB     Pixels are wired for RGB bitstream
//   NEO_GRB     Pixels are wired for GRB bitstream, correct for neopixel stick
//   NEO_KHZ400  400 KHz bitstream (e.g. FLORA pixels)
//   NEO_KHZ800  800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

bool oldState = HIGH;
int showType = 0;

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  // Get current button state.
  bool newState = digitalRead(BUTTON_PIN);

  // Check if state changed from high to low (button press).
  if (newState == LOW && oldState == HIGH) {
    // Short delay to debounce button.
    delay(20);
    // Check if button is still low after debounce.
    newState = digitalRead(BUTTON_PIN);
    if (newState == LOW) {
      showType++;
      if (showType > 4)
        showType=0;
      startShow(showType);
    }
  }

  // Set the last button state to the old state.
  oldState = newState;
}

void startShow(int i) {
  switch(i){
    case 0: setPixelColor(strip.Color(0, 0, 0), 50);    // Black/off
            break;
    case 1: setPixelColor(strip.Color(255, 0, 0), 50);  // Red
            break;
    case 2: setPixelColor(strip.Color(0, 255, 0), 50);  // Green
            break;
    case 3: setPixelColor(strip.Color(0, 0, 255), 50);  // Blue
            break;
    case 4: setPixelColor(strip.Color(0, 150, 150), 50);  //cyan
            break;
   // case 5: theaterChase(strip.Color(127,   0,   0), 50); // Red
            break;
   // case 6: theaterChase(strip.Color(  0,   0, 127), 50); // Blue
            break;
    //case 7: rainbow(20);
            break;
   // case 8: rainbowCycle(20);
            break;
    //case 9: theaterChaseRainbow(50);
            break;
  }
}

// Fill the dots one after the other with a color
void setPixelColor(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);
  }
  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);
}
  • I recommend separating the debounce code in a function that returns true if the button was pressed, false otherwise.

*add a function for your different modes, including the ones that will set some pixels one color, and others another.

  • coding style don't omit the { } in if statements, it's a frequent source of bugs.

  • You can delete all the unused functions and the case statements past 5 since you don't go apst.