Filtrer une IO qui incremente un compteur

Bonjour
Je recupere sur une IO un signal impulsionnel qui provient d’un compteur (Compteur electrique : 1 impusion = 1 Wh ou compteur d’eau : 1 impulsion = 1 litre).
Dans les 2 cas l’impulsion n’est pas « propre »…
Si je fais un callback sur l’IO j’ai un compteur logiciel qui s’incremente plus vite que le compteur reel…

J’avais le code suivant au debut :

pi = pigpio.pi()
pi.set_mode(pinWaterCounter, pigpio.INPUT)
pi.set_pull_up_down(pinWaterCounter, pigpio.PUD_DOWN)
cbWaterCount = pi.callback(pinWaterCounter)
cbWaterCount.reset_tally()

while True:
      counterVal = cbWaterCount.tally()
      time.sleep(2)

Pour eviter d’avoir un increment superieur a 1 j’ai fait le code suivant :

pi = pigpio.pi()
pi.set_mode(pinWaterCounter, pigpio.INPUT)
pi.set_pull_up_down(pinWaterCounter, pigpio.PUD_DOWN)
cbWaterCount = pi.callback(pinWaterCounter)
cbWaterCount.reset_tally()

counterVal = 0
oldCount = cbWaterCount.tally()

while True:
      if cbWaterCount.tally() > oldCount:
          counterVal = counterVal + 1
          oldCount = cbWaterCount.tally()
      time.sleep(2)

Ca marche mais bon je trouve ca un peu usine a gaz et la duree du « sleep » doit etre adapté en fonction du capteur et du nombre d’ocurence possible par x secondes…

J’ai vu qu’il y avait des fonctions de filtrages :

pi.set_glitch_filter(pinWaterCounter, glitchMicroSec)
pi.set_noise_filter(pinWaterCounter, levelMicroSec, stayMicroSec)

mais je n’ai pas reussi a les configurer correctement.
J’ai l’impressions qu’elles ne s’applique pas dans mon cas.

Avez vous une idee plus « propre » pour faire ce filtrage?
Ou connaissez vous comment configurer ces fonctions ci dessus si elles peuvent s’appliquer.

Merci d’avance

Bonjour,

Les problèmes de rebonds sont bien documentés sur les plateformes du type Arduino.
L’anti-rebond (debounce en anglais) est plutôt utilisé pour les boutons poussoirs que les capteurs qui génèrent moins de rebond. Il existe 2 approches pour les résoudre, soit l’approche logicielle comme pratiqué ici, ou l’approche matérielle qui consiste à placer un condensateur de l’ordre de 100nF (au doigt mouillé, au pif, grosso modo) en parallèle avec le capteur et la mise en place d’une résistance de pull-up ou pull-down en fonction du besoin.

Pratiquement la durée des rebonds est de l’ordre de quelques centaines de millisecondes, mais cela dépend de l’équipement (de la réaction physique de la partie ressort de son équipement).

Dans votre cas, l’approche de détection d’un front et d’ajout d’un timer est ce qui est pratiqué en général pour les éviter. Il me semble que l’attente de 2 secondes est un peu long.

Avec la bibliothèque Rpi.GPIO il est possible d’utiliser la variable bouncetime

Après de courtes recherches sur la librairie implémentée ici pigpio, il semble qu’il n’y ait pas d’option de debounce, donc elle doit se faire en externe à l’appel de la fonction comme vous l’avez implémentée. Je suis également tombé sur les fonctions de glitch, mais ça ne semble pas correspondre à vos besoins.

Personnellement, j’ajouterais un condensateur, sinon, je ne trouve pas mieux qu’un timer pour répondre à votre besoin coté logiciel.

Bonnes bidouilles
A+

Merci pour toutes ces infos.
Je vais du coup rajouter un condensateur. (et pour le pullup j’utilise celui du raspberry)

Pour le timer en effet 2 seconde c’est peut être nettement trop long mais comme je connais mon débit max d’eau et la conso max électrique je ne doit pas avoir plus souvent que toutes les 2 secondes.
L’idée était de faire le « moins » de boucle possible pour limiter l’utilisation du CPU :wink:
Même si cela se trouve une boucle ne consomme pas plus qu’ un sleep ???