Probleme de programme qui ''bloc'' avec lecture donnée module Ultra son HC04

bonjour à tous ,

Voila mon souci , je réalise un projet afin de piloter des projecteurs en commande DMX avec un capteur ultra son ( commande avec la main )
Sur le principe tout fonctionne correctement , cependant la réaction du programme est parfois étrange , de temps en temps le programme ce ''bloc'' , il n'y a plus de fluctuation des valeurs envoyées , les leds de contrôles ce blocs à l'heure dernier état , et la valeur dmx envoyé reste bloqué également , mais cela dure que 2 /3 secondes , et encore une fois c'est aléatoire ..

j'ai quand même observé que ce phénomène , arrivait quand j'étais proche du capteur ultra son , voir très proche ...
je voudrais avoir votre avis , peu être que j'atteint les limites de l'arduino , je lui en demande de trop ?

Voici le code
merci de votre aide :slight_smile:

#include <DmxSimple.h>

int pin[10]={4,5,6,7,8,9,10,11,12,13};


const int ARM = A1 ;// Armement 
int ledrgeState = LOW ;
long previousMillis = 0 ;
long interval = 200 ;

int trig =  3 ;
int echo = 2 ; 
long lecture_echo; 
long cm;



int entree = A0;
int ArmState = HIGH;
int etatbouton;
int memoire_entree = HIGH;

void setup() {

  pinMode(entree,INPUT_PULLUP);
  pinMode(ARM, OUTPUT);
  
  pinMode(trig, OUTPUT); 
  digitalWrite(trig, LOW); 
  pinMode(echo, INPUT); 
  
  DmxSimple.usePin(1);   
  DmxSimple.maxChannel(2);
  
  for (int i = 0 ; i<=10 ; i++){ 
  pinMode(pin[i], OUTPUT);
  }

for (int i = 0 ; i<=10 ; i++){ 
digitalWrite(pin[i], HIGH);
delay(60);
digitalWrite(pin[i], LOW);
}


for (int i = 10 ; i>=0 ; i--){ 
digitalWrite(pin[i], HIGH);
delay(60);
digitalWrite(pin[i], LOW);
}
  
  
  

}

