valeur attribuée à une variable sans instruction

Bonjour à tous !

Je suis entrain de réaliser un éclairage DEL qui s’allume lorsqu’on passe la pain devant un PIR, puis, dans les 8s de delai de récupération du PIR, cet éclairage est controlable par un capteur infrasonique (dont j’arrive à entendre les impulsions).

J’ai donc construit mon script mais, lorsque je l’essai, je suis confronté à un bien étrange problème.
Alors que je donne soit la valeur 0 soit la valeur 1 à une variable (nommée delai_expiree ci dessous), dans le moniteur série, je vois apparaitre les valeurs de la distance d’un objet via le capteur infrasonique. Je n’ai absolument aucune idée d’où cela peut venir mais mon script ne marche pas du tout à cause de ça …

int mesures_precedentes[Nombre_de_valeur]= {10};
int fait = 0;

int interval;
int delai_expiree=1;

void setup() {
  Serial.begin(115200);

  for(int i=0; i<Nombre_de_valeur; i++){
    mesures_precedentes[i]=Distance_Max;
  }

  pinMode(TRIGGER_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  digitalWrite(TRIGGER_PIN, LOW);
  
  // tell FastLED about the LED strip configuration
  FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setBrightness(255);
}

void loop(){
  if(on_off==0 && delai_expiree==1){ //si le bandeau est éteint et que le PIR a été declenché pour la derniere fois il y a moins de 10s alors on execute une fois l action ci dessous
    Etat = digitalRead(PIR_PIN);
    Serial.println(delai_expiree);
    Serial.println(Etat);
    if (Etat == HIGH) {
      if (PIR_etat == LOW) {
        delai_expiree = 0; //le PIR a été declenché il y a moins de 10s
        on_off = 1;
        PIR_etat = HIGH;
        allumer();
        interval = millis(); //on enregistre l'instant auquel le PIR a ete declenche
      }
    }
    else {
      PIR_etat = LOW;
      // on reinitialise le tableau de valeurs
      for(int i=0; i<Nombre_de_valeur; i++){
        mesures_precedentes[i]=Distance_Max;
      }
    }
  } else {
    if(millis()-interval>10000){ // si le PIR a ete declenche il y a plus de 10s, alors le delai est passe et on autorise le passage dans la boucle if initiale
      delai_expiree = 1;
    }
    Serial.println("delai");
    Serial.println(delai_expiree); //imprime les valeurs de "mesures_precedentes[20]"}
    mesure();
  }
  delay(40);
}



// le probleme vient surement d au dessus
// ========================================
// fonctions auxiliaires



void mesure(){
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);
  long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);
  distance_cm = (int)(measure / 20.0 * SOUND_SPEED);
  
  tableau_glissant();
  
  existence_de_valeur_max();
  if(fait == 1 && nombre_de_max==Nombre_de_valeur){
    fait = 0;
  }
  // si il existe au moins une valeur qui n est pas la valeur max, alors on réalise qu'une seule fois l action qui est dans le if
  if(fait == 0 && nombre_de_max<Nombre_de_valeur){
    fait = 1;
    on_off = (on_off+1)%2;
    if(on_off==0){
      eteindre();
    }else{
      allumer();
    }
  }  
}

// allume le bandeau DEL
void allumer(){
  for(int i = 0; i < 10; i++) {
    leds[i] = CRGB( 10, 10, 10);
  }
  FastLED.show();
}

// eteint le bandeau DEL
void eteindre(){
  for(int i = 0; i < 10; i++) {
    leds[i] = CRGB( 0, 0, 0);
  }
  FastLED.show();
}

//tableau récapitulatif des 20 dernieres mesures de proximité
void tableau_glissant(){
  for(int i = Nombre_de_valeur; i > 0; i--) {
    mesures_precedentes[i] = mesures_precedentes[i-1];
  }
  mesures_precedentes[0] = distance_cm;
}

//regarde si la valeur max existe dans le tableau
void existence_de_valeur_max(){
  nombre_de_max = 0;
  for(int i = 0; i < Nombre_de_valeur; i++) {
    if(mesures_precedentes[i] == Distance_Max){
      nombre_de_max += 1;
    }
  }
}

Bonjour, Il manque un partie du code avec la déclaration des variables. Corrige ton premier post en collant le code complet s'il te plait.

L'erreur est sans doute ici

//tableau récapitulatif des 20 dernieres mesures de proximité
void tableau_glissant(){
  for(int i = Nombre_de_valeur; i > 0; i--) {
    mesures_precedentes[i] = mesures_precedentes[i-1];
  }
  mesures_precedentes[0] = distance_cm;
}

Nombre_de_valeur c'est la taille du tableau. L'index du dernier élément c'est Nombre_de_valeur*-1* L'index dans la boucle for devrait donc commencer à Nombre_de_valeur-1 Comme tu débordes du tableau tu dois écraser la variable qui est située derrière ton tableau en mémoire et c'est ce que tu affiches

Tu peux programmer ça avec une machine à états assez simple. Voir le tuto de J-M-L dans la section tutos.

Au départ tu es dans l'état 1,et le bandeau est allumé ou éteint selon la valeur de la variable onoff. L'état 1 attend que le PIR fasse une mesure. Dès qu'il a fait une mesure, tu changes onoff et le bandeau, et tu lances un chrono.

Puis tu passes dans l'état 2, dans lequel tu restes tant que les 8 secondes ne sont pas écoulées. Dans cet état, tu utilises le capteur infrason et à chaque mesure, tu changes onoff et le bandeau.

Au bout des 8 secondes, tu reviens à l'état 1.

Bonjour à vous deux !

Je vous remercie énormement pour l'aide que vous m'apportez !

@fdufnews, il semble que le problème venait de là ! Je ne risquais pas de l'identifier de si tôt ;-)

@lesept merci beaucoup pour ce conseil ! Je suis déjà entrain de lire ce tuto :-) Ca va surement ameliorer un peu la présentation de mon code ;-)

Passez une bonne journée