addressing LED's with push button for Interactive neopixel project for my kids

Hello,
I am new to Arduino and writing code. My background is in machine maintenance and little PLC work.
Here is what I am trying to create.
I am trying to create an interactive nanoleaf for my kids. I want my kids to be able to push on the cover of a hexagon panel, which will push a button to change the colors of the LEDS inside that hexagon panel. I want the hexagons to work independent from each other but have the same program. I was also trying to use the same data pin for each hexagon, so I don't have to wire each hexagon with two outputs (one for the push button and a second for the data). Right now, I am only using two hexagon panels to work on the code but going to have 8 by the time I am completed with the project.
what I am having a hard time with.
I would like to know how to address the pushbutton with the LED's that at just inside the panel. Currently my second push button doesn't work independently for the first and they work more in series with each other. Also, when working with the LEDS I seem to be able to only address all or I can set it up to work with the first 34 LED’s in the first hexagon or the second set of LEDs in the second hexagon.
I am currently using a neopixel file because that is how I was able to get close to what I am trying to accomplish. I wasn't able to use the same line of commands with the fasLED file to get as far as I am with the neopixel. (I understand that is because of me not knowing how to write code and not the FastLED file itself)
Any help on this is greatly appreciated

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif


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




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


#define PIXEL_COUNT 68// Number of NeoPixels






// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
// Argument 1 = Number of pixels in NeoPixel strip
// Argument 2 = Arduino pin number (most are valid)
// Argument 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)


boolean oldState = HIGH;
boolean oState = HIGH;
int     mode     = 0;    // Currently-active animation mode, 0-9


void setup() {
  pinMode(BUTTON1_PIN, INPUT_PULLUP);
  pinMode(BUTTON2_PIN, INPUT_PULLUP);
 
  strip.begin(); // Initialize NeoPixel strip object (REQUIRED)
  strip.show();  // Initialize all pixels to 'off'
}


void loop() {
  // Get current button state.
  boolean newState = digitalRead(BUTTON1_PIN);
  boolean nState = digitalRead(BUTTON2_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(BUTTON1_PIN);
    if(newState == LOW) {      // Yes, still low
      if(++mode > 8) mode = 0; // Advance to next mode, wrap around after #8
      switch(mode) {           // Start the new animation...
        case 0:
          colorWipe(strip.Color(  0,   0,   0), 50);    // Black/off
          break;
        case 1:
          colorWipe(strip.Color(255,   0,   0), 50);    // Red
          break;
        case 2:
          colorWipe(strip.Color(  0, 255,   0), 50);    // Green
          break;
        case 3:
          colorWipe(strip.Color(  0,   0, 255), 50);    // Blue
          break;
        case 4:
          theaterChase(strip.Color(  0,   0, 127), 50); // Blue, half 
          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(10);
          break;
        case 8:
          theaterChaseRainbow(50);
          break;
      }
    }
  }


 // Check if state changed from high to low (button press).
  if((nState == LOW) && (oState == HIGH)){
    // Short delay to debounce button.
    delay(20);
    // Check if button is still low after debounce.
    nState = digitalRead(BUTTON2_PIN);
    if(nState == LOW) {      // Yes, still low
      if(++mode > 8) mode = 0; // Advance to next mode, wrap around after #8
      switch(mode) {           // Start the new animation...
        case 0:
          colorWipe(strip.Color(  0,   0,   0), 50);    // Black/off
          break;
        case 1:
          colorWipe(strip.Color(255,   0,   0), 50);    // Red
          break;
        case 2:
          colorWipe(strip.Color(  0, 255,   0), 50);    // Green
          break;
        case 3:
          colorWipe(strip.Color(  0,   0, 255), 50);    // Blue
          break;
        case 4:
          theaterChase(strip.Color(  0,   0, 127), 50); // Blue, half 
          break;
        case 5:
          theaterChase(strip.Color(127,   0,   0), 50); // Red
          break;
        case 6:
          theaterChase(strip.Color(  0,   127, 0), 50); // Blue
          break;
        case 7:
          rainbow(10);
          break;
        case 8:
          theaterChaseRainbow(50);
          break;
      }
    }
  }


  // Set the last-read button state to the old state.
  oldState = newState;
  oState = nState;
}


