Go Down

Topic: additionner deux mesures des deux capteurs de distance (Read 123 times) previous topic - next topic

lmbgael

bonjour,

j'ai édité le programme afin de prendre en compte les mesures de distance avec deux télémètres . Sur un point 0 virtuel , un télémètre mesure la distance haute et l'autre la distance basse.
Je voudrais par conséquent additionner la mesure haute et la mesure basse afin de me donner sur l'écran lcd la mesure total additionnée des deux ....et j'y arrive pas.
Pour l'instant les distances de chaque télémètre se lis sur l'ecran ligne 1(capteur haut) et ligne 2(capteur bas).
merci de m'aiguiller de formule afin de pouvoir finir mon projet

<```
 #include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int USTrigHaut(6);
const int USEchoHaut(7);
const int USTrigBas(9);
const int USEchoBas(8);
float VITESSE =340;
 
void setup() {
 // LCD
 lcd.begin(2,16);
 // Message de demarage
 lcd.setCursor(2,0);
 lcd.print("LASER LMB.V2");
 lcd.setCursor(4,1);
 lcd.print("by  LMVP");
 delay(9000);
 lcd.clear();
 // telemetre SR04 1
pinMode(USTrigHaut, OUTPUT);
pinMode(USEchoHaut, INPUT);
// telemetre SR04 2
pinMode(USTrigBas, OUTPUT);
pinMode(USEchoBas, INPUT);

lcd.setCursor(0,0);            // Curseur positionné ligne "0" 1er caractère

 
}

void loop() {
 
    { // capteur haut
     
 // 1. Un état haut de 10 microsecondes est mis sur la broche "Trig"
  digitalWrite(USTrigHaut, HIGH);
  delayMicroseconds(10); //on attend 10 µs
  // 2. On remet à l'état bas la broche Trig
  digitalWrite(USTrigHaut, LOW);

  // 3. On lit la durée d'état haut sur la broche "Echo"
  unsigned long duree = pulseIn(USEchoHaut, HIGH);

  if(duree > 30000)
  {
     // si la durée est supérieure à 30ms, l'onde est perdue
     lcd.setCursor(0,0);  
     lcd.print ("Err.: Dist > 4m");
     delay(500);
     lcd.clear();
  }
  else
  {
     // 4. On divise cette durée par deux pour n'avoir qu'un trajet
     duree = duree/2;

     // 5. On calcule la distance avec la formule d=v*t
     float temps = duree/10000.0; //on met en secondes
     float dist = temps*VITESSE ; //on multiplie par la vitesse, d=t*v et on ajoute la largeur du boitier (qui compte pour la mesure)

     // 6. On affiche la distance
     lcd.setCursor(0,0);  
     lcd.print ("Dist: ");  
     lcd.setCursor(8,0);  
     lcd.print (dist);
  }

  // petite pause
  delay(250);  
    }
   {
    // capteur bas
   
 // 1. Un état haut de 10 microsecondes est mis sur la broche "Trig"
  digitalWrite(USTrigBas, HIGH);
  delayMicroseconds(10); //on attend 10 µs
  // 2. On remet à l'état bas la broche Trig
  digitalWrite(USTrigBas, LOW);



  if(duree > 30000)
  {
     // si la durée est supérieure à 30ms, l'onde est perdue
     lcd.setCursor(0,0);  
     lcd.print ("Err.: Dist > 4m");
     delay(500);
     lcd.clear();
  }
  else
  {
     // 4. On divise cette durée par deux pour n'avoir qu'un trajet
     duree = duree/2;

     // 5. On calcule la distance avec la formule d=v*t
     float temps = duree/10000.0; //on met en secondes
     float dist = temps*VITESSE ; //on multiplie par la vitesse, d=t*v et on ajoute la largeur du boitier (qui compte pour la mesure)

     // 6. On affiche la distance
     lcd.setCursor(0,1);  
     lcd.print ("Dist: ");  
     lcd.setCursor(8,1);  
     lcd.print (dist);
  }

  // petite pause
  delay(250);          
   }
}
```>

68tjs

Bonjour,
Une bonne solution pour avoir une réponse rapide et pertinente est de commencer par lire les messages épinglés. Notament "Règles du forum francophone" et "comment faire un nouveau message avec les balises "(code).

La première action à faire est de mettre le code entre balise code  (icone <>).
Au préalable indente le code dans l'IDE en faisant ctrl T, il sera plus lisible.

Pour éditer un message tu clique en dessous de cette fenètre à droite sur modify puis sur edit.
Les Shadocks : L'ignorance ne s'apprend pas.

al1fch

+1

... et de plus ça évitera l'ajout de smileys dans le code......

lesept

Il faut que tu comprennes l'utilisation des variables et notamment un point important : ce qu'on appelle "la portée des variables".

En gros, si tu définis une variable dans un bloc (des instructions entre un jeu d'accolades), cette variable n'est connue du programme qu'à l'intérieur de ce bloc.

Ça te permet de créer des variables ayant le même nom à plusieurs endroits de ton code, sans qu'elles se gênent. Mais par contre, une fois sorti du bloc, tu ne peux plus les utiliser.

Dans ton code, tu as créé deux blocs : un pour le capteur haut et un pour le capteur bas. Du coup, tes variables de distance existent seulement à l'intérieur de leur bloc respectif. Si tu veux les utiliser (additionner), il faut pouvoir les utiliser hors de leur bloc : dans ce cas, tu crées des variables globales, mais il leur faut chacune un nom différent.

Ensuite, tu n'as plus qu'à afficher la somme, au lieu d'afficher chaque distance.


Une autre solution serait de ne pas créer ces blocs, qui n'ont pas beaucoup d'intérêt. Tu nommes tes variables de distance distHaut et distBas, et tu affiches leur somme.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

lmbgael

bonjour,

merci pour votre aide et vos reponses
@68tjs , jai en effet modifié mais ca n'a pas changé grand chose....
@al1fch , oui un smiley qui c'est mis à la place du 8....
@lesept , merci , oui mon intention à l'origine n'était pas de les mettre en bloc mais sans les blocs un message d'erreur de programmation se mettait car doublons d'utilisation long duree dans le code du capteur bas et haut :

<long duree = pulseIn(USEchoBas, HIGH);
long duree = pulseIn(USEchoHaut, HIGH); >

lesept

Il faut que tu édites ton message (bouton More > Modify). Tu sélectionnes le code et tu cliques sur le bouton </>. Le ``` n'est pas valide sur ce forum.


Tu ne peux pas déclarer deux variables avec le même nom dans un même bloc. Mais tu peux utiliser plusieurs fois la même variable. Donc, pour la première fois tu conserves
Code: [Select]
long duree = pulseIn(USEchoBas, HIGH);
ensuite, plus besoin de la déclarer puisqu'elle existe déjà. Tu l'utilises simplement comme ceci :
Code: [Select]
duree = pulseIn(USEchoHaut, HIGH);
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up