void loop() {
  
  
 ///////////////////////////////////////
  digitalWrite(trig, HIGH); 
  delayMicroseconds(10); 
  digitalWrite(trig, LOW); 
  lecture_echo = pulseIn(echo, HIGH); 
  cm = (lecture_echo / 58) ; 
  
  
 

  ///////////////////////////////////////
 if(cm<=4) {
    DmxSimple.write(1, 255);
     digitalWrite(pin[0], HIGH); 
     digitalWrite(pin[1], HIGH);
     digitalWrite(pin[2], HIGH);  
     digitalWrite(pin[3], HIGH); 
     digitalWrite(pin[4], HIGH); 
     digitalWrite(pin[5], HIGH); 
     digitalWrite(pin[6], HIGH);
     digitalWrite(pin[7], HIGH);
     digitalWrite(pin[8], HIGH); 
     digitalWrite(pin[9], HIGH); 
  }
  else if((cm>4)&&(cm<=8)) {
    DmxSimple.write(1, 250);
     digitalWrite(pin[0], HIGH); 
     digitalWrite(pin[1], HIGH);
     digitalWrite(pin[2], HIGH);  
     digitalWrite(pin[3], HIGH); 
     digitalWrite(pin[4], HIGH); 
     digitalWrite(pin[5], HIGH); 
     digitalWrite(pin[6], HIGH);
     digitalWrite(pin[7], HIGH);
     digitalWrite(pin[8], HIGH); 
     digitalWrite(pin[9], LOW);   
  }
  else if((cm>8)&&(cm<=12)) {
     DmxSimple.write(1, 200);
      digitalWrite(pin[0], HIGH); 
     digitalWrite(pin[1], HIGH);
     digitalWrite(pin[2], HIGH);  
     digitalWrite(pin[3], HIGH); 
     digitalWrite(pin[4], HIGH); 
     digitalWrite(pin[5], HIGH); 
     digitalWrite(pin[6], HIGH);
     digitalWrite(pin[7], HIGH);
     digitalWrite(pin[8], LOW); 
     digitalWrite(pin[9], LOW); 
  }
  else if((cm>12)&&(cm<=16)) {
     DmxSimple.write(1, 170);
      digitalWrite(pin[0], HIGH); 
     digitalWrite(pin[1], HIGH);
     digitalWrite(pin[2], HIGH);  
     digitalWrite(pin[3], HIGH); 
     digitalWrite(pin[4], HIGH); 
     digitalWrite(pin[5], HIGH); 
     digitalWrite(pin[6], HIGH);
     digitalWrite(pin[7], LOW);
     digitalWrite(pin[8], LOW); 
     digitalWrite(pin[9], LOW); 
  }
  else if((cm>16)&&(cm<=20)) {
     DmxSimple.write(1, 150);
      digitalWrite(pin[0], HIGH); 
     digitalWrite(pin[1], HIGH);
     digitalWrite(pin[2], HIGH);  
     digitalWrite(pin[3], HIGH); 
     digitalWrite(pin[4], HIGH); 
     digitalWrite(pin[5], HIGH); 
     digitalWrite(pin[6], LOW);
     digitalWrite(pin[7], LOW);
     digitalWrite(pin[8], LOW); 
     digitalWrite(pin[9], LOW); 
  } 
 
  else if((cm>20)&&(cm<=24)) {
    DmxSimple.write(1, 120);
      digitalWrite(pin[0], HIGH); 
     digitalWrite(pin[1], HIGH);
     digitalWrite(pin[2], HIGH);  
     digitalWrite(pin[3], HIGH); 
     digitalWrite(pin[4], HIGH); 
     digitalWrite(pin[5], LOW); 
     digitalWrite(pin[6], LOW);
     digitalWrite(pin[7], LOW);
     digitalWrite(pin[8], LOW); 
     digitalWrite(pin[9], LOW);  
  }
  else if((cm>24)&&(cm<=28)) {
     DmxSimple.write(1, 105);
      digitalWrite(pin[0], HIGH); 
     digitalWrite(pin[1], HIGH);
     digitalWrite(pin[2], HIGH);  
     digitalWrite(pin[3], HIGH); 
     digitalWrite(pin[4], LOW); 
     digitalWrite(pin[5], LOW); 
     digitalWrite(pin[6], LOW);
     digitalWrite(pin[7], LOW);
     digitalWrite(pin[8], LOW); 
     digitalWrite(pin[9], LOW);  
  }
  else if((cm>28)&&(cm<=32)) {
     DmxSimple.write(1, 80);
     digitalWrite(pin[0], HIGH); 
     digitalWrite(pin[1], HIGH);
     digitalWrite(pin[2], HIGH);  
     digitalWrite(pin[3], LOW); 
     digitalWrite(pin[4], LOW); 
     digitalWrite(pin[5], LOW); 
     digitalWrite(pin[6], LOW);
     digitalWrite(pin[7], LOW);
     digitalWrite(pin[8], LOW); 
     digitalWrite(pin[9], LOW); 
         
  }
  else if((cm>32)&&(cm<=36)) {
     DmxSimple.write(1, 60);
     digitalWrite(pin[0], HIGH); 
     digitalWrite(pin[1], HIGH);
     digitalWrite(pin[2], LOW);  
     digitalWrite(pin[3], LOW); 
     digitalWrite(pin[4], LOW); 
     digitalWrite(pin[5], LOW); 
     digitalWrite(pin[6], LOW);
     digitalWrite(pin[7], LOW);
     digitalWrite(pin[8], LOW); 
     digitalWrite(pin[9], LOW);  
  } 
  else if((cm>36)&&(cm<=40)) {
     DmxSimple.write(1, 30);
     digitalWrite(pin[0], HIGH); 
     digitalWrite(pin[1], LOW);
     digitalWrite(pin[2], LOW);  
     digitalWrite(pin[3], LOW); 
     digitalWrite(pin[4], LOW); 
     digitalWrite(pin[5], LOW); 
     digitalWrite(pin[6], LOW);
     digitalWrite(pin[7], LOW);
     digitalWrite(pin[8], LOW); 
     digitalWrite(pin[9], LOW); 
  } 
 
 else {
     DmxSimple.write(1, 0); 
     digitalWrite(pin[0], LOW);
     digitalWrite(pin[1], LOW); 
     digitalWrite(pin[2], LOW);
     digitalWrite(pin[3], LOW); 
     digitalWrite(pin[4], LOW);
     digitalWrite(pin[5], LOW); 
     digitalWrite(pin[6], LOW);
     digitalWrite(pin[7], LOW); 
     digitalWrite(pin[8], LOW);
     digitalWrite(pin[9], LOW); 
  } 
 
 delay(80); 
 
 
 
 ///////////////////////////////////////////////////////////////////

 // lecture de l'état du bouton 
    etatbouton = digitalRead(entree);

    // Si le bouton a un état différent de celui enregistré ET
    // que cet état est "appuyé"
    if((etatbouton != memoire_entree) && (etatbouton == LOW))
    {      
       ArmState = !ArmState;
     
  }  
  
 if ( ArmState ==LOW)
  { 
   DmxSimple.write(2, 255);
   
      unsigned long currentMillis = millis() ;
    if ( currentMillis - previousMillis >= interval && ArmState ==LOW ) {
      previousMillis = currentMillis ;
      if ( ledrgeState == LOW )
      ledrgeState = HIGH;
      else
      ledrgeState = LOW;
      
      digitalWrite(ARM,ledrgeState);
      }
 }
 
 
 if ( ArmState ==HIGH)
 {
 DmxSimple.write(2, 0);
 digitalWrite(ARM,LOW);
  }
 
 memoire_entree=etatbouton;
  
 ///////////////////////////////////////////////////////////////////

}

