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
- que se enciende desde el primer led hasta el ultimo
- que se enciende en plan coche fantastico
- 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?