Projet WS2812 Multi bandeaux

Bonjour à tous,

Je vous solicite pour un projet de décoration, je souhaite mettre en place plusieurs bande de led WS2812 de nombre de leds différents sur un Arduino Mega. ( différents point d'alimentation son mis en place pour led gestion de puissance), une gestion d'une machine à fumée et d'une trame DMX simple.

Le but est de piloter des effets sur les différents bandeaux sur les différents ports.

Les différents bandeaux testés tous sur le même pin de sortie avec un programme test FastLed fonctionne parfaitement.

Maintenant la phase 2

Pouvoir piloter des effets ou des couleurs ( via un écran NEXTION 7") sur les différents bandeaux.

Première phase:

Obligatoire :

Deux bandeau de 90 leds doit être sur un blanc fixe au lancement. Coulour ou effet modifiable par la suite. Comment les allumer fixe en une fois et les maintenir stable ainsi ?

Pendant se temps des effets sur les autres bandeaux sont lancés. !

On envoie une trame DMX qui est calé sur auto audio sensibilité

On cycle deux injection de fumée de 20 sec à 5 min d'intervalle et on stop (un bouton sur l'écran permettra de réinjecter un cycle)

Problème à géré le timming de traitement ?

Je pensai passer par millis mais comment mettre ses effets correctement dans les boucles ?

Je vous remercie pour toute vos idées qui seront les bienvenue.

Je suis a vôtre dispo pour vous donner des éléments que j'aurai omis pour vous aider à comprendre.

Je te conseille un peu de lecture qui devrait te donner des idées

Bonjour, et merci pour ces lecture j'ai creer de essaie de boucle mais je n'arrive pas a les caler sur plusieurs bandeau ça bloque les enchaînements sont long et non synchro !

As-tu de bonnes bases d'arduino ? Es-tu fixé sur un Mega ?

Si tu réponds oui puis non, je te conseillerais d'utiliser un ESP32 et de tenter FreeRTOS. Ce sera bien plus simple à coder.

Si tu veux absolument rester sur un Mega, alors je pense que tu devrais soit faire une machine d'état, soit utiliser une bibliothèque spécifique pour machine d'état.

Merci de ton retour,

Je suis sur un mega, l'ESP32 n'est pas envisagé car c'est un système embarqué.

Mon niveau est moyen et je veux bien des conseils sur le concept que tu me m'évoquent de cette machine d'état.

Peux tu m'en dire plus sur cette situation ?

Je rencontre des difficultés sur l'allumage de 90 led en blanc de manière stable !

1er problème est que les leds blanche s'allument l'une apres l'autre, j'ai pas réussi a les allumé toute d'un coup

Et quand mon cycle suivant se lance ( oui pas encore timer donc s'exécute a la suite) les led perde leur blanc et passe rose !??

Encore merci d'avance

Bonjour

'ESP32 n'est pas envisagé car c'est un système embarqué.

:o Sans être parfait l'ESP32 est un excellent candidat pour les systèmes embarqués !!
Entre autres parce qu'il ouvre la porte du multitâches.
Ou se situe le problème ? Il a un excellent potentiel y compris dans des situation où l'on n'utilise ni son WiFi , ni son Bluetooth.

machine d'état : Ce tutoriel est très didactique
https://forum.arduino.cc/index.php?topic=470879.0

Un ESP32 peut remplacer un arduino si on ne dépasse pas le nombre de GPIO disponibles. C'est vrai que le Mega en a beaucoup, mais ton projet tel que tu le décris peut être fait avec un ESP32.

FreeRTOS pourrait aussi convenir sur un Mega, mais ça demandera bien sûr un apprentissage et du temps pour tester.

Ceci dit, une machine d'état n'est pas forcément simple à écrire non plus et reste difficile à faire évoluer. L'évolution sera peut-être plus facile avec une bibliothèque dédiée aux machines d'état.

Quels sont tes problèmes de stabilité avec les 90 leds ? Pour un projet de ce genre, le code est important mais l'alimentation est primordiale, avec aussi des résistances et des capacités. Il faut lire ce tuto (cette page et les suivantes)

Re,

Alors j'ai stabilisé mes problème d'alimentation sur les 90 leds ! Elle sont blanche.

Pour les résistances et condo ça a été fait des l'installation.

Pour les modes j'arrive depuis cette aprèm a traiter les modes en simultané en reprenant un exemple de fastleds, j'arrive à moduler les voies soit actuellement 8 sont géré dans le même temps.

Je vais rester sur mon idée de mega ui me semble au vu de cette avancé une bonne solution car je vais pas avoir assez de de pins sinon.

J'espère encore avancer dans la programmation.

Quand ce sera plus propre je mettrai le code mais la c'est une bazar encore

Bonsoir,

J'ai donc ajouté une trame dmx avec dmxsimple, lorsque je upload seul la trame fonctionne parfaitement.

Maintenant quand je l'ajoute dans mon code global le signal fait des micros flash, j'ai tenté de le positionner a différents endroits afin de voir si il s'agit dun problème de code hors j'ai plutôt sensation d'une perturbation sur le voie PWM.

j'ai donc commenté les lignes en laissant juste les ligne du setup.

Et la même problème la voie est bien perturbée !

Comment stabiliser cette information en sortie de l'Arduino pour que la voie soit stable ?

Merci par avance de votre aide

Difficile de répondre sans voir le code

Impossible de le publier même entre les balises il me dis qu'il y a plus de 9000 caractères

Tu le coupes en deux et tu le mets dans deux messages différents...

void loop()
{

    unsigned long currentMillis = millis();
    unsigned long currentMillis2 = millis();
////////////////////////////////////////////////////////////////////////////////////////////////
//                                    lecture entré machine à fumée
////////////////////////////////////////////////////////////////////////////////////////////////
        Fumee_sensor_value = analogRead(pin_in_fumee) * 5000.0 / 1023.0 / 1000.0;    // Convertit le signal 0.0 to 5.0 V
        Fumee_value_float = ((((2.5 - Fumee_sensor_value) / 1.037)* 1000.0) -300 );     // calibration de corection selon carte amplificateur entre -2000 to 2000 mV (-300 = valeur de corection)
        //Serial.println (Fumee_sensor_value);



        
  
  // Appeler une fois la fonction de configuration actuelle, en mettant à jour le tableau des «LED»
  gPatterns[gCurrentPatternNumber]();

  // envoyer le réseau de «leds» sur la bande LED réelle
  FastLED.show();  
  // insérer un délai pour garder le framerate modeste
  FastLED.delay(3000/FRAMES_PER_SECOND); 
  

  // faire des mises à jour périodiques
  EVERY_N_MILLISECONDS( 20 ) { gHue++; } // faire défiler lentement la "couleur de base" à travers l'arc-en-ciel
  EVERY_N_SECONDS( 300 ) { nextPattern(); } // durée entre chaque changement
  
int compteur = 0 ;
while(compteur != 10) //tant que compteur est différent de 10
{
                compteur ++ ; //On incrémente d’une unité
                DmxSimple.write(1, 250);
}

////////////////////////// Temporisation de 1 seconde /////////////////////////
    if (currentMillis - previousMillis >= 1000) {
        previousMillis = currentMillis;

            //for (int cycle = 145; cycle <= 246; cycle++){  // Simple loop to ramp up brightness     
           //DmxSimple.write(1, 155);
           //DmxSimple.write(2, cycle);  //Update DMX channel 1 to new brightness 
           //DmxSimple.write(4, 162);}
         
  
    }

////////////////////////// Temporisation de 1 minute /////////////////////////
    if (currentMillis2 - previousMillis2 >= 60000) {
              previousMillis2 = currentMillis2;
      
    }
  
}

#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0]))

void nextPattern()
{
  // ajoutez-en un au numéro de modèle actuel et passez à la fin
  gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns);
}
void Cyclon() { 
  static uint8_t hue = 0;
  // Faites d'abord glisser la led dans une direction
  for(int i = 0; i < NUM_LEDS; i++) {       // Set the i'th led to red 
     leds[i] = CHSV(hue++, 255, 255);
      FastLED.show(); // Afficher les leds
      // leds[i] = CRGB::Black; // maintenant que nous avons montré les leds, remettez la ième led au noir
         fadeall();
        
    // Attendez un peu avant de faire le tour et recommencez
    delay(3);
  }
  // Allez maintenant dans l'autre sens.  
  for(int i = (NUM_LEDS)-1; i >= 0; i--) {
    // Set the i'th led to red 
    leds[i] = CHSV(hue++, 255, 255);
    // Show the leds
    FastLED.show();
    // now that we've shown the leds, reset the i'th led to black
    // leds[i] = CRGB::Black;
    fadeall();
    // Wait a little bit before we loop around and do it again
    delay(3);
  }
}

void laser (){
              int brightness;
      //for (brightness = 145; brightness <= 246; brightness++){  ///* Simple loop to ramp up brightness     
          int compteur = 0 ;
 
while(compteur != 10) //tant que compteur est différent de 10
{
                compteur ++ ; //On incrémente d’une unité
                DmxSimple.write(1, 250);
}
           
           
           
         //  DmxSimple.write(2, brightness);  /* Update DMX channel 1 to new brightness */
        //   DmxSimple.write(4, 162);}
}

void rainbow() 
{
  // FastLED's built-in rainbow generator
  fill_rainbow( leds, NUM_LEDS, gHue, 7);
  fadeToBlackBy( leds2, NUM_LEDS2, 10);
  int pos = random16(NUM_LEDS2);
  leds2[pos] += CHSV( gHue + random8(64), 200, 255);
  fill_rainbow( leds2, NUM_LEDS2, gHue, 7);
  
  
  
}

void rainbowWithGlitter() 
{
  // built-in FastLED rainbow, plus some random sparkly glitter
  rainbow();
  addGlitter(80);
  
}

void addGlitter( fract8 chanceOfGlitter) 
{
  if( random8() < chanceOfGlitter) {
    
    leds[ random16(NUM_LEDS) ] += CRGB::White;
    leds3[ random16(NUM_LEDS3) ] += CRGB::White;
 /* for (int cycle = 145; cycle <= 246; cycle++){  // Simple loop to ramp up brightness     
           DmxSimple.write(1, 120);
           DmxSimple.write(2, cycle);  //Update DMX channel 1 to new brightness 
           DmxSimple.write(4, 162);}*/

    
  }
}

void confetti() 
{
  // random colored speckles that blink in and fade smoothly
  fadeToBlackBy( leds, NUM_LEDS, 10);
  int pos = random16(NUM_LEDS);
  leds[pos] += CHSV( gHue + random8(64), 200, 255);
  leds2[pos] += CHSV( gHue + random8(64), 200, 255);
}

void sinelon()
{
  // a colored dot sweeping back and forth, with fading trails
  fadeToBlackBy( leds, NUM_LEDS, 20);
  int pos = beatsin16( 13, 0, NUM_LEDS-1 );
  leds[pos] += CHSV( gHue, 255, 192);
  leds2[pos] += CHSV( gHue, 255, 192);
 
}

void bpm()
{
  // colored stripes pulsing at a defined Beats-Per-Minute (BPM)
  uint8_t BeatsPerMinute = 120;
  CRGBPalette16 palette = PartyColors_p;
  uint8_t beat = beatsin8( BeatsPerMinute, 64, 255);
            
 

  for( int i = 0; i < NUM_LEDS; i++) { //9948
    leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10));
          for( int i = 0; i < NUM_LEDS2; i++) {
                leds2[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10));
          }
          for( int i = 0; i < NUM_LEDS3; i++) {
                  leds3[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10));
                  //leds3[i] = 0x70070;
                  
          }
            for( int i = 0; i < NUM_LEDS4; i++) {
                 leds4[i] = 0x75FF80;}
  }
}

void juggle() {
  // eight colored dots, weaving in and out of sync with each other
  fadeToBlackBy( leds, NUM_LEDS, 20);
  byte dothue = 0;
  for( int i = 0; i < 8; i++) {
    leds[beatsin16( i+7, 0, NUM_LEDS-1 )] |= CHSV(dothue, 200, 255);
    dothue += 32;
    leds2[beatsin16( i+7, 0, NUM_LEDS2-1 )] |= CHSV(dothue, 200, 255);
    dothue += 32;
    leds3[i] = CRGB::Red;
    
  }
}

Je joint le fichier en pièces jointe car impossible de le publier !!!

Principal_prog_Limo.ino (21.4 KB)

Bonjour,

J'ai finalement réglé le soucis.
C'était le delay en debut de boucle.