Go Down

Topic: [partage] Librairie Minuteur (gestion de délais) (Read 10795 times) previous topic - next topic

J-M-L

#15
Jan 24, 2019, 10:20 am Last Edit: Jan 24, 2019, 10:26 am by J-M-L
Peut-on incrémenter la durée du Minuteur secondaire ?
si vous regardez les fonctions dispo vous avez la fonction
Code: [Select]
void repousser(uint32_t duree_ms);     //ajoute une duree supplémentaire à celle pré-enregistrée

Pour faire une action qui s'accélère  ou décélère .....
la fonction telle que prévue ne permet que de rajouter une durée donc pas accélérer (réduire la durée du minuteur). On pourrait tricher en sachant qu'un uint32_t fait un rollover et donc en ajoutant une très grande durée on peut finalement retomber sur un timing plus court mais c'est pas super beau..

Pour cela il suffit simplement de relancer le minuteur avec un nouvelle durée par exemple avec
Code: [Select]
void redemarrer(uint32_t duree_ms);    //relance le minuteur à la suite du précédent, mais sur une durée différente
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

Limp47

#16
Sep 23, 2019, 10:59 pm Last Edit: Sep 23, 2019, 11:08 pm by Limp47
Bonsoir , après quelques mois d'initiation au monde d'arduino je commence a prendre un grand plaisir a utiliser cette librairie !

Donc au passage , un grand merci pour ce travail !

Ma question est, peut on gerer un décompte de temps ?

actuellement j'utilise ce code :

Code: [Select]
void compte_a_rebours () {

  TempsActuelGame = millis();
 


  if ((TempsActuelGame - TempsPasseeGame >= 1000) && (runing_time)) {
    TempsPasseeGame = TempsActuelGame;
    Temps_de_Jeu -= 1000;
    if (Temps_de_Jeu <= 0) {
      runing_time = false;
      finDePartie = true;
    }
  }
}
.

J-M-L

#17
Sep 23, 2019, 11:04 pm Last Edit: Sep 23, 2019, 11:05 pm by J-M-L
corrigez votre post ci dessus et rajoutez les code tags autour du code:
[code] // votre code ici [/code].

ça doit ressembler à cela:
Code: [Select]
// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)


----

il semble que vous ayez bien compris comment utiliser millis() donc vous n'avez pas vraiment besoin de la librairie. Vous pourriez sinon mettre un timer toutes les secondes et (dé)compter le nombre de déclenchements pour faire quelque chose de similaire

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

Limp47

Désolé ... en fait j'ai répondu a ma question tout seul avant d'envoyer le message mais ... envoyé par erreur et non terminé !


je pense pouvoir simplifier en utilisant un simpleminuteur d'une seule seconde pour remplacer mes quelques lignes ...

est-ce mieux :

Code: [Select]

void compte_a_rebours () {

 uneSeconde.demarrer();



  if ((uneSeconde.estTermine()) && (runing_time)) {
    uneSeconde.redemarrer();
    Temps_de_Jeu -= 1000;
    if (Temps_de_Jeu <= 0) {
      runing_time = false;
      finDePartie = true;
    }
  }
} //End void

bricoleau

#19
Sep 24, 2019, 12:07 am Last Edit: Sep 24, 2019, 12:09 am by bricoleau
Bonsoir

Je suppose que Temps_de_Jeu est initialisé à une valeur fixe, par exemple 30000 pour 30 secondes.

C'est dommage d'utiliser un minuteur pour compter chaque seconde, le relancer, tout ça pour décrémenter le temps de jeu restant.
Autant utiliser un minuteur qui permet de suivre la totalité du temps de jeu.

donc un truc comme :

Code: [Select]

simpleMinuteur compte_a_rebours(30000);

...
compte_a_rebours.demarrer();
...
if (runing_time && compte_a_rebours.estTermine()) {
  runing_time = false;
  finDePartie = true;
}

et cerise sur le gâteau, la classe minuteur comporte une fonction tempsRestant()
par exemple, pour afficher chaque seconde le temps restant, via un second minuteur :

Code: [Select]

