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);
}
}
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
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 1empê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.