Ton code peut être simplifié, mais je ne vois rien qui le ralentisse, à part le delay(80) dans la loop.

Si tu veux voir plus précisément ce qui se passe dans le code, met des lignes pour afficher des messages dans la console. Dans ce cas, il faudra changer la pin 1 ici : les pins 0 et 1 servent pour la liaison série avec le PC

DmxSimple.usePin(1);

EDIT : quelques erreurs dans ta gestion du tableau pin[] : de dimension 10, l'indice varie de 0 à 9. Ca change ceci dans le setup :

for (int i = 0 ; i < 10 ; i++) {
    pinMode(pin[i], OUTPUT);
  }

  for (int i = 0 ; i < 10 ; i++) {
    digitalWrite(pin[i], HIGH);
    delay(60);
    digitalWrite(pin[i], LOW);
  }


  for (int i = 9 ; i >= 0 ; i--) {
    digitalWrite(pin[i], HIGH);
    delay(60);
    digitalWrite(pin[i], LOW);
  }

J'ai un peu simplifié ta gestion du test de la distance :

#include <DmxSimple.h>

int pin[10] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int dmxValue [10] = {255, 250, 200, 170, 150, 120, 105, 80, 60, 30};

const int ARM = A1 ;// Armement
bool ledrgeState = LOW ;
unsigned long previousMillis = 0 ;
unsigned long interval = 200ul ;

const int trig =  3 ;
const int echo = 2 ;
long lecture_echo;
long cm;

const int entree = A0;
bool ArmState = HIGH;
bool etatbouton;
int memoire_entree = HIGH;

void setup() {

  pinMode(entree, INPUT_PULLUP);
  pinMode(ARM, OUTPUT);

  pinMode(trig, OUTPUT);
  digitalWrite(trig, LOW);
  pinMode(echo, INPUT);

  DmxSimple.usePin(1);
  DmxSimple.maxChannel(2);

  for (int i = 0 ; i < 10 ; i++) {
    pinMode(pin[i], OUTPUT);
  }

  for (int i = 0 ; i < 10 ; i++) {
    digitalWrite(pin[i], HIGH);
    delay(60);
    digitalWrite(pin[i], LOW);
  }


  for (int i = 9 ; i >= 0 ; i--) {
    digitalWrite(pin[i], HIGH);
    delay(60);
    digitalWrite(pin[i], LOW);
  }

}

