Comment procéder à un comptage fiable avec un Arduino

Il est souvent utile de procéder à un comptage, comme par exemple pour un anémomètre ou un pluviomètre ou tout autre capteur basé sur une mesure d'un nombre d'impulsions.

3 solutions s'offrent à nous :

  • utiliser une électronique dédiée, du type compteur 74HC691
          2 inconvénients : devoir réaliser une carte électronique spécifique et consommer plusieurs broches de l'Arduino pour lire la valeur du compteur et faire un RAZ de celui-ci
  • utiliser une boucle de surveillance de l'état de notre capteur
          là encore 2 inconvénients : risquer de rater des impulsions ou consacrer toutes les ressources de notre Arduino à contrôler l'état de l'entrée
  • utiliser les interruptions de notre micro-contrôleur
          C'EST LA MEILLEUR IDÉE !

le principe d'une interruption, c'est d'interrompre le programme en cours (en le mettant de côté), puis de réaliser la tâche demandée pour cette interruption, le programme principal peut alors reprendre son job normal.

Il y a quelques règles à respecter pour que tout fonctionne au mieux :

  1. il faut utiliser une broche de notre Arduino compatible avec les interruptions
  2. il faut que le travail à réaliser lors de cette interruption soit aussi court que possible (notre Arduino ne supportera pas d'empiler plusieurs interruptions en même temps. Or il utilise lui-même des interruptions pour gérer certaines fonctions, comme la communication I2C par exemple)
  3. on doit déclarer nos variables utilisées dans le programme d'interruption comme "volatile" de manière à pouvoir les récupérer dans notre programme principal
  • Pour utiliser les interruptions, on va faire appel à la bibliothèque PinChangeInterrupt.h:
  include <PinChangeInterrupt.h>     // bibliothèque de gestion des interruptions sur ttes les broches
  const byte bint=8;                           // broche utilisée pour déclencher l'interruption 
  volatile long cpt0 = 0;                     // compteur d'impulsions
  • dans la section d'initialisation on déclare :

void setup() {

  pinMode(bint, INPUT_PULLUP);       // la broche est positionnée en entrée avec une résistance à 5v
        // on suppose que notre impulsion correspond à un "0" bref (contact à la masse par exemple) 
  attachPinChangeInterrupt(digitalPinToPinChangeInterrupt(cpt), Fcpt0, FALLING);     // sur mise à 0 du signal, appel de Fcpt0()
        // vous notez que l'interruption est déclenchée sur le passage de l'état "1" à l'état "0" (falling)

}

  • nous pouvons créer une fonction qui sera appelée à chaque interruption

void Fcpt0(void) {

 cpt0++;           // incrément de compteur (notre programme est très court !)

}

  • Maintenant nous pouvons lire la valeur de comptage quand on veut dans notre programme (ttes les 1s par exemple)

void loop() {

 NombreDimpulsions=cpt0;    // utilisation du compteur
 cpt0=0;                                  // il faut évidemment penser à remettre notre compteur à zéro

}