Se interrumpe alternancia entre funciones

Buenos dias,
soy nuevo en el foro y me estoy iniciando en la programación, así que es probable que el fallo se mio.
El problema es el siguiente: tengo una tira led programada con la libreria FasLed, he hecho unas funciones (animaciones de los leds) que he comprobado que funcionan individualmente. La alternancia de funciones la hice viendo algunos ejemplos y funciona hasta la 4 funcion, entonces se apaga la tira led. Añado el programa para a ver si alguien me dice si hago algo mal. Despues de la parte que he copiado estan programadas las funciones. Grácias por adelantado

#include <FastLED.h>

#define NUM_LEDS 85   
#define DATA_PIN 3    
#define BRIGHTNESS 60 

CRGB leds[NUM_LEDS]; 

uint8_t patternCounter = 0;
uint16_t x;                       
int scale;                         
uint16_t t;                        
uint16_t brightnessScale = 100;   

void setup() {
  FastLED.addLeds<WS2812B, DATA_PIN,GRB>(leds, NUM_LEDS); 
  FastLED.setBrightness (BRIGHTNESS);                     
  FastLED.clear();                                       
  FastLED.show();                                         
}

void loop() {
switch (patternCounter){   
  case 0:
  gradient(300);
  break;
  case 1:
  fadeMoving(15,10);
  break;
  case 2:
  color_rain();
  break;
  case 3:
  glitch();
  break;
  case 4:
  respira();
  break;
  case 5:
  noise();
  break;
  case 6:
  noisebright();
  break;
 }

 EVERY_N_SECONDS(10){       
  nextPattern();           
 }
FastLED.show(); 
}

void nextPattern(){
 patternCounter = (patternCounter +1)%7; 
}

El codigo que has puesto funciona correctamente luego el error debe estar en la funcion 4. Si la funcion 4 y alguna de las siguentes son ejemplos que trae la libreria FasLed ten cuidado que la mayoria de ellos no funcionan como funciones, son loop principales que funcionan durante un cierto periodo de tiempo, no funcionan llamadolas multiples veces durante un periodo de tiempo como tu haces. Como tu las llamas esas funciones solo dan una vuelta en su codigo, la primera, y con una sola vuelta no hacen nada. Seria conveniente que tambien publicaras las funciones para ver si es de eso.

Defines CRGB pero luego no veo que lo uses

Y aqui usas GRB que no veo que esté declarado

¿Un error de tipeo?

CRGB es un tipo, o sea, leds[] es una array de tipo CRGB.

Saludos

No lo sabia, gracias

Fijate que debe estar declarado en la librería.

Saludos

Grácias por responder,
el array que declaro como "leds" lo uso posteriormente dentro de las funciones (que no copié para no hacerlo muy largo) para hacer encender la tira led y esa parte funciona.

En la parte del setup, GRB es el orden que tiene los colores la tira led, Green, Red, Blue. la instruccion FastLed.addLeds viene definida y en esa posicion se le indica justamente el orden de colores.

Creo que ambas cosas no son el problema, puesto que las funciones que posteriormente quiero que ejecute las he probado a ejecutarlas individualmente, sin tocar nada del setup ni declaracion de variables y funcionan correctamente. Aun asi, gracias por dedicar tu tiempo para responder

Grácias por responder,

Las funciones no estan sacadas de ningun ejemplo de las librerias, las he hecho yo, viendo algunos videos de youtube que enseñan algunas animaciones, etc. Para probarlas antes de probar la alternancia las llamaba desde el loop, primero una, cuando esa veia que funcionaba probaba otra, y asi con todas.

Lo extraño es que si, por ejemplo, la funcion del caso 4 y 5 las llamo en el caso 1 y 2 si que las ejecuta correctamente. Por eso creo que he hecho alguna cosa mal en la alternancia, porque siempre deja de hacer la funcion que este en la posicion 4 en adelante.

De todas maneras grácias por contestar, seguire probando y si encuentro el problema lo haré saber :wink:

La alternancia esta correcta, si en el codigo que has puesto cambias las llamadas a las funciones a por ejemplo:

 Serial.println ("gradient(300)");

Veras por el monitor serie que el switch case funciona correctamente y no se para llamando cada 10 seg. a todas loas funciones. El error lo tienes en las funciones no en el codigo que has subido.

Tienes todala razon, el problema lo tengo en la funcion respira(), que es la siguiente:

void respira(){
  for (int r=0; r<NUM_LEDS; r++){     
    leds[r] = CRGB::Teal;          
  }
  for (int r=0; r<BRIGHTNESS; r++){   
    FastLED.setBrightness (r);       
    FastLED.show();                   
    delay (15);                       
  }
  for (int r=BRIGHTNESS; r>=0; r--){  
    FastLED.setBrightness (r);        
    FastLED.show();                   
    delay (15);                       
  }
}

Por si alguien tiene curiosidad, la funcion lo que hace es encender los leds a un brillo bajo, va subiendo el brillo y cuando llega al brillo maximo baja hasta apagarlos, asi repetidamente.
He probado a cambiar las funciones en otros casos y siempre se quedan todos los leds parados despues de esta funcion.

Edito la respuesta, he encontrado el problema, la funcion coincidia que cuando saltava a la siguiente estaba apagado, osea que habia dejado el brillo fijado a 0 y las siguientes funciones se ejecutaban con el brillo a 0. Lo he solucionado modificando la funcion que alterna con la siguiente funcion asi:

void nextPattern(){
 FastLED.setBrightness (BRIGHTNESS);        
 patternCounter = (patternCounter +1%7);  
}

Grácias por las respuestas

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.