void loop() {

  ///////////////////////////////////////
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  lecture_echo = pulseIn(echo, HIGH);
  cm = (lecture_echo / 58) ;

  ///////////////////////////////////////
  if (cm > 40) {
    DmxSimple.write(1, 0);
    for (int j = 0; j < 10; j++) digitalWrite(pin[j], LOW);
  } else {
    for (int i = 0; i < 10; i++) {
      if (cm > i * 4 && cm <= (i + 1) * 4)) {
        DmxSimple.write(1, dmxValue[i]);
        for (int j = 0; j < 10 - i; j++) digitalWrite(pin[j], HIGH);
        for (int j = 10 - i; j < 10; j++) digitalWrite(pin[j], LOW);
      }
    }
  }

  //
  //  if (cm <= 4) {
  //    DmxSimple.write(1, 255);
  //    digitalWrite(pin[0], HIGH);
  //    digitalWrite(pin[1], HIGH);
  //    digitalWrite(pin[2], HIGH);
  //    digitalWrite(pin[3], HIGH);
  //    digitalWrite(pin[4], HIGH);
  //    digitalWrite(pin[5], HIGH);
  //    digitalWrite(pin[6], HIGH);
  //    digitalWrite(pin[7], HIGH);
  //    digitalWrite(pin[8], HIGH);
  //    digitalWrite(pin[9], HIGH);
  //  }
  //  else if ((cm > 4) && (cm <= 8)) {
  //    DmxSimple.write(1, 250);
  //    digitalWrite(pin[0], HIGH);
  //    digitalWrite(pin[1], HIGH);
  //    digitalWrite(pin[2], HIGH);
  //    digitalWrite(pin[3], HIGH);
  //    digitalWrite(pin[4], HIGH);
  //    digitalWrite(pin[5], HIGH);
  //    digitalWrite(pin[6], HIGH);
  //    digitalWrite(pin[7], HIGH);
  //    digitalWrite(pin[8], HIGH);
  //    digitalWrite(pin[9], LOW);
  //  }
  //  else if ((cm > 8) && (cm <= 12)) {
  //    DmxSimple.write(1, 200);
  //    digitalWrite(pin[0], HIGH);
  //    digitalWrite(pin[1], HIGH);
  //    digitalWrite(pin[2], HIGH);
  //    digitalWrite(pin[3], HIGH);
  //    digitalWrite(pin[4], HIGH);
  //    digitalWrite(pin[5], HIGH);
  //    digitalWrite(pin[6], HIGH);
  //    digitalWrite(pin[7], HIGH);
  //    digitalWrite(pin[8], LOW);
  //    digitalWrite(pin[9], LOW);
  //  }
  //  else if ((cm > 12) && (cm <= 16)) {
  //    DmxSimple.write(1, 170);
  //    digitalWrite(pin[0], HIGH);
  //    digitalWrite(pin[1], HIGH);
  //    digitalWrite(pin[2], HIGH);
  //    digitalWrite(pin[3], HIGH);
  //    digitalWrite(pin[4], HIGH);
  //    digitalWrite(pin[5], HIGH);
  //    digitalWrite(pin[6], HIGH);
  //    digitalWrite(pin[7], LOW);
  //    digitalWrite(pin[8], LOW);
  //    digitalWrite(pin[9], LOW);
  //  }
  //  else if ((cm > 16) && (cm <= 20)) {
  //    DmxSimple.write(1, 150);
  //    digitalWrite(pin[0], HIGH);
  //    digitalWrite(pin[1], HIGH);
  //    digitalWrite(pin[2], HIGH);
  //    digitalWrite(pin[3], HIGH);
  //    digitalWrite(pin[4], HIGH);
  //    digitalWrite(pin[5], HIGH);
  //    digitalWrite(pin[6], LOW);
  //    digitalWrite(pin[7], LOW);
  //    digitalWrite(pin[8], LOW);
  //    digitalWrite(pin[9], LOW);
  //  }
  //
  //  else if ((cm > 20) && (cm <= 24)) {
  //    DmxSimple.write(1, 120);
  //    digitalWrite(pin[0], HIGH);
  //    digitalWrite(pin[1], HIGH);
  //    digitalWrite(pin[2], HIGH);
  //    digitalWrite(pin[3], HIGH);
  //    digitalWrite(pin[4], HIGH);
  //    digitalWrite(pin[5], LOW);
  //    digitalWrite(pin[6], LOW);
  //    digitalWrite(pin[7], LOW);
  //    digitalWrite(pin[8], LOW);
  //    digitalWrite(pin[9], LOW);
  //  }
  //  else if ((cm > 24) && (cm <= 28)) {
  //    DmxSimple.write(1, 105);
  //    digitalWrite(pin[0], HIGH);
  //    digitalWrite(pin[1], HIGH);
  //    digitalWrite(pin[2], HIGH);
  //    digitalWrite(pin[3], HIGH);
  //    digitalWrite(pin[4], LOW);
  //    digitalWrite(pin[5], LOW);
  //    digitalWrite(pin[6], LOW);
  //    digitalWrite(pin[7], LOW);
  //    digitalWrite(pin[8], LOW);
  //    digitalWrite(pin[9], LOW);
  //  }
  //  else if ((cm > 28) && (cm <= 32)) {
  //    DmxSimple.write(1, 80);
  //    digitalWrite(pin[0], HIGH);
  //    digitalWrite(pin[1], HIGH);
  //    digitalWrite(pin[2], HIGH);
  //    digitalWrite(pin[3], LOW);
  //    digitalWrite(pin[4], LOW);
  //    digitalWrite(pin[5], LOW);
  //    digitalWrite(pin[6], LOW);
  //    digitalWrite(pin[7], LOW);
  //    digitalWrite(pin[8], LOW);
  //    digitalWrite(pin[9], LOW);
  //
  //  }
  //  else if ((cm > 32) && (cm <= 36)) {
  //    DmxSimple.write(1, 60);
  //    digitalWrite(pin[0], HIGH);
  //    digitalWrite(pin[1], HIGH);
  //    digitalWrite(pin[2], LOW);
  //    digitalWrite(pin[3], LOW);
  //    digitalWrite(pin[4], LOW);
  //    digitalWrite(pin[5], LOW);
  //    digitalWrite(pin[6], LOW);
  //    digitalWrite(pin[7], LOW);
  //    digitalWrite(pin[8], LOW);
  //    digitalWrite(pin[9], LOW);
  //  }
  //  else if ((cm > 36) && (cm <= 40)) {
  //    DmxSimple.write(1, 30);
  //    digitalWrite(pin[0], HIGH);
  //    digitalWrite(pin[1], LOW);
  //    digitalWrite(pin[2], LOW);
  //    digitalWrite(pin[3], LOW);
  //    digitalWrite(pin[4], LOW);
  //    digitalWrite(pin[5], LOW);
  //    digitalWrite(pin[6], LOW);
  //    digitalWrite(pin[7], LOW);
  //    digitalWrite(pin[8], LOW);
  //    digitalWrite(pin[9], LOW);
  //  }
  //
  //  else {
  //    DmxSimple.write(1, 0);
  //    digitalWrite(pin[0], LOW);
  //    digitalWrite(pin[1], LOW);
  //    digitalWrite(pin[2], LOW);
  //    digitalWrite(pin[3], LOW);
  //    digitalWrite(pin[4], LOW);
  //    digitalWrite(pin[5], LOW);
  //    digitalWrite(pin[6], LOW);
  //    digitalWrite(pin[7], LOW);
  //    digitalWrite(pin[8], LOW);
  //    digitalWrite(pin[9], LOW);
  //  }
  //
  //  delay(80);
  //


  ///////////////////////////////////////////////////////////////////

  // lecture de l'état du bouton
  etatbouton = digitalRead(entree);

  // Si le bouton a un état différent de celui enregistré ET
  // que cet état est "appuyé"
  if ((etatbouton != memoire_entree) && (etatbouton == LOW)) ArmState = !ArmState;

  if ( ArmState == LOW) {
    DmxSimple.write(2, 255);

    unsigned long currentMillis = millis() ;
    if ( currentMillis - previousMillis >= interval ) {
      previousMillis = currentMillis ;
      ledrgeState = !ledrgeState;
      digitalWrite(ARM, ledrgeState);
    }
  } else {
    DmxSimple.write(2, 0);
    digitalWrite(ARM, LOW);
  }

  memoire_entree = etatbouton;

  ///////////////////////////////////////////////////////////////////
}

(pas testé ni compilé)