Les timers et l’Arduino

Accueil/Les timers et l’Arduino
Les timers et l’Arduino 2016-12-20T11:38:30+00:00

Project Description

Il arrive souvent que dans un programme on ait besoin par exemple de faire clignoter une led. Cela peut être fait simplement, diront certains, avec l’usage de la fonction delay. Comme vous le savez surement, delay met en pause l’Arduino, alors comment fait-on si on doit continuer à utiliser l’Arduino pour envoyer des données par liaison série par exemple? Certains diront encore que l’on peut utiliser la fonction millis, avec des conditions. Je suis entièrement d’accord, mais si on a plusieurs leds à faire clignoter, la chose devient rapidement un casse tête. C’est pourquoi aujourd’hui je vais vous faire découvrir une librairie qui va vous faciliter la tache.

La librairie

La librairie Timer, écrite par Simon Monk, est disponible sur GitHub, à cette adresse. Cliquez sur le bouton à droite « download ZIP » pour la télécharger, puis dézippez le fichier dans le dossier ‘libraries’ de votre dossier d’installation de l’IDE Arduino, c’est tout! Si il n’y a pas de dossier nommé comme cela dans le dossier d’installation d’Arduino, alors créez-le.

Cette librairie a un principe de fonctionnement plutôt simple, en fait, on crée un timer, et on l’actualise dans la boucle principale du programme, la boucle loop. Ensuite, il suffit de donner des instructions à ce timer, du style « fait clignoter telle led tous les 100ms » pour qu’il les réalise seul. Mais voyons tout de suite comment coder tout cela.

Les commandes de bases

Tout d’abord, comme pour chaque librairie, il faut l’importer, notre programme commencera donc par :

#include "Timer.h"

Ensuite, on doit, comme dit précédemment, créer un ou plusieurs timer si besoin, sachant qu’un même timer peut effectuer plusieurs taches, mais parfois il faut organiser son travail. Pour cela on utilise tout simplement :

Timer monTimer;

Enfin, il faut l’actualiser à chaque tour de la boucle principale, donc on met cette fonction dans la boucle principale :

void loop(){

monTimer.update();

}

Il faut aussi penser à ne surtout plus mettre de delay dans votre programme, d’une part vous n’en avez plus besoin et d’autre part, cela empécherait votre timer de s’actualiser assez souvent et il ne fonctionnerait donc plus correctement.

Tous les réglages sont faits, il ne reste plus qu’à donner des instructions au timer, voici les plus utiles :

int every(long interval, callback, int nombreDeFois)

Appelle une fonction callback dont vous mettez le nom en argument, tout les ‘interval’ de temps (en ms), vous pouvez aussi optionnellement utiliser le dernier argument qui vous permet de spécifier le nombre de fois que le timer devra agir. Le nombre que la fonction retourne est l’ID de l’action, en effet un même timer peut contenir plusieurs action, il attribut donc des numéros à chacune des actions pour pouvoir par exemple les arrêter après.

int after(long interval, callback)

C’est à peu près la même fonction que la précédente, sauf qu’elle n’appellera qu’une seule fois la fonction callback après le temps indiqué.

int oscillate(int pin, long interval, int valeurDeDepart, int nombreDeFois)

Fait changer l’état d’un pin à un ‘interval’ définie. La valeur de départ, HIGH ou LOW doit être indiqué, et on peut optionnelement définir le nombre de changement d’état à faire à l’aide du dernier argument. Attention, le pin doit être définit comme une sortie de l’aide de la fonction pinMode().

int pulse(int pin, long interval, int valeurDeDepart)

Encore une fois la même fonction que la précédente sauf qu’elle n’effectue qu’un seul changement d’état au pin après une durée indiquée.

int stop(int id)

Arrête l’action associée à l’ID, ID que l’on peut récupéré comme expliqué précédemment.

Voyons maintenant quelques exemples officiels que nous avons traduits.

Exemples de programmation

Ce premier exemple passe un pin à +5v après 10 minutes :

#include "Timer.h" // on importe la librairie

Timer t; // on déclare notre timer
int pin = 13;


void setup()
{
  pinMode(pin, OUTPUT); // on pense bien à déclarer le pin comme une sortie
  t.pulse(pin, 10 * 60 * 1000, LOW); // dans 10 minutes en millisecondes le pin passera à HIGH
}


void loop()
{
  t.update(); // on pense bien à actualiser le timer
}

Ce deuxième exemple fait clignoter une LED toute les 100 millisecondes et envoie par liaison série toute les secondes la valeur en entrée du pin 0 :

#include "Timer.h"


Timer t;
int pin = 13;


void setup()
{
  Serial.begin(9600);
  pinMode(pin, OUTPUT);
  t.oscillate(pin, 100, LOW); // la fonction qui fait clignoter la led toutes les 100 ms
  t.every(1000, envoi); // et celle-ci qui appelle la fonction 'envoi' toutes les secondes
}


void loop()
{
  t.update();
}


void envoi() // fonction qui envoie par liaison série l'entrée du pin 0
{
  Serial.println(analogRead(0));
}

5 Commentaires

  1. Simon 26 novembre 2015 à 18 h 34 min␣- Répondre

    bonjour, j’ai installer la lib sur mon pcduino, j’ai écris un programme et au moment de compiler un message d’erreur arrive et stipule WProgram.h: no such file or directory

    • Simon 26 novembre 2015 à 18 h 51 min␣- Répondre

      du coup impossible de compiler, pourriez me renseigner.

  2. Stunkel 23 mars 2016 à 16 h 23 min␣- Répondre

    Merci beaucoup pour ta librairie très bien renseignée qui m’a été très utile !
    Pour Simon, il faut aller dans Timer.cpp et remplacer « WProgram.h » par « Arduino.h ». Après si tu retélecharge la dernière version tu devrais pas avoir de problème à ce niveau là. (En tout cas je n’ai pas eu ce problème)

  3. PHG13 26 juin 2017 à 19 h 00 min␣- Répondre

    Bonjour,

    Si nous devons modifier au fur et à mesure de la boucle les paramètres du timer ! Comment faire ?

    Merci

  4. PHG13 26 juin 2017 à 19 h 02 min␣- Répondre

    Bonjour,

    Comment changer en dynamique dans la boucle VOID les paramètres du timer ! Merci

Laisser un commentaire