Bonjour ,
Je ne suis pas spécialiste de compteur d'eau , mais il y a un truc qui m'échappe dans votre façon de compter .
J'ai comme l'impression que vous totalisez le nombre d'impulsions , ce qui au bout d'un certains temps , très long , va permettre de déterminer un débit .
Prenons un autre exemple pour lequel , je ne suis pas spécialiste non plus , mais pour lequel je pourrais peut-être vous apporter la lumière (du moins j'espère) .
Un ventilateur de refroidissement de PC à 3 fils . Deux sont pour l'alimentation (rouge et noir) et le troisième pour contrôler sa vitesse (jaune) , il me semble que c'est aussi un contact effet hall , si ne me trompe pas .
Donc sur ce fil jaune nous avons des impulsions qui arrivent et permettent de déterminer sa vitesse de rotation (tachymètre) . Sachant qu'il ne tournera pas au delà d'une certaine vitesse , disons 3000 trs/min soit 50 trs/sec soit 0,02 sec/tr qui est le temps à pleine vitesse . Pour déterminer sa vitesse intermédiaire il suffit de mesurer le temps entre chaque impulsion et ensuite on fait le calcul inverse . Disons qu'il tourne à 0.1 sec/tr soit 10 trs/sec soit 600 trs/min . 1000 trs/min devrait tomber vers 0,06 sec/tr.
RPM = 60 /
temps en secondes
Donc pour mesurer ce temps , il faut détecter ce qu'on appelle un front , soit le changement d'état 0 vers 1 (dit montant) ou 1 vers 0 (dit descendant) . Il faut savoir que les impulsions sont carré 0,1,0,1,0 etc , mais avec un rapport cyclique qui n'est pas toujours le même pour le 0 et le 1 .
Donc on peut utiliser 2 variables pour stocker l'état antérieur et traiter le signal lu (comme à fait
christophe27) , ou n'utiliser qu'une seule variable par simple injection du bit lu et décalage (registre à décalage) . Il suffit alors de lire l'état de ces deux bits pour détermine l'état que nous avons :
Si injection du bit par la droite
00 << niveau bas (valeur décimale 0)
01 << front montant (valeur décimale 1)
11 << niveau haut (valeur décimale 3)
10 << front decendant (valeur décimale 2)
Code : Tout sélectionner
a <<= 1
a += bool( bit_lu )
a &= 0b11 # filtre pour ne garder que ces deux bits
Si injection du bit par la gauche
>> 00 niveau bas (valeur décimale 0)
>> 10 front montant (valeur décimale 2)
>> 11 niveau haut (valeur décimale 3)
>> 01 front descendant (valeur décimale 1)
Après avoir choisi quel front vous voulez détecter , il faudra toujours garder le même . La première détection de front déclenchera le chronomètre , la seconde détection du même front (un tour après) provoque l'arrêt du chrono et le début du calcul .
Petit exemple avec une simulation en python de détection de front : (désolé pour la déclaration de fonctions avec Lambda !

)
Code : Tout sélectionner
from time import time
from time import sleep
bit = lambda b : 1<<b
Bin = lambda w, nb=8 : ( "0"*nb + bin(w)[2:] ) [-nb:]
front = lambda w, f : bool(( w & 0b11 ) == f )
up = 0b01
t0 = t1 = t = a = 0
for i in range (32):
a <<= 1
a += bool( i & bit(2) ) # detecte les fronts du bit 2
a &= 0b11 # filtre les deux derniers bits à droite
if front(a, up) :
t += 1
if t is 1: t0= time()
if t is 2: t1= time()
print ("%2i %s %s %s %s" %( i, Bin(i,4), Bin(a,2), front(a, up), t==2 and str(t1-t0) or "" ))
if t is 2: t0= t1; t=1
sleep(.2) # tempo mise parceque ça va trop vite pour le test ;p
Code : Tout sélectionner
# ce qui donne le résultat suivant sur la détection du bit 2
# Bits
# 3210 a front up
0 0000 10 False
1 0001 00 False
2 0010 00 False
3 0011 00 False
4 0100 01 True
5 0101 11 False
6 0110 11 False
7 0111 11 False
8 1000 10 False
9 1001 00 False
10 1010 00 False
11 1011 00 False
12 1100 01 True 1.6037945747375488
13 1101 11 False
14 1110 11 False
15 1111 11 False
16 0000 10 False
17 0001 00 False
18 0010 00 False
19 0011 00 False
20 0100 01 True 1.603339433670044
21 0101 11 False
22 0110 11 False
23 0111 11 False
24 1000 10 False
25 1001 00 False
26 1010 00 False
27 1011 00 False
28 1100 01 True 1.6032378673553467
29 1101 11 False
30 1110 11 False
31 1111 11 False
>>>