Velocidad de led en tiras led ws2812

Buenas compañeros.
En mi proyecto tengo una tira led con 900 leds, la cual enciendo un led tras otro.

for (int i=0; i<NUMPIXELS; i++) 
 {
  pixels.setPixelColor(i, pixels.Color(0, 0, 200));
  pixels.show();  
  delay(1);
}

En delay puse un 1 para que los led corrieran,pero aún así es lento,necesito que encienda uno tras otro más rápido?

Coloca el código completo.
Saludos

1 Like
#include <Adafruit_NeoPixel.h>

#define PIN D2 
#define NUMPIXELS  900

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

const int BOTON1 = D1;
int val = 0;
int state = 0; 
int old_val = 0;
void setup(){  
 pinMode(BOTON1,INPUT);
  pixels.begin();
}
void loop() {       
val= digitalRead(BOTON1); 
if ((val == HIGH) && (old_val == LOW)){ 
state=1-state;
delay(20);
}
old_val = val;
if (state==1) {
 derecha();
}
if (state==0) {
 izquierda();
}
}
////////////////////////////////////
void derecha()
 {
  for (int i=0; i<NUMPIXELS; i++) 
 {
  pixels.setPixelColor(i, pixels.Color(0, 0, 200));
  pixels.show();  
  delay(1);
}
}
//////////////////////////////
void izquierda()
 {
  for (int i=NUMPIXELS - 1; i >= 0 ; i--)
 {
  pixels.setPixelColor(i, pixels.Color(0, 0, 0));
  pixels.show();     
  delay(1) ;
} 
}

No tengo conocimiento si exista incompatibilidad del delay con la libreria <Adafruit_NeoPixel.h> pero podrias usar el delay en microsegundos, aqui esta la referencia delay en uS
Consiste en definir solo la siguiente linea a diferencia del delay normal

delayMicroseconds(50);      // pauses for 50 microseconds
1 Like

Quita los delays incluído ese

delay(0);

que no tiene sentido.

1 Like

No se que pasó al copiar el código el valor es 20

Ok,lo probaré,gracias

Tenés un error conceptual que te lleva a cometer 3 errores en el código.
El primer pixel tiene índice 0, o sea, el número de cada pixel va de 0 a NUMPIXELS - 1.
Por ej. para una tira de 16 leds, el primero es el 0 y el último es el 15.

Entonces en derecha()

for (int i=1; i<NUMPIXELS; i++)  {

debería ser

for (int i=0; i<NUMPIXELS; i++) 

Sino el led 0 no se enciende.
Nota que aquí está bien que

i < NUMPIXELS

ya que i solo "llega" hasta NUMPIXELS - 1.

Pero en el caso de izquierda()

for (int i=NUMPIXELS; i > 0 ; i--)

es incorrecto porque el led 900 no existe, el último es el 899 (porque es 900 - 1).
No genera error porque evidentemente la librería no verifica que el parámetro sea correcto.
Por otro la lado, como el lazo termina en i > 0 , otra vez el led 0 no se enciende.
Lo correcto es

for (int i=NUMPIXELS - 1; i >= 0 ; i--)
1 Like

Cierto,por eso puse


for (int i=1; i<NUMPIXELS; i++)  {

Porque después de encender siempre quedaba el primer led encendido,digo pues no enciendo el primero y así no tengo que apagarlo. ahora entiendo por que. :thinking:

Esto funciona,pero no en este proyecto,con delay(1) es suficiente rápido, pero nose que pasa en este proyecto que no corren los led!

¿Que llamas a, "va lento" ?
En realidad creo que hay un error de concepto en tu programa. No trabaje con la libreria, pero tu estructura FOR se completa en milisegundos, si estuvieras trabajando solo con led, sin librería, el ojo humano no podría discernir ningún cambio. Creo que tendrías que escribir un programa "mas lento" utilizando milis para controlar exactamente los tiempos de encendido de leds.

Va lento,es que tarda mucho en encender un led tras otro

Ya encontré el error,es de hardware no de software :pensive:
Si pongo en número de led 200 enciende antes que si le pongo 900.
Ejemplo:

#define NUMPIXELS  200

Aquí enciende 200 led en 4 segundos

#define NUMPIXELS  900

Aquí enciende 200 led en 15 segundos

Parece ser que se satura y la info entre led va más lenta.Lo que no sé es cómo lo voy a solucionar

¿Vos entendés lo que estás haciendo? ¿Sabés como trabajan los WS2812?
Es obvio que si tenés que manejar 900 LEDs va a tardar unas 4.5 veces más que si tenés que manejar 200.

Si vos le decís al micro que tiene "colgados" 900 va a generar datos para 900, si colocas solo 200 pierde tiempo enviando datos a 700 leds que no existen.

1 Like

Ok,tengo 900 led como puedo mejorar para que corra mas,o fluya,vamos en resumen que llegue antes la info a los led para que se enciendan antes? O no es problema del procesador? Sería la propia tira led el problema? Por lo que entiendo,no puedes encender 900 led al mismo tiempo,ya que tarda en llegar la info al último led?

Según el datasheet, el WS2812 necesita de un tiempo de 1.25us con diferencia de +-600ns; en el peor de los casos necesitas de 1.256us para transferencia de datos, yo lo considero un buen tiempo pero si tu dices que va muy lento, podrias utilizar otro MCU para pruebas, ya que la libreria tiene compatibilidad con múltiples tarjetas, como el ESP8266 o el ESP32.

image

1 Like

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