Problème sur utilisation de 2 capteurs ultrasons simultanément

Bonjour,
j'essaie d'utiliser 2 capteurs à ultrasons( HC-SR04A) mais j'utilise la fonction millis() pour mesurer ces distances et les comparer en temps réel. J'ai déjà vérifié que cela ne venait pas du câblage ou du programme mais de la fonction millis() qui marche seulement pour le premier et le second renvoie systématiquement 0. En inversant les 2 cela produit le même résultat mais l'autre marche et le second non. Je souhaiterai savoir si vous pouvez m'aider à le faire marcher avec la fonction millis() si c'est possible ( car je l'utilise déjà pour d'autre programmes) ou me donner une autre manière d'y arriver.
Merci d'avance

saisissez ou collez du code ici
```#define BROCHE_ECHO1 7 // Broche Echo du HC-SR04 sur D7 //
#define BROCHE_TRIGGER1 8 // Broche Trigger du HC-SR04 sur D8 //
#define BROCHE_ECHO2 9 // Broche Echo du HC-SR04 sur D7 //
#define BROCHE_TRIGGER2 10 // Broche Trigger du HC-SR04 sur D8 //

// Definition des variables //

int MesureMaxi = 500; // Distance maxi a mesurer //
int MesureMini = 0.1; // Distance mini a mesurer //
long Duree1;
long Duree2;
long Distance1;
long Distance2;

void setup() {
  
  pinMode(BROCHE_TRIGGER1, OUTPUT); // Broche Trigger en sortie //
  pinMode(BROCHE_ECHO1, INPUT); // Broche Echo en entree //
  pinMode(BROCHE_TRIGGER2, OUTPUT); // Broche Trigger en sortie //
  pinMode(BROCHE_ECHO2, INPUT); // Broche Echo en entree //
  pinMode(11, OUTPUT);  // Définition des broches d'entrée des 2 LED
  pinMode(12, OUTPUT);
  Serial.begin (115200);
}

void loop() {

  // Debut de la mesure avec un signal de 10 µS applique sur TRIG //
  digitalWrite(BROCHE_TRIGGER1, LOW); // On efface l'etat logique de TRIG //
  delayMicroseconds(2);
  digitalWrite(BROCHE_TRIGGER1, HIGH); // On met la broche TRIG a "1" pendant 10µS //
  delayMicroseconds(10);
  digitalWrite(BROCHE_TRIGGER1, LOW); // On remet la broche TRIG a "0" //
  
  digitalWrite(BROCHE_TRIGGER2, LOW); // On efface l'etat logique de TRIG //
  delayMicroseconds(2);
  digitalWrite(BROCHE_TRIGGER2, HIGH); // On met la broche TRIG a "1" pendant 10µS //
  delayMicroseconds(10);
  digitalWrite(BROCHE_TRIGGER2, LOW); // On remet la broche TRIG a "0" //

  // On mesure combien de temps le niveau logique haut est actif sur ECHO //
  Duree1 = pulseIn(BROCHE_ECHO1, HIGH);
  Duree2 = pulseIn(BROCHE_ECHO2, HIGH);

  // Calcul de la distance grace au temps mesure //
  Distance1 = Duree1 * 0.034 / 2;
  Distance2 = Duree2 * 0.034 / 2;

  // Verification si valeur mesuree dans la plage //
  if (Distance1 <= MesureMini) {
    Serial.println("Distance1=0");
  }

  else {
    Serial.print("Distance1:");
    Serial.print(Distance1);
    delay(10);
  }
  if (Distance2 <= MesureMini) {
    Serial.println("Distance2=0");
  }
  
  else {
    Serial.print("Distance2:");
    Serial.println(Distance2);
    delay(10);
  }
}

Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone".

Que voulez vous qu’on fasse avec des images d’un code ? je ne comprends pas pourquoi certains pensent que c’est mieux que le code lui même…

:warning: lisez et appliquez les recommandations listées dans « Les bonnes pratiques du Forum Francophone”

Bonjour je ne savais pas qu'on pouvait le fournir directement c'est ma première fois.
Cordialement

hello
profites en pour changer le titre de ton post, le SR04 c'est de l'ultra son

TZT-HC-SR04-HCSR04-au-monde-D-tecteur-D-ondes-Ultrasoniques-Allant-Tech-HC-SR04-HC.jpg_80x80.jpg_-1

1 Like

Tout est indiqué dans le premier Post de la partie française.

Je n'ai pas trop compris ce que tu appel ne marche pas qu'elle sont les valeurs retournées sur le moniteur série.
Je n'ai pas compris non plus ce que tu veux faire avec millis, remplacer delay ?
D'ailleurs pourquoi place tu des delais dans tes else ?

Le code est illisible on va tranquillement attendre d'avoir un code correctement présenté et quelques infos supplémentaires.
De ce que j'ai décrypté, je pense qu'il doit y avoir carambolage dans la gestion des capteurs.

Illisible quand même pas.
Mais il manque surement un peu d'information pour qu'un non spécialiste comme moi puisse l'aider, après un habitué de ce genre de capteur, doit savoir si on peut ce permettre de faire une attente active pour envoyer sa vague, puis encore une attente pour la réception.
D'ailleurs comme ça sans vraiment y réfléchir, je n'utiliserais pas la fonction pulseIn dans ce cas

bonsoir,

l'utilisation de pulseIn() est conforme à l'exemple donné dans la doc fournie avec le module.

c'est le séquencement des actions qui pose problème : les 2 ordres d'émission sont effectués simultanément (à qqs. µs près).

il faudrait émettre sur Trig1 puis mesurer sur Echo1, pour seulement ensuite refaire de même pour le module 2 : on ne peut pas effectuer les 2 actions "imbriquées" car (dans la succession d'instructions de ton code actuel) l'attente du retour (écho) de 1 empêche de voir le retour de 2.

Et aussi, un module SR04 ne peut pas savoir si l'écho qu'il mesure c'est le retour de la salve qu'il a envoyée ou celle du voisin donc potentiellement des erreurs de mesure.
Lorsqu'on utilise 2 modules il faut faire les mesures l'une après l'autre en laissant un temps mort entre les 2 au moins égal à la distance maximale que le capteur peut détecter afin de ne pas être perturbé par des échos multiples. Sur les doc des capteurs il est généralement préconisé entre 50 et 60 ms entre 2 mesures.

hello
sans oublier qu'il y a un troisième paramètre à l'instruction pulsein, c'est le time out. par défaut il est d'une seconde.

Bonjour, merci à tous il suffisait simplement de calculer la durée 1 avant de tester la broche trigger2 pour faire fonctionner le tout.

et donc faire ce que je préconisais au post#9

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.