// Fill strip pixels one after another with a color. Strip is NOT cleared
// first; anything there will be covered pixel by pixel. Pass in color
// (as a single 'packed' 32-bit value, which you can get by calling
// strip.Color(red, green, blue) as shown in the loop() function above),
// and a delay time (in milliseconds) between pixels.
void colorWipe(uint32_t color, int wait) {
  for(int i=0; i<34; i++) { // For each pixel in strip...
    strip.setPixelColor(i, color);         //  Set pixel's color (in RAM)
    strip.show();                          //  Update strip to match
    delay(wait);                           //  Pause for a moment
  }
}


// Theater-marquee-style chasing lights. Pass in a color (32-bit value,
// a la strip.Color(r,g,b) as mentioned above), and a delay time (in ms)
// between frames.
void theaterChase(uint32_t color, int wait) {
  for(int a=0; a<10; a++) {  // Repeat 10 times...
    for(int b=0; b<3; b++) { //  'b' counts from 0 to 2...
      strip.clear();         //   Set all pixels in RAM to 0 (off)
      // 'c' counts up from 'b' to end of strip in steps of 3...
      for(int i=35; i<68; i++) {
        strip.setPixelColor(i, color); // Set pixel 'c' to value 'color'
      }
      strip.show(); // Update strip with new contents
      delay(wait);  // Pause for a moment
    }
  }
}


// Rainbow cycle along whole strip. Pass delay time (in ms) between frames.
void rainbow(int wait) {
  
  for(long firstPixelHue = 0; firstPixelHue < 3*65536; firstPixelHue += 256) {
    for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
     
      int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
    
      strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
    }
    strip.show(); // Update strip with new contents
    delay(wait);  // Pause for a moment
  }
}


// Rainbow-enhanced theater marquee. Pass delay time (in ms) between frames.
void theaterChaseRainbow(int wait) {
  int firstPixelHue = 0;     // First pixel starts at red (hue 0)
  for(int a=0; a<30; a++) {  // Repeat 30 times...
    for(int b=0; b<3; b++) { //  'b' counts from 0 to 2...
      strip.clear();         //   Set all pixels in RAM to 0 (off)
      // 'c' counts up from 'b' to end of strip in increments of 3...
      for(int c=b; c<strip.numPixels(); c += 3) {
        
        int      hue   = firstPixelHue + c * 65536L / strip.numPixels();
        uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB
        strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
      }
      strip.show();                // Update strip with new contents
      delay(wait);                 // Pause for a moment
      firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames
    }
  }
}

IMG_0338.jpg

IMG_0338.jpg

Your question has been asked many hundreds of times on the forum. You cannot run two patterns at the same time using code like this. It is “blocking” code, containing delays within loops. You need code which uses millis() for timing instead of delays within loops. Search the forum and find how others solved the same problem.

@PaulAB- Thank you, I'll look into more forms.

@grumpy_Mike Thank you for sharing your code using millis. I have a lot of research I need to do to understand your code so I know what it is that I am doing. I know this is a lot to ask but would you be willing to help me out with how do I would go about adding two buttons that is controlling 34 leds pre button, this way I can use your code as a reference for my project?

The best thing is to start off slowly, forget about the strip first just concentrate on getting the multitasking going first.

See my
http://www.thebox.myzen.co.uk/Tutorial/State_Machine.html
Or Robin2's several things at once

Anything you don't understand then ask specific questions about it.

You must eliminate your use of delay completely.
In your colorWipe function you dump data to the strip every time you set an LED and then delay. It is after you call the show function that you must end your functions code for that turn. This means that for loops can't be used and you have to do them "by hand". That is have a separate global or static variable that acts as the index counter, increment that each time the function is entered, and do the comparison to the end limit to see if you have finished.

While it is nothing too complex, if you are not comfortable with code you can get lost. Which is why it is good to build things up.