Go Down

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

bricoleau

Jan 29, 2016, 10:58 pm Last Edit: Feb 28, 2016, 05:05 pm by bricoleau
Bonjour

Suite de la série "petites librairies en français et simples d'utilisation à destination des débutants"

Voici une librairie qui permet de gérer le temps, spécialement conçue pour les personnes qui ne sont pas à l'aise avec la fonction millis().

A l'image de l'ustensile de cuisine, le minuteur est un dispositif que l'on met en marche pour une certaine durée, avant de passer à l'étape suivante.

Après installation, les exemples d'utilisation sont disponibles directement depuis l'IDE Arduino.
Ces exemples montrent une manière alternative, et peut-être plus accessible, d'arriver à faire ce fameux "blink without delay", ou encore de gérer le cadencement de différentes actions pour arriver à faire "plusieurs choses à la fois".

Header :
Code: [Select]
//Librairie Arduino pour la gestion de délais
//En utilisant la notion de minuteur
//Version 2.0
//
//8 octets alloués en RAM par minuteur
//
//Bricoleau 2016

#ifndef simpleMinuteur_h
#define simpleMinuteur_h

#include <Arduino.h>

class simpleMinuteur
{
  public :
    //constructeur
    simpleMinuteur(uint32_t duree_ms = 0); //si le minuteur a toujours la même durée, la renseigner dès la construction

    //actions essentielles
    void demarrer();                       //lance le minuteur à partir de maintenant et pour la durée pré-enregistrée
    void demarrer(uint32_t duree_ms);      //lance le minuteur à partir de maintenant pour une durée différente
    void redemarrer();                     //relance le minuteur à la suite du précédent (utile pour cadence régulière)
    void redemarrer(uint32_t duree_ms);    //relance le minuteur à la suite du précédent, mais sur une durée différente
    operator bool();                       //Retourne true si le minuteur est terminé, puis le redémarre

    //é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();}

    //actions secondaires
    void repousser(uint32_t duree_ms);     //ajoute une duree supplémentaire à celle pré-enregistrée

  private :
    uint32_t _millis_depart, _duree;
};

#endif

maxpeigne

Super librairie!

Je l'utilise (avec simpleBouton V2) dans mon projet de réalisation d'une pico brasserie et elles me rendent bien des services!

Merci à toi ;)

bricoleau

Merci pour ce retour d'utilisation  :smiley:

Du coup, je viens de mettre à jour le .zip attaché au premier post.

La librairie en V2 contient à présent une nouvelle fonction bien utile : le minuteur peut être utilisé comme un booléen, et redémarre automatiquement.

Ainsi, par exemple, pour exécuter une fonction1() chaque seconde, et une fonction2() toutes les 5 secondes, le code est :

Code: [Select]
simpleMinuteur tempo1(1000);
simpleMinuteur tempo2(5000);
...
void loop()
{
  if (tempo1) fonction1();
  if (tempo2) fonction2();
}


Difficile de faire plus simple :P

bricoleau

#3
Feb 28, 2016, 05:12 pm Last Edit: Feb 28, 2016, 06:18 pm by bricoleau
Autre exemple que j'aime bien :

Couplé à la lib simpleLed, le fameux "blink without delay" devient minimaliste :
Code: [Select]
simpleLed led(13);
simpleMinuteur tempo(1000);

void setup() {}
void loop()  {if (tempo) led.basculer();}

ianoo76

Sympa !
Il y a possibilité de travailler dans l'ordre de la mico-seconde ?

bricoleau

Pas avec la librairie telle que fournie, mais c'est très facile à modifier.

Il suffit d'éditer les fichiers .h et .cpp, en remplaçant partout "millis" par "micros".
Tous les délais sont alors des microsecondes, au lieu de millisecondes

lr83

Merci pour cette librairie vraiment très pratique.
J'ai eu un doute à cause de la fonction millis() car elle se réinitialise au bout d'environ 50 jours (unsigned long). Mais en fait, ce n'est pas un problème, ça marche quand même  :)

bricoleau

Bonjour

Effectivement, le retour à zéro de la fonction millis() est sans conséquence pour un minuteur.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy