WS2812 - primi esperimenti

Come detto in altro post ( [CHIUSO] TLC 5940 - programmazione - Software - Arduino Forum) sto provando a usare queste strip, che mi entusiasmano veramente molto.

Ho trovato alcuni codici di esempio usando la libreria neopixel, e sto provando a fondere degli spezzoni reperiti là con alcuni tentativi - molto banali in verità - miei.
Nello specifico sto cercando di ottenere, dopo la pressione di uno switch, di passare da un ciclo colore in fading all'accensione in sequenza degli stessi led in bianco, il loro spegnimento e il riavvio del ciclo colore in fading.

Lo sketch usato è questo:

#include <Adafruit_NeoPixel.h>

#define PIN 3  //definisco una costante PIN a cui assegno il valore 3

Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);

#define timer01 1000  //definisco una costante timer01 pari a 1000 ms
const int IR1=7;       //definisco la costante IR1 e la assegno al pin 7
int IR1State = LOW;    //definisco la variabile IR1State e la setto a LOW


void setup() {
  strip.begin();
  strip.show(); // inizializzo tutti i led a OFF

  pinMode (IR1, INPUT);  //stabilisco che il pin di IR1 è in input
  

}

void loop() {
 IR1State = digitalRead (IR1) ;  //legge lo stato di IR1

  rainbowCycle(20);  //richiamo la subroutine rainbow

  if (IR1State == HIGH) {     //se premo il pulsante eseguo la subroutine 
    
  accendiBianchi (500);

  }
   
 }

 

//qui definisco le subroutine richiamate nel loop
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);
  }
}


//questa funzione è necessaria perchè richiamata nella subroutine di prima
// 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) {
  if(WheelPos < 85) {
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
   WheelPos -= 170;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}


//subroutine per l'accensione dei bianchi
//accende i led in sequenza poi li spegne in sequenza

void accendiBianchi (uint8_t timer03) {
  uint16_t a;    //dichiaro a
  for(a=0; a< 6; a++) {  //imposto il ciclo per tutti i led della strip
      strip.setPixelColor(a, 255, 255, 255);  //accendo i led in bianco
      strip.show();    //esegue il ciclo intervallato dal timer definito sotto
      delay(500);
  }
  delay (2000);
  
  for(a=0; a< 6; a++) {  //imposto il ciclo per tutti i led della strip
      strip.setPixelColor(a, 0, 0, 0);  //spengo i led
      strip.show();    //esegue il ciclo intervallato dal timer definito sotto
      delay(500);
  }
  
}

Alla riga 5 ho dovuto settare a 60 (come è nello skecth originale) il numero di led nella strip altrimenti la routine rainbow mi va in tilt, ma alle righe 80 e 87 limito la routine a soli 6 led (sono quelli che in realtà ho nella strip - diversamente dovrei aspettare il tempo virtuale di eseguire la routine per i rimanenti 54 led "fantasmi".

Quello che non capisco è:
se eseguo degli sketch singoli per le 2 routines funziona tutto (ottengo il ciclo di colori in fading oppure accensione e spegnimento dei bianchi a seguito della pressione); se però imposto lo sketch come quello che ho indicato, ottengo solo il ciclo di colore, ignora la pressione del tasto.
Posso supporre che nel loop Ardo verifichi lo stato dell'input a inizio loop, vede che è low pertanto esegue il ciclo di colore che è infinito. ma così facendo non controlla più lo stato dello switch per cui anche se lo premo visto che il ciclo colore è infinito non lo andrà mai a considerare. Dico giusto? e come bypasso l'intoppo?

Ciao