simpleMinuteur uneSeconde(1000);
...
if (uneSeconde) { //=true une fois par seconde
  Serial.println(compte_a_rebours.tempsRestant() / 1000);
}

Car comme indiqué dans le header de la lib, un simpleMinuteur peut être utilisé comme un booléen.
Lorsque de délai est expiré, il retourne la valeur true et redémarre tout seul
Pratique :-)
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

Limp47

#20
Sep 25, 2019, 04:25 pm Last Edit: Sep 25, 2019, 05:04 pm by Limp47
Bonjour ,

En effet le temps de jeu est fixe (déterminé par celui qui lancera le module de jeu , 20min en général c'est pour animer des parties de paintball) .

Le soucis quand on débute ... c'est que dès que j'ai un peu plus de connaissances ... je chamboule tout ce que j'ai fait avec le nouveau savoir !!!

 bon là j'envisage de tout revoir en utilisant votre librairie du coup ! Mais c'est une bonne école .

j'explique rapidement le topo mais il s'agit d'un jeu de Domination par équipe , rouge / bleu .

EX si les bleu capturent le module , un chrono bleu comptabilise cela ... mais je dois toujours faire tourner mon compte a rebours ! Le soucis que j'ai rencontré c'est que j'utilise 2 boucle for :


Code: [Select]
for (int i = 0; i <= 19; i++) {                             //On balaye l'ecran avec la barre de capture
          for (int j = 1; j <= 5; j++) {                            //On balaye chaque case avec les caractère spéciaux de 1 à 5
            lcd.setCursor(i, 1);
            lcd.write((uint8_t) j);                                 // On affiche le carractère correspondant
            delay (Tflag / 5);                                      // Delay du temps choisi / 5
"extrait du code"


elles permettent de faire monter progressivement une barre (les caractère spéciaux de 1 a 6 étant juste des traits verticaux pour diviser une case , de 0 a 5 / soit vide / plein .

cependant , lorsque je suis dans cette boucle , je bloque mon programme dedans ! Donc on peut vite comprendre que si je détermine un temps de capture de 1min et que les joueurs viennent capturer 5 fois (exemple) on va rallonger le chrono de départ de 5 min ! (plus en réalité car la neutralisation prend autant de temps que la capture )

Je vais donc gérer tout les chronos via la biblio mais par contre , le estTermine() renvoi true et redémarre je ne dois pas relancer mon chrono dans mon cas... si je met mon code dans un :

Code: [Select]
do {     //gestion du mode de jeu  } while (!compte_a_rebours.estTermine());  ça peut gérer mon affaire ? le ! fonctionne il dans ce cas ?

Peut ont stopper un simpleminuteur pour le relancer plus tard ? ( .redemarrer() pour cela, pas de soucis)

En vous remerciant pour votre partage, cela m'aide beaucoup  :) [/code]

bricoleau

Stp lis le header de lib dans le tout premier post.

Je remets un bout ici
Code: [Select]
   //état du minuteur
    uint32_t duree() const                 {return this->_duree;}
    uint32_t tempsEcoule() const           {return millis() - this->_millis_depart;}

    bool     estActif() const              {return tempsEcoule() <  duree();}
    bool     estTermine() const            {return tempsEcoule() >= duree();}
    uint32_t tempsRestant() const          {return estTermine() ? 0 : duree() - tempsEcoule();}



donc...

... mais par contre , le estTermine() renvoi true et redémarre je ne dois pas relancer mon chrono dans mon cas...
Non, estTermine() ne redémarre pas le minuteur.

si je met mon code dans un :

Code: [Select]
do {     //gestion du mode de jeu  } while (!compte_a_rebours.estTermine());
  ça peut gérer mon affaire ? le ! fonctionne il dans ce cas ?
Oui ça marche, mais estActif() est plus simple que !estTermine(),


Peut ont stopper un simpleminuteur pour le relancer plus tard ? ( .redemarrer() pour cela, pas de soucis)
Non pas directement, mais il est possible de sauvegarder le temps restant dans une variable, pour lancer plus tard le minuteur avec ce temps restant

Code: [Select]
uint32_t restant = compte_a_rebours.tempsRestant();
//et plus tard :
compte_a_rebours.demarrer(restant);
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

Go Up