Go Down

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

chriiss62

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

kamill

Bonjour,

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

Mais
Code: [Select]
#define  Bp9  9
#define Bp10  10

chriiss62

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

Je fatigue vraiment J ai trouvé l erreur

Manqué une majuscule à Read

chriiss62

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

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

chriiss62

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

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

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

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

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 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...
 
}
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

chriiss62

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