Partage
  • Partager sur Facebook
  • Partager sur Twitter

Anneaux LED WS2812 et boucle for ...

    18 janvier 2019 à 18:24:28

    Bonjour à tous !

    J'ai 9 anneaux de WS2812, de plus en plus grand.

    Au centre, 1 LED, anneau suivant 8 LED, anneau suivant 12 LED et ainsi de suite.

    Je voudrai donner au tout un effet d'onde, de pulsation avec fade in/ou sur l'anneau central, puis sur le suivant et ainsi de suite. Partant du centre vers le contour mais ... je suis une bouse en boucles For =p

    L'effet que j'ai actuellement ne me convient pas :

    - l'anneau 2 ne fait son fade in / fade out QUE quand celui de l'anneau 1 est complètement terminé alors que j'aimerai qu'il commence pendant le fade out du l'anneau 1...

    - l'anneau 3 de fait son fade in / fade out QUE quand celui de l'anneau 2 est complètement terminé alors que j'aimerai qu'il commence pendant le fade out du l'anneau 1...

    etc ...

    - de plus, plus j'ai de LED sur mes anneaux, plus le fade in / fade out est long

    Voici mon code :

    void loop() {
    
    // RING 1 et 2
    
    for (int j = 50; j < 255; j++)
    {
      for (int i = 0; i < 9; i++)
      {
      pixels1.setPixelColor(i, 0, j, 0);
      }
      pixels1.show();
      delay(0);
    }
      
    for (int j = 255; j > 50; j--)
    {
      for (int i = 0; i < 9; i++) 
      {
      pixels1.setPixelColor(i, 0, j, 0);
      }
      pixels1.show();
      delay(0);
    }
    
    for (int j = 50; j < 255; j++)
    {
      for (int i = 0; i < 9; i++)
      {
      pixels2.setPixelColor(i, 0, j, 0);
      }
      pixels2.show();
      delay(0);
    }
      
    for (int j = 255; j > 50; j--)
    {
      for (int i = 0; i < 9; i++) 
      {
      pixels2.setPixelColor(i, 0, j, 0);
      }
      pixels2.show();
      delay(0);
    }
    
    // RING 3
    
    for (int j = 50; j < 255; j++)
    {
      for (int i = 0; i < 13; i++)
      {
      pixels3.setPixelColor(i, 0, j, 0);
      }
      pixels3.show();
      delay(0);
    }
      
    for (int j = 255; j > 50; j--)
    {
      for (int i = 0; i < 13; i++) 
      {
      pixels3.setPixelColor(i, 0, j, 0);
      }
      pixels3.show();
      delay(0);
    }
    
    // RING 4
    
    for (int j = 50; j < 255; j++)
    {
      for (int i = 0; i < 17; i++)
      {
      pixels4.setPixelColor(i, 0, j, 0);
      }
      pixels4.show();
      delay(0);
    }
      
    for (int j = 255; j > 50; j--)
    {
      for (int i = 0; i < 17; i++) 
      {
      pixels4.setPixelColor(i, 0, j, 0);
      }
      pixels4.show();
      delay(0);
    }
    
    // RING 5
    
    for (int j = 50; j < 255; j++)
    {
      for (int i = 0; i < 25; i++)
      {
      pixels5.setPixelColor(i, 0, j, 0);
      }
      pixels5.show();
      delay(0);
    }
      
    for (int j = 255; j > 50; j--)
    {
      for (int i = 0; i < 25; i++) 
      {
      pixels5.setPixelColor(i, 0, j, 0);
      }
      pixels5.show();
      delay(0);
    }
    
    // RING 6
    
    for (int j = 50; j < 255; j++)
    {
      for (int i = 0; i < 33; i++)
      {
      pixels6.setPixelColor(i, 0, j, 0);
      }
      pixels6.show();
      delay(0);
    }
      
    for (int j = 255; j > 50; j--)
    {
      for (int i = 0; i < 33; i++) 
      {
      pixels6.setPixelColor(i, 0, j, 0);
      }
      pixels6.show();
      delay(0);
    }
    
    // RING 7
    
    for (int j = 50; j < 255; j++)
    {
      for (int i = 0; i < 41; i++)
      {
      pixels7.setPixelColor(i, 0, j, 0);
      }
      pixels7.show();
      delay(0);
    }
      
    for (int j = 255; j > 50; j--)
    {
      for (int i = 0; i < 41; i++) 
      {
      pixels7.setPixelColor(i, 0, j, 0);
      }
      pixels7.show();
      delay(0);
    }
    
    // RING 8
    
    for (int j = 50; j < 255; j++)
    {
      for (int i = 0; i < 61; i++)
      {
      pixels8.setPixelColor(i, 0, j, 0);
      }
      pixels8.show();
      delay(0);
    }
      
    for (int j = 255; j > 50; j--)
    {
      for (int i = 0; i < 61; i++) 
      {
      pixels8.setPixelColor(i, 0, j, 0);
      }
      pixels8.show();
      delay(0);
    }
    
    // RING 9
    
    for (int j = 50; j < 255; j++)
    {
      for (int i = 0; i < 94; i++)
      {
      pixels9.setPixelColor(i, 0, j, 0);
      }
      pixels9.show();
      delay(0);
    }
      
    for (int j = 255; j > 50; j--)
    {
      for (int i = 0; i < 94; i++) 
      {
      pixels9.setPixelColor(i, 0, j, 0);
      }
      pixels9.show();
      delay(0);
    }
     
    }

    Merci d'avance pour votre aide !

    -
    Edité par Thibaut Leuridan 18 janvier 2019 à 18:39:12

    • Partager sur Facebook
    • Partager sur Twitter
      Staff 22 janvier 2019 à 12:34:32

      Ton décalage temporelle vient du fait qu'il est plus rapide de rafraichir 9 LEDs que d'en rafraichir 94.

      Il faut compter environ 30us par LED pour envoyer les données.

      Dans ta première bouche, il y a : 205 itérations sur 9 LEDs, soit 205*9*30 = 55350us = 55ms

      Dans ta dernière bouche, il y a : 205 itérations sur 94 LEDs, soit 205*94*30 = 578100us = 578ms

      Alors oui, cela prend 10 fois plus de temps, et c'est logique.

      Si tu veux quelque chose de constant, il te faudrait faire une synchro.

      Dans le pire des cas, il y a 94*30 = 2820us, donc disons 5000us pour avoir de la marge.

      Tu pourrais donc avoir le code suivant :

      for (int j = 50; j < 255; j++)
      {
        // Sauvegarde du temps T0
        unsigned long t0 = micro();
      
        // Affichage
        for (int i = 0; i < 17; i++)
        {
          pixels4.setPixelColor(i, 0, j, 0);
        }
        pixels4.show();
      
        // Attente de 5000us après T0
        while ( ( micro() - t0 ) < 5000 ) { };
        
      }

      Avec ce code, la boucle while va bloquer ton programme plus ou moins longtemps pour qu'il y ai au minimum 5000us entre t0 et la fin de la boucle.

      A noter que si tu trouves que l'ensemble est trop lent, tu pourrais faire un j+=2 plutôt que j++ de façon à incrémenter tes couleurs de 2 en 2 plutôt que 1 en 1.

      ***

      Pour ce qui est de démarrer tes animations avant la fin d'une autre, il te faudrait plutôt utiliser une grande et unique boucle avec des offsets.

      Exemple :

      // Boucle principal, de 0 à 10000
      for ( int i = 0 ; i < 10000 ; i++ ) {
      
        // Animation 1 : de 0 à 1000
        if ( i >= 0 && i < 1000 ) {
          int j = i - 0;
          [...]
        }
      
        // Animation 2 : de 900 à 1900
        // Donc début de animation 2 légèrement avant la fin de animation 1
        if ( i >= 900 && i < 1900 ) {
          int j = i - 900;
          [...]
        }
      
        // Animation 3 : de 1800 à 2800
        ...
      
      }
      
      





      • Partager sur Facebook
      • Partager sur Twitter
        22 janvier 2019 à 20:44:44

        Merci !

        Super et très clair ! Je teste tout ça vendredi.

        Top Lorrio comme d'hab.

        • Partager sur Facebook
        • Partager sur Twitter

        Anneaux LED WS2812 et boucle for ...

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown