obtener una variable de una interrupcion

Hola!

Estoy atascado en una parte de un código extenso que estoy trabajando. A ver si lo puedo explicar entendiblemente.

Tengo mi fichero main.c y 2 ficheros mas aparte: "Adafruit_NeoPixel.h" "Adafruit_NeoPixel.cpp"

A resumidas cuentas, tengo una barra de led con 3 formas decorativas de encenderse

  1. que se enciende desde el primer led hasta el ultimo
  2. que se enciende en plan coche fantastico
  3. que se encienda todos los leds de golpe

Este código lo tengo escrito en el fichero "Adafruit_NeoPixel.cpp" (vamos, le hice una ampliacion)

Vale, pues lo que quiero es que mediante un botón se cambie de un modo al siguiente por interrupcion.
y mi código main.c queda de la siguiente manera:

//Creación de nuevos objetos
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(numberLeds, neopixelPin, NEO_GRB + NEO_KHZ800);

/******************************************    CONFIGURACIÓN    ***************************************************************************/
void setup()
{
  pixels.begin();
  pixels.setBrightness(80);

  pinMode(BlackButton, INPUT_PULLUP);      
  attachInterrupt(digitalPinToInterrupt(BlackButton), interrupt_blackButton, RISING);      
}

void loop()
{
  flag = false;
  pixels.neoPixelModo(modo, flag);
}





/******************************************    FUNCIONES    ***************************************************************************/

void interrupt_blackButton()
{
  flag = true;
  modo++;
  if(modo > 3)
    modo = 1;
}

Pues eso, el bucle solo ejecuta la barra y ejecuta una de los modos. el codigo es el siguiente:

void Adafruit_NeoPixel::neoPixelModo(int modo, boolean flag)
{
  switch(modo)
  {
    case 1:
      //255,255,255 => blanco
      //0, 0, 0 => apagado
      
      for(int i=0; i<numLEDs; i++)
      {
        if(flag){     //el flag es para interrumpir el bucle cuando se ha pulsado el boton negro
          break;
        }else{
        setPixelColor(i, Color(255,255,255)); 
        show(); 
        delay(250);
        }
      }

      for(int i=0; i<=numLEDs; i++)
      {
        if(flag){
          break;
        }else{
        setPixelColor(i, Color(0,0,0)); 
        show(); // 
        delay(250);
        }
      }
    break;

    case 2:
      
      for(int i=0; i<(numLEDs/2); i++)
      {
        if(flag){
          break;
        }else{
        setPixelColor(i, Color(255,255,255));
        setPixelColor((numLEDs-1)-i, Color(255,255,255)); 
        show(); 
        delay(250);
        }
      }

      for(int i=0; i<(numLEDs/2); i++)
      {
        if(flag){
          break;
        }else{
        setPixelColor(i, Color(0,0,0));
        setPixelColor((numLEDs-1)-i, Color(0,0,0)); 
        show(); 
        delay(250);
        }
      }
    
    break;

    case 3:
      fill(Color(255,255,255),0,numLEDs);   //Selecciona un color; que empiece del led posicion 0; cantidad de leds que hay. ENCIENDE TODA LA BARRA
      show();
    break;

    

  }
}

vale, explico lo que no me funciona.
Lo que no funciona es la variable flag. Su función consiste en interrumpir los bucles for que hacen la secuencia de luces y pasar inmediatamente al siguiente modo y de esta manera no tengo que esperar a que finalice el bucle. Pues esta idea no me funciona. Me funciona que cuando pulso, se me va a la interrupcion, pero tengo que esperar a que termine el bucle. no me hace lo del flag.
¿Estoy pasando el parámetro mal?

flag es una variable publica volatile ?

ah vale... :open_mouth: :open_mouth: :open_mouth:
era ese el problema.

Todavia no se aplicar eso de volatile, inline, extern, y esas palabrotas

Gracias =D