Go Down

### Topic: Mesurer un intervalle de temps  (Read 2507 times)previous topic - next topic

#### chriiss62

##### Jan 15, 2017, 04:23 pm
Bonjour
Voila je voudrais mesurer le temps qui s'écoule entre le moment ou j appuie sur bp9 et celui ou j appuie sur bp10 et afficher cette valeur sur le moniteur série

Code: [Select]
`#define  Bp9 = 9 #define Bp10 = 10 unsigned long temps1 = 0 ;unsigned long temps2 = 0 ;float temps3 = 0 ;void setup() {  Serial.begin(9600);  pinMode(Bp9,INPUT_PULLUP);  pinMode (Bp10,INPUT_PULLUP);}void loop() { if (! digitalRead(Bp9)) { delay (50); temps1 = millis(); while (! digitalread(Bp9)); delay(50); }  if (! digitalRead(Bp10)) { delay (50); temps2 = millis(); while (! digitalread(Bp10)); delay(50); }temps3 = (temps2 - temps1);println(temps3);}[code]Mais j obtiens les messages d 'erreurs suivants Arduino : 1.7.10 (Windows 7), Carte : "Arduino Uno"sketch_jan15b.ino: In function 'void setup()':sketch_jan15b.ino:1:14: error: expected primary-expression before '=' tokensketch_jan15b.ino:11:11: note: in expansion of macro 'Bp9'sketch_jan15b.ino:2:14: error: expected primary-expression before '=' tokensketch_jan15b.ino:12:12: note: in expansion of macro 'Bp10'sketch_jan15b.ino: In function 'void loop()':sketch_jan15b.ino:1:14: error: expected primary-expression before '=' tokensketch_jan15b.ino:18:20: note: in expansion of macro 'Bp9'sketch_jan15b.ino:1:14: error: expected primary-expression before '=' tokensketch_jan15b.ino:22:23: note: in expansion of macro 'Bp9'sketch_jan15b.ino:22:26: error: 'digitalread' was not declared in this scopesketch_jan15b.ino:2:14: error: expected primary-expression before '=' tokensketch_jan15b.ino:26:20: note: in expansion of macro 'Bp10'sketch_jan15b.ino:2:14: error: expected primary-expression before '=' tokensketch_jan15b.ino:30:23: note: in expansion of macro 'Bp10'sketch_jan15b.ino:30:27: error: 'digitalread' was not declared in this scopesketch_jan15b.ino:36:15: error: 'println' was not declared in this scopeErreur lors de la compilation.  Ce rapport contiendrait plus d'informations si l'option  "Montrer les informations de sortie pendant la compilation"  était activée dans Fichier > Préférences.Merci pour votre aide `

#### kamill

#1
##### Jan 15, 2017, 04:37 pm
Bonjour,

Ce n'est pas
Code: [Select]
`#define  Bp9 = 9#define Bp10 = 10`
Mais
Code: [Select]
`#define  Bp9  9#define Bp10  10`

#### chriiss62

#2
##### Jan 15, 2017, 04:44 pm
merci kamill

je fatigue lol

j ai aussi corrigé le Serial.println  j avais oublié Serial

mais j ai encore qqs erreurs

Arduino : 1.7.10 (Windows 7), Carte : "Arduino Uno"

sketch_jan15b.ino: In function 'void loop()':

sketch_jan15b.ino:22:26: error: 'digitalread' was not declared in this scope

sketch_jan15b.ino:30:27: error: 'digitalread' was not declared in this scope

Erreur lors de la compilation.

Ce rapport contiendrait plus d'informations si l'option
"Montrer les informations de sortie pendant la compilation"
était activée dans Fichier > Préférences.

#### chriiss62

#3
##### Jan 15, 2017, 04:54 pm
Je fatigue vraiment J ai trouvé l erreur

Manqué une majuscule à Read

#### chriiss62

#4
##### Jan 15, 2017, 05:22 pm
J ai corrigé le code il fonctionne

Code: [Select]
`#define  Bp9  9 #define Bp10  10 unsigned long temps1 = 0 ;unsigned long temps2 = 0 ;float temps3 = 0 ;void setup() {  Serial.begin(9600);  pinMode(Bp9,INPUT_PULLUP);  pinMode (Bp10,INPUT_PULLUP);}void loop() { if (! digitalRead(Bp9)) { delay (50); temps1 = millis(); while (! digitalRead(Bp9)); delay(50); }  if (! digitalRead(Bp10)) { delay (50); temps2 = millis(); while (! digitalRead(Bp10)); delay(50); }temps3 = ((temps2 - temps1)/1000);Serial.println(temps3);}`

