Ejecución errónea al compilar en Arduino Uno

Buenas tardes.
Estaba probando una tira de LEDs WS2812B y probando la librería "WS2812BStrip.h" cuando me he topado con un problema. Dejo el código a continuación

#include <WS2812BStrip.h>
#include <Arduino.h>

#define PIN 2
#define LED_SIZE 3

using namespace WS2812B;

LED lights[LED_SIZE];
LEDStrip strip(lights, LED_SIZE);

void sendToStrip(LED* l){
  for(int i = 0; i < LED_SIZE; i++){
    lights[i].red = l->red;
    lights[i].green = l->green;
    lights[i].blue = l->blue;
  }
  strip.write(PIN);
}


void setup(){
  initLEDStrip(lights, LED_SIZE);
  Serial.begin(115200);    //LINEA COMENTARIO 1
  pinMode(5, INPUT);
}


void loop(){
    LED l;

    l.red = 0;
    l.green = 0;
    l.blue = 64;

    sendToStrip(&l);
    
    while(true){    //LINEA COMENTARIO 2
        delay(1);
        if(digitalRead(5)){
            Serial.println("Boton pulsado");
        }
    }
}

Al código del procedimiento sendToStrip(LED* l), se le pasa un LED (objeto de la librería WS2812BStrip), modifica la tira de leds a ese color y lo escribe.

Las conexiones son correctas ya que con el programa de ejemplo funciona a la perfección.

Los problemas que me he encontrado son los siguientes. Para cada punto, el error se mantiene igual por cada compilación, dando siempre los mismos resultados:

  • Si elimino el código del bucle (línea comentario 2), se me encienden LED_SIZE leds de la tira en color azul, tal como indico al inicio del procedimiento loop.
  • Al insertar el código (tal cual lo he dejado arriba), los leds se encienden con colores aleatorios.
  • Si la línea Serial.begin(115200); del procedimiento setup();, se mueve dentro del procedimiento, se muestra un patrón de color distinto por cada una de las posiciones donde lo deje. Lo mismo ocurre con el delay(1);, si se cambia de posición o se elimina, el patrón cambia (aunque en este caso es parecido entre cambios).

Llevo ya un rato intentando ver por que ocurre. No parece que sea de la librería, debido a que he probado de añadir un delay grande entre el sendToStrip y el bucle, obteniendo el mismo resultado.

Un saludo!

Iba a responderte que suelo usar librerías de Adafruit Neopixel que nunca me dieron problema o librerias como FastLed que tampoco me han dado problemas.
Porque no intentas con ellas?

En la documentación de la librería (que siempre es recomendable leer) dice

Timing  Details

The LED strips use a high speed one-wire 
protocol with relatively strict timing 
requirements, so this library disables interrupts 
to ensure reliable color transmission. 
Unfortunately, disabling the interrupts causes 
problems in other libraries that uses interrupts, 
such as the 'Serial' library and the functions like 
'millis()' that keep track of time.

O sea,

Las tiras de LED utilizan un protocolo
de un solo cable de alta velocidad con requisitos 
de tiempo relativamente estrictos, por lo que 
esta biblioteca desactiva las interrupciones para 
garantizar una transmisión de color confiable.  
Desafortunadamente, deshabilitar las 
interrupciones causa problemas en otras 
bibliotecas que usan interrupciones, como la 
biblioteca Serial y las funciones como millis() que 
realizan un seguimiento del tiempo.

Es muy posible que, así como la librería interfiere con Serial y millis, Serial y/o millis() interfieran con la librería, por eso según donde pongas Serial.begin() modifica el funcionamiento.

Saludos

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