Chenillard coincé controlé par un seuil

Bonjour,

Je fais la moyenne des échantillons d'un MEMS (comme l'a été expliqué l'an dernier @J-M-L) afin de déclencher une fonction d'animation de leds lorsqu'un seuil donné est atteint (un chenillard lumineux)

Le problème est que le pattern lumineux s'arrête aussitôt dès que le MEMS repasse sous le seuil et le chenillard se retrouve "coincé" le long de la bande de leds.

Ma question est la suivante :
Comment lui permettre de poursuivre sa course jusqu'au bout ?

Voici le code pour le chenillard et la technique la moyenne des échantillons est ici : Signal moyen d'un MEMS
J'évite de mettre mon sketch en entier pour la lisibilité mais c'est possible.

void slideup(){
  EVERY_N_MILLIS_I(thisTimer,20) {                          

 //variable pour "deplacer" le long du strip
ledLoc = (ledLoc+1) % (NUM_LEDS-1);  
leds[ledLoc] = CRGB::White;

	}
   fadeToBlackBy(leds, NUM_LEDS, 8); 
  FastLED.show();
}

il faut mémoriser le fait que l'animation doit avoir lieu si le seuil a été dépassé pas s'il est dépassé.

En terme de code comment exprime-t-on " si le seuil a été dépassé" plutôt que s'il est dépassé ??

Actuellement j'utilise un simple booléen pour comparer le seuil et déclencher la fonction.
voici la loop (basée sur vos explications)

void loop() {
  int analogValue = analogRead(signalPin);
  int analogVolts = analogReadMilliVolts(signalPin);
  if (nouvelleMoyenne()) {
    Serial.print("Moyenne = ");
    if (nbEchantillons != 0) {
      double moyenne = sommeEchantillons / nbEchantillons;
     // Serial.println(moyenne);
      if (moyenne > 1960) {
         Serial.println(moyenne);
       slideup();
      } else {
        fadeall();
      }
    } else {
      Serial.println("Nan");
    }
    nouvelleMoyenne(true); // on amorce à nouveau
  }
}

Le booléen doit devenir vrai lorsque le seuil est franchi mais il ne redeviendra faux que lorsque la séquence sera terminée.

1 Like

il faut sortir le code de l'animation du code qui teste le seuil.

le principe (à affiner suivant vos besoins)

// variable globale
bool animationEnCours = false;
...

// dans la loop

if (! animationEnCours) {
  // si l'animation n'est pas en cours, regarder s'il faut la déclencher
  if (moyenne > 1960) {
    animationEnCours = true;
  }
} else {
  // jouer une étape l'animation
  ...
  // penser à mettre animationEnCours à false quand l'animation est finie.
}


1 Like

Oui je me souviens de ça, c'est la technique qui consiste à mettre un "flag". Merci beaucoup.