Par contre je rencontre un pb

j appuie sur bp 9 au bout de 10s
j appuie sur bp10  5 s plus tard

et temps3 m affiche 15s

pkoi la soustraction ne se fait elle pas ?

cordialement chris

#### kamill

#5
##### Jan 15, 2017, 06:11 pm
Ca devrait fonctionner. Tu as pas inversé bp9 et bp10?

#### chriiss62

#6
##### Jan 15, 2017, 06:28 pm
mon nouveau code qui fonctionne

Code: [Select]
`#define  Bp9  9 #define Bp10  10 unsigned long temps1 = 0 ;unsigned long temps2 = 0 ;unsigned long temps3 = 0 ;float temps4 = 0.0;void setup() {  Serial.begin(9600);  pinMode(Bp9,INPUT_PULLUP);  pinMode (Bp10,INPUT_PULLUP);}void loop() { if (! digitalRead(Bp9)) { delay (50); temps1 = millis(); while (! digitalRead(Bp9)); delay(50); }  if (! digitalRead(Bp10)) { delay (50); temps2 = millis(); while (! digitalRead(Bp10)); delay(50); }temps3 = (temps2 - temps1);if (temps3>0){temps4=((float)temps3/1000.0);Serial.println(temps4);}}`

Qui peut m aider

J appuie sur Bp9 au bout de 5s

Est il possible d'éviter à temps4 d'afficher 4294962 avant un appui sur Bp 10 pour qu il me donne le bon intervalle de temps

merci

#### chriiss62

#7
##### Jan 16, 2017, 09:11 am
Car ensuite j aimerais calculer la vitesse de mon robot en km/h

J'utiliserais deux capteurs à I.R séparés d'une distance connue

Ensuite affiché cette vitesse sur un écran lcd  mais la j y pas encore

Merci Chris

#### J-M-L

#8
##### Jan 16, 2017, 09:42 am
C'est un peu dommage de faire des delay(50); avant d'enregistrer le moment d'appui...
C'est aussi un peu dommage de faire des attentes actives sur le relâchement du bouton.

Pour votre question mettez un booleen pour dire si le second bouton à été appuyé et tester le avant de faire l'affichage ou alors initialisez temps2 à zéro et tant qu'il est 0 ne pas faire l'affichage; (pensez  le remettre à 0 ou le booléen à faux une fois l'affichage effectué)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

#### kamill

#9
##### Jan 16, 2017, 11:39 am
Est il possible d'éviter à temps4 d'afficher 4294962 avant un appui sur Bp 10 pour qu il me donne le bon intervalle de temps
Il y avait de l'idée dans ton programme avec if (temps3>0), cependant la différence de deux unsigned est toujours ≥ 0. Donc il faut remplacer par le test suivant:
Code: [Select]
`if (temps2>temps1)`

#### bricoleau

#10
##### Jan 16, 2017, 01:22 pm
Bonjour

Le problème fondamental de ton code est que, même lorsque tu l'auras mis au point, il subsistera des delay et surtout deux gros while qui bloquent l'exécution de toute autre instruction. Cela te posera problème pour ajouter d'autres fonctionnalités dans ton programme.

Je te suggère de te simplifier la gestion des boutons (ou impulsions) en utilisant cette bibliothèque, et surtout de passer dans une logique d'exécution sans blocages.

Cela nécessite de créer une ou plusieurs variables qui caractérisent l'état du système à un instant t.
Par exemple :
Code: [Select]
`#include "simpleBouton.h"simpleBouton Bp9(9);simbleBouton Bp10(10); bool attente_Bp9 = true; //Etat du systemeunsigned long chrono;void setup() {  Serial.begin(9600);}void loop() {  Bp9.actualiser();  Bp10.actualiser();    if (attente_Bp9)  {    if(Bp9.vientDEtreEnfonce())    {      chrono = millis();      attente_Bp9 = false;    }  }  else  {    if(Bp10.vientDEtreEnfonce())    {      chrono = millis() - chrono;      Serial.println((float) chrono / 1000.0);      attente_Bp9 = true;    }  }    //Autres fonctions du programme...  }`
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

#### chriiss62

#11
##### Jan 16, 2017, 03:07 pm
Bonjour

Encore un grand merci à tous ceux qui prennent le temps de me répondre

Franchement je progresse certes doucement mais pour moi c est juste un hobby

Cordialement Chris62

Go Up