Mesurer un intervalle de temps

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

#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 '=' token

sketch_jan15b.ino:11:11: note: in expansion of macro 'Bp9'

sketch_jan15b.ino:2:14: error: expected primary-expression before '=' token

sketch_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 '=' token

sketch_jan15b.ino:18:20: note: in expansion of macro 'Bp9'

sketch_jan15b.ino:1:14: error: expected primary-expression before '=' token

sketch_jan15b.ino:22:23: note: in expansion of macro 'Bp9'

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

sketch_jan15b.ino:2:14: error: expected primary-expression before '=' token

sketch_jan15b.ino:26:20: note: in expansion of macro 'Bp10'

sketch_jan15b.ino:2:14: error: expected primary-expression before '=' token

sketch_jan15b.ino:30:23: note: in expansion of macro 'Bp10'

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

sketch_jan15b.ino:36:15: error: 'println' 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.


Merci pour votre aide

Bonjour,

Ce n'est pas

#define  Bp9 = 9
#define Bp10 = 10

Mais

#define  Bp9  9
#define Bp10  10

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.

Je fatigue vraiment J ai trouvé l erreur

Manqué une majuscule à Read

J ai corrigé le code il fonctionne

#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

Ca devrait fonctionner. Tu as pas inversé bp9 et bp10?

mon nouveau code qui fonctionne

#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

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

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é)

chriiss62:
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:

if (temps2>temps1)

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 :

#include "simpleBouton.h"

simpleBouton Bp9(9);
simbleBouton Bp10(10); 

bool attente_Bp9 = true; //Etat du systeme
unsigned 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...
  
}

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