[Résolu] Compteur (Encore)...

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

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

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

infobarquee:
EDIT : grillé à la millis près :slight_smile:

Désolé...

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 :

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

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

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.

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:

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

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 ?

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

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 :

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.

:blush:

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

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

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 :

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

millis() est déclaré par défaut.

je fais comment alors :

La variable TDebut doit être du même type que millis()

gunsman76:
je fais comment alors :

La variable TDebut doit être du même type que millis()

voilà je l'ai passé en unsigned long.

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

Il serait bien d'afficher aussi "compteur" pour voir si il s'incrémente de 10 lui aussi toutes les 15s.