Pages: [1] 2 3   Go Down
Author Topic: [Résolu] Compteur (Encore)...  (Read 1965 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je n'arrive pas à solutionner mon problème... Mon code compte le passage d'objets devant une cellule (photoresistance éclairé par un laser), aucun soucis de ce coté là, l'incrémentation fonctionne parfaitement grâce à la commande compteur++.

Là ou tout ce complique, c'est que j'aimerais compter le nombre de déclenchement sur une période de temps (on va dire 15 secondes) afin de faire un calcul sur une minute puis sur une heure.


Le soucis est qu'il faut que le calcul soit non bloquant pour l'incrémentation du compteur...




Comment placer un code qui me permet de calculer le nombre de déclenchement sur une période de 15 secondes ?



Merci pour votre aide  smiley
« Last Edit: May 01, 2013, 11:36:48 am by gunsman76 » Logged

France
Offline Offline
Full Member
***
Karma: 0
Posts: 154
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

dans le setup()

indexDebut = compteur
TDebut = millis()

dans la loop()

si millis() - TDebut > 15000
alors afficher compteur - indexDebut
réinitialiser indexDebut = compteur et TDebut = millis()
Logged

Offline Offline
Edison Member
*
Karma: 17
Posts: 1967
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

bonjour,
tu peux faire un timer par exemple
temps_desire = 15s
timedebut=millis();
ton compteur de passage
timecurrent=millis();
si timecurrent-timedebut>15s (faire le calcul en millisecondes
on coupe le compteur

EDIT : grillé à la millis près smiley
Logged

France
Offline Offline
Full Member
***
Karma: 0
Posts: 154
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

EDIT : grillé à la millis près smiley

Désolé...
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci pour votre réponse rapide !!!


Alors j'y arrive petit à petit, la vitesse s'affiche bien mais une fois affiché je dois d'une part éviter que ça clignote à chaque coupure du faisceau, d'une part et d'autre part il faudrait refaire le calcul en boucle mais sachant qu'on ne peut pas remettre officiellement le compteur à 0 (sinon je perds toutes les coupures faisceau).


voilà mon code, les déclarations ont été faites dans le Setup :

Code:
if (millis()-TDebut > 15000){
  lcd.setCursor (15,3);
  lcd.print ((compteur2 - indexDebut,DEC)*4);
}


Edit :

pour le compteur, j'ai créé un compteur2, on peut donc le réinitialiser comme on veut. Par contre quelque soit le nombre de coupure faisceau j'ai toujours le même résultat... 40 !

J'ai du foiré un truc
« Last Edit: April 28, 2013, 07:15:14 am by gunsman76 » Logged

France
Offline Offline
Full Member
***
Karma: 0
Posts: 154
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pourquoi utiliser un "compteur2" alors que tu as "compteur" qui fait très bien l'affaire.
Dans la boucle "if", après l'affichage, il faut réinitialiser "TDebut" et "indexDebut".
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai remis à 0 Tdebut et indexDebut mais je n'ai toujours pas la sensation que cela change quelque chose, j'ai toujours le chiffre 40 qui apparait.

Code:
if (millis()-TDebut > 15000){
  lcd.setCursor (15,3);
  lcd.print ((compteur - indexDebut,DEC)*4);
  TDebut=0;
  indexDebut=0;
 

En fait je ne comprends pas trop pourquoi on place une commande millis()dans le setup, alors que le setup n'est lu qu'une fois au démarrage du programme et qu'ensuite cette donnée ne sera plus lu, mais que notre loop va continuer à avancer dans le temps.


Je ne sais pas si j'ai été clair, c'est juste pour bien comprendre et ne pas faire du code pour faire du code...  smiley-grin
Logged

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est pour donner à Tdebut  la valeur de millis()
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui j'ai bien compris ça (désolé si je suis un peu boulet) mais on a une valeur millis() X


la première fois que la boule loop s'execute, on a alors une valeur millis()X et une valeur millis() Y. la valeur millis()X reste toujours la même, c'est elle qui nous permet de calculer la différence entre X et Y.

Là je suis, maintenant lors de la 2e boucle, on n'aura toujours la valeur X de référence, mais on n'aura une nouvelle référence Y ?

Ou alors c'est le fait de réinitialiser à 0 cette référence qui permet de refaire un calcul, les références arduinos ne sont que des références temps présent et non pas temps horloge ?


Logged

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Millis() est une valeur qui augmente constamment pendant environ 50 jours, puis elle rebascule sur 0

Ta valeur Tdebut tu la remets à 0 (en fait la valeur actuelle de millis()) à la fin de ta condition if en la recomparant à millis()


>>>> Tdebut=millis();


Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok maintenant je comprends, merci pour ta patience.

Donc je remettais à 0 Tdebut en faisant Tdebut=0; alors qu'en fait je dois remttre à 0 en notant Tdebut=millis();


ce qui donne :

Code:
if (millis()-TDebut > 15000){
  lcd.setCursor (17,3);
  lcd.print ((compteur - indexDebut,DEC));
  TDebut=millis();
  indexDebut=millis();


mais j'ai toujours le même résultat quel que soit le nombre de coupure faisceau...

Logged

France
Offline Offline
Full Member
***
Karma: 0
Posts: 154
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

réinitialiser indexDebut = compteur et TDebut = millis()

Il faut bien lire les posts.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-red


Code:
if (millis()-TDebut > 15000){
  lcd.setCursor (17,3);
  lcd.print ((compteur - indexDebut,DEC));
  TDebut=millis();
  indexDebut=compteur;


J'ai toujours le même résultat... 10

Donc je pense qu'il y a un soucis
« Last Edit: May 01, 2013, 11:37:26 am by gunsman76 » Logged

France
Offline Offline
Full Member
***
Karma: 0
Posts: 154
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il manque une accolade pour fermer le if (bizarre que cela compile).
La variable TDebut doit être du même type que millis()
La variable indexDebut doit être du même type que compteur
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

L'accolade c'est un oubli lors du copier coller...


Ensuite j'ai donc passé la variable indexDebut en Static unsigned long comme le compteur :

Code:
static unsigned long int compteur = 0;
static unsigned long int indexDebut = 0;

par contre je ne comprends pas l'histoire de Tdebut même type que millis() puisque je ne déclare pas millis() ?


Logged

Pages: [1] 2 3   Go Up
Jump to: