es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Animación estilo teatro sin bloqueo para NeoPixels

Estoy tratando de adaptar esta versión del ejemplo de teatro de persecución de NeoPixel de Adafruit para que no sea bloqueante, no utilizando la función delay() y en su lugar utilizando la función millis() para crear un contador. Sin embargo, no tengo éxito ya que los NeoPixels simplemente se encienden constantemente. ¿Me estoy perdiendo algo? Decidí colocar el condicional if en el punto donde el bucle for anidado apaga cada tercer pixel en la cadena, pensando que este sería el lugar adecuado para ponerlo ya que en el código antiguo se llamaba a delay() antes de este paso.

Aquí está esta versión que hice y que no funciona:

//Luces de persecución estilo teatro.
void theaterChase(uint32_t c, const long wait) {
  unsigned long currentMillis = millis();
  for (int j = 0; j < 10; j++) { //hacer 10 ciclos de persecución
    for (int q = 0; q < 3; q++) {
      for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) {
        strip.setPixelColor(i + q, c);  //encender cada tercer pixel
      }
      strip.show();
      if (currentMillis - previousMillis >= wait) {
        previousMillis = currentMillis;
        for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) {
          strip.setPixelColor(i + q, 0);      //apagar cada tercer pixel
        }
      }
    }
  }
}

Y aquí está la versión antigua:

//Luces de persecución estilo teatro.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //hacer 10 ciclos de persecución
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //encender cada tercer pixel
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //apagar cada tercer pixel
      }
    }
  }
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, te estás perdiendo algo. En tu versión del código, no estás actualizando la variable currentMillis dentro del bucle, por lo tanto siempre se establece en el mismo valor, haciendo que la condición del if sea siempre verdadera. Necesitas actualizar currentMillis después de cada llamada a strip.show(), de esta manera:

        //Luces que se desplazan al estilo de un teatro.
        void theaterChase(uint32_t c, const long wait) {
          unsigned long currentMillis = millis();
          for (int j = 0; j < 10; j++) { //hacer 10 ciclos de desplazamiento
             for (int q = 0; q < 3; q++) {
               for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) {
                 strip.setPixelColor(i + q, c);  //encender cada tercer pixel
               }
               strip.show();
    
               if (currentMillis - previousMillis >= wait) {
                 previousMillis = currentMillis;
                 for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) {
                   strip.setPixelColor(i + q, 0);      //apagar cada tercer pixel
                 }
               }
    
               currentMillis = millis();
             }
           }
        }
    

    Además, asegúrate de haber definido la variable previousMillis fuera de esta función e inicializarla en 0. Esta variable se utiliza para hacer un seguimiento del último momento en que la condición del if fue verdadera.

Comments are closed.