Aller au contenu


Photo
- - - - -

mesure de vitesse


  • Veuillez vous connecter pour répondre
5 réponses à ce sujet

#1 fabrice54

fabrice54

    Nouveau membre

  • Membres
  • 7 messages
  • Gender:Male

Posté 10 septembre 2012 - 07:03

bonjour;
j'ai écris un petit programme qui devrais compter du temps entre deux changements d’état d'un contact;mais je m'aperçois ici que le temps de départ est
égal au temps d’arrivée c'est pour cela que le programme ne fonctionne pas,et je ne comprends pas pourquoi,si quelqu'un pouvais m'aider merci beaucoups
cordialement
F.Thomas.
unsigned long  tempsArrive = 0;
unsigned long tempsDepart = 0;
float duree=0.0;
float vitesse=0.0;
int val_broche1=0;
int broche1=2;
void setup(){
 Serial.begin(9600);
 pinMode(broche1,INPUT);
}
void loop(){
val_broche1=digitalRead(broche1);
while(val_broche1==HIGH)
{
val_broche1=digitalRead(broche1);
}
tempsDepart = millis();
 Serial.print("tempsDepart=" ); 
 Serial.println(tempsDepart/1000 ); 
val_broche1=digitalRead(broche1);
if(val_broche1==LOW)
{

tempsArrive=millis();
 Serial.print("tempsArrive=" ); 
 Serial.println(tempsArrive/1000 ); 
 duree =tempsArrive-tempsDepart; 
 Serial.print("duree="); 
  Serial.println(duree); 
 vitesse=(1/duree)*2.13*1000*3.6;
Serial.print("vitesse="); 
Serial.println(vitesse); 
}
delay(100);
}



#2 Jep31

Jep31

    Membre

  • Membres
  • 43 messages
  • Gender:Male
  • Location:Toulouse France

Posté 10 septembre 2012 - 08:55

Salut à toi,

Si je lis bien ton programme ton temps de départ est mis à jour à chaque passage dans la boucle et cela peut importe l'état de ta "broche".
Donc l'état passe à bas, il relève le temps d'arrivé juste après avoir relevé le temps de départ. C'est juste quelques lignes après ce qui prend un temps infime à ton programme, donc la durée est forcement nulle.

Ce que tu veux mesurer c'est le temps qu'à durée l'état haut ?
Pour repérer le changement d'état moi je garderais en mémoire l'ancien état.
A la fin de ton programme tu enregistre etat_back = truc
Et tu fais ensuite un if etat_back != etat_now
si tu vois ce que je veux dire.
ici un simple

if(val_broche1==HIGHT){
tempsDepart = millis();
}
if(val_broche1==LOW){
tempsArrivée = millis();
}

Ne fonctionnera pas car durant toute la durée HIGHT le temps sera mis à jour alors que ce que tu veux c'est juste le temps où il est passé à l'état haut.
Tu dois viser les transition

Essaye un truc du genre:

//Variables
unsigned long  tempsArrive = 0;
unsigned long tempsDepart = 0;
float duree=0.0;
float vitesse=0.0;
int val_broche1=0;
int broche1=2;

void setup(){
Serial.begin(9600);
pinMode(broche1,INPUT);
val_broche1_back = digitalRead(broche1); //Initialisation du temps d'avant
}

//Mesure du temps à l'état haut
void loop(){

val_broche1 = digitalRead(broche1); // Lecture de l’état

//Mesure du temps au passage à l'état haut
if ( (val_broche1 != val_broche1_back) && (val_broche1 == HIGHT) ){
temps_depart = millis();
}

//Mesure du temps au passage à l'état bas
if ( (val_broche1 != val_broche1_back) && (val_broche1 == LOW) ){
temps_arrivee = millis();

//Affichage du releve:
 duree =tempsArrive-tempsDepart; 
 Serial.print("duree="); 
 Serial.println(duree); 
}
delay(100);
val_broche1_back = val_broche1;

}



#3 fabrice54

fabrice54

    Nouveau membre

  • Membres
  • 7 messages
  • Gender:Male

Posté 11 septembre 2012 - 04:38

je te remercie pour le programme et les explications,par ce que le programme que j'avais écris me paraissais,logique c'est pourquoi je ne comprenais le Default.
cordialement.
F.Thomas.

#4 Jep31

Jep31

    Membre

  • Membres
  • 43 messages
  • Gender:Male
  • Location:Toulouse France

Posté 11 septembre 2012 - 09:13

je te remercie pour le programme et les explications,par ce que le programme que j'avais écris me paraissais,logique c'est pourquoi je ne comprenais le Default.
cordialement.
F.Thomas.



Tu me diras si ça marche, je ne l'ais pas testé et il est possible que certaines choses soient mal faites.

#5 fabrice54

fabrice54

    Nouveau membre

  • Membres
  • 7 messages
  • Gender:Male

Posté 12 septembre 2012 - 02:22

Tu me diras si ça marche, je ne l'ais pas testé et il est possible que certaines choses soient mal faites.

oui il fonctionne, j'ai corriger certaines lignes,et déclarées la fonction back ,et tout a fonctionnez très bien,
merci encore

cordialement

#6 fabrice54

fabrice54

    Nouveau membre

  • Membres
  • 7 messages
  • Gender:Male

Posté 28 septembre 2012 - 04:20

Tu me diras si ça marche, je ne l'ais pas testé et il est possible que certaines choses soient mal faites.

int poussoir = 2; 
int val_poussoir = 0;
 unsigned long  tempsPrecedent = 0;
 unsigned long  tempsActuel = 0;
float duree = 0.0; 
  void setup() 
{Serial.begin(9600); 
pinMode(poussoir, INPUT); 
}
void loop() 
{
val_poussoir = digitalRead(poussoir); 
if (val_poussoir==LOW){ 
duree=tempsActuel - tempsPrecedent;
Serial.println(duree/1000);
   tempsPrecedent = tempsActuel;
delay(100); 
}
else{
tempsActuel = millis();
}


}
un petit programme qui compte le temps




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users