Go Down

Topic: [Résolu] Compteur (Encore)... (Read 2393 times) previous topic - next topic

gunsman76

Apr 28, 2013, 11:58 am Last Edit: May 01, 2013, 06:36 pm by gunsman76 Reason: 1
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  :)

Pac2Kro

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

infobarquee

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

Pac2Kro


gunsman76

#4
Apr 28, 2013, 01:51 pm Last Edit: Apr 28, 2013, 02:15 pm by gunsman76 Reason: 1
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: [Select]

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

Pac2Kro

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".

gunsman76

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: [Select]
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...  :D

Jean-François

C'est pour donner à Tdebut  la valeur de millis()
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

gunsman76

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 ?



Jean-François

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();


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

gunsman76

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: [Select]

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...


Pac2Kro


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


Il faut bien lire les posts.

gunsman76

#12
Apr 28, 2013, 07:18 pm Last Edit: May 01, 2013, 06:37 pm by gunsman76 Reason: 1
:smiley-red:


Code: [Select]

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

Pac2Kro

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

gunsman76

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: [Select]
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() ?



Go Up