Fonction "COUNT"

Yex2

Well-known member
Bonsoir,
Je lit ce topic sans oser intervenir vu mes connaissances limitées.
@MGU vient d'arriver à la conclusion que je pensais depuis pas mal de temps : simplement compter les impulsions pour connaître la consommation.

Je me pose plusieurs questions :
- Il me semble qu'il manque une horloge en temps réel pour déterminer la conso journalière : elle pourrait faire le reset des variables journalières

C'est dans les plans à venir. Il faut que le compteur fonctionne en premier. Ensuite je m'attaque au reset etc.

- Comme MGU, un enregistrement hard (Eeprom) ne serait pas inutiles vu que si le picaxe viendrait à redémarrer, tout serait perdu ... permettrait également un historique.
- A quoi sert la lecture des impulsions durant un temps déterminé de quelques secondes ?
Le débitmètre utilisé n'est pas linéaire. Sa fréquence augmente avec le débit. Voir la doc.

Dans un premier temps j'avais besoin de connaître le débit approximatif afin de faire des tests qui me donnaient un résultat relativement précis. 1L/15 sec = 4L/min (240L/H), donc une fréquence de ± 32.5 Hz selon la doc.

Dans un deuxième temps je voulais ajouter une fonction de calibration afin d'ajuster le compteur en fonction des conditions précises retrouvées dans chacune des situations. J'ose espéré me rapprocher d'une précision de ± 1%.

Constatation concernant le débitmètre :

A) Leur fréquence varient beaucoup par rapport à la doc. Jusqu'à 10% selon le manufacturier. Celui que j'ai varie de 12% plus bas. 28.7 Hz au lieu de 32.5 Hz. De là l'importance d'avoir une calibration au départ pour ce débitmètre et la pompe qui sera utilisée.

B) Par contre ils sont précis. Une fois calibré, la précision est étonnante. J'ai laissé couler des dizaines de litres et obtenais toujours des résultats suffisamment précis pour mes besoins.

C) ils ne sont pas cher. J'ai payé le mien autour de 4 Euro.


Tout cela pourrait se faire avec l'I2C présent ?

Il me semble que cela ne compte que les 1
J'utilise un LCD 2004 i2C

Le code suivant proposé par MGU ne fonctionne pas. Il donne environ 27 impulsions pour un litre alors qu'on devrait en lire entre 400 et 450. Je crois qu'il n'y a pas assez de temps entre chaque état pour que le pic soit capable de lire tous les fronts. Je vais plutôt y aller avec ma nouvelle solution de réarmer l’interruption seulement lorsque l'état est à 0.

Code:
do
do loop while pinC.3=1
inc pulses ;compte les pulses
do loop while pinC.3=0
loop
 

PieM

Senior Member
C'est la raison pour laquelle j'insiste pour avoir une fonction de calibrage dans mon code.
Insistez comme vous voulez... mais sans moi!
Vous confondez tout, mesure de débit et quantité !
Parce que ces capteurs ne sont pas linéaire. Par exemple, le mien donne entre 410 et 445 impulsion lorsque je verse 1 L / 18 sec. Selon la doc, je devrais avoir ±585 impulsions (32.5 Hz pendant 18 secondes). À 430 je suis loin du compte. (ben non, c'est exactement ce que doit donner ce compteur pour 1 litre!)

Selon la doc la fréquence devrait varier comme suit :

2L/min = 16 Hz
4L/min = 32.5 Hz
6L/min = 49.3 Hz
8L/min = 65.5 Hz
etc.
"le mien donne entre 410 et 445 impulsion lorsque je verse 1 L / 18 sec." mais on s'en moque du temps!!
de plus 1 l en 18s ça fait 3.33l/mn qui n'ont rien à voir avec 32.5Hz !
 

MGU

Senior Member
Ben oui, c'est le côté obstiné de Yex2, mais avec de la patience... beaucoup de patience....

Ce que l'on cherche à mesurer est un volume, pas un débit. Il faut supprimer la variable temps de la formule
1l/mn =7,5Hz => 1 litre = 450 pulses. (il n'y a plus de Hz là dedans)

Toutefois, il est possible (probable) que le débit ait une influence sur cette mesure. Pour voir cette influence, il faut faire un test:
Mesurer le nombre d'impulsions pour une quantité fixe , ex 5L à un débit de 1L/mn et disons 5L/mn, et comparer les valeurs.
Ce capteur est un capteur à turbine, comme les compteurs divisionnaires (précision de l'ordre de 1%,, au mieux, ft de la classe et de l'orientation).
Il ne sont pas précis, mais fidèles selon le constat des tes mesures, on peut donc corriger l'erreur).
Possible que la dernière proposition ne fonctionne pas.
LA solution est de placer un circuit RC différenciateur entre le capteur et le µC, pour déclencher l'interruption comme précédemment, mais le problème du blocage disparait.

MM
 

ddaweb

New Member
@Yex2 j'ai aussi parfois eu du mal à comprendre les spécialistes pour mon projet, mais il s'est avéré qu'ils avaient raison dans la très grande majorité des cas ... donc écoutez leurs conseils ;)

Concernant le problème de consommation et fréquence : certes, suivant le débit, le nombre d'impulsion/sec augment, donc la fréquence ... mais vous, ce qui vous intéresse, c'est la consommation journalière -> ce qui importe dans ce cas est simplement le nombre d'impulsion que le picaxe recevra dans la journée : il faudra donc faire le calcul du nombre d'impulsions pour obtenir la consommation (en litre ou décilitre, peut importe).
En gros : nbr d'impulsions reçues/nbr d'impulsions par litre = la consommation en litre ... pas de durée en secondes ou de fréquence (sauf journalière).
Il faudra peut-être un coefficient correctif, @MGU est très fort en la matière.
Le min et max n'est qu'un stockage d'une valeur déterminée.
 

MGU

Senior Member
Oui, c'est sûr! rien qu'en prenant le tableau de la doc :
View attachment 23083
Je n'avais pas vu cette courbe. Gros changement au delà de 600l/h.
Mais comme les doc ne disent pas toutes la même chose, il faudrait faire un test avec le vrai capteur, dans les conditions d'utilisation,c'est à dire le débit max en utilisation douche.

Sinon, le couplage capacitif fonctionne et si le capteur ne tourne pas, pas de blocage (le dessin n'est pas réaliste)

23085

MM
 

Yex2

Well-known member
Insistez comme vous voulez... mais sans moi!
Vous confondez tout, mesure de débit et quantité !

"le mien donne entre 410 et 445 impulsion lorsque je verse 1 L / 18 sec." mais on s'en moque du temps!!
de plus 1 l en 18s ça fait 3.33l/mn qui n'ont rien à voir avec 32.5Hz !

Bonjour PieM. Vous ne semblez pas réaliser qu'il existe une relation entre débit et quantité.

Un débit à une fréquence donnée donne une quantité. Si tu as un débit de 4L/min ou 8L/30 sec, tu obtiens la même quantité, soit 4L. Le débit dans le temps donne une quantité. Comme il est imposible d'utiliser la fonction SETINT avec ce débitmètre particulier, il faut prendre la fonction COUNT qui elle mesure une fréquence.

Avec la fréquence on peut ensuite l'utiliser pour déterminer une quantité.

Au moment d'écrire ces lignes, mon programme fonctionne correctement ainsi que la fonction de calibration.

FONCTION SETINT vs COUNT

Malheureusement il n'est pas possible d'utiliser la fonction SETINT avec ce débitmètre pour les raisons que j'ai expliqué ce matin. Si le débitmètre arrête sur la mauvaise état (50% de chance), le programme entre dans une boucle sans fin. La seule solution que je vois c'est de filtrer le signal du débitmètre. Peut-être un NE555P en mode Monostable pourrait convenir afin de produire seulement un état "1" lorsque ça tourne. C'est à vérifier...

Le seul bug qui subsiste dans mon programme c'est que la fonction COUNT semble affecter l'horloge interne. La variable "time" a ralenti à 33% Je ne sais pas pourquoi... Quelqu'un peu me dire ? J'ai besoin de cette variable afin de mettre fin au cycle de consommation et d'enregistrer les valeurs minimum et maximum.

Quelqu'un sait pourquoi COUNT affect time et comment contourner le problème ?
 

Yex2

Well-known member
Ben oui, c'est le côté obstiné de Yex2, mais avec de la patience... beaucoup de patience....
Tu confonds la persévérance avec l'obstination

Ce que l'on cherche à mesurer est un volume, pas un débit. Il faut supprimer la variable temps de la formule
1l/mn =7,5Hz => 1 litre = 450 pulses. (il n'y a plus de Hz là dedans)
Effectivement ça serait l'idéal sauf que SETINT ne fonctionne pas avec ce débitmètre. T'as 50% de chance d'entrer dans une boucle infini à chaque usage de la pompe.

Toutefois, il est possible (probable) que le débit ait une influence sur cette mesure. Pour voir cette influence, il faut faire un test:
C'est la première chose que j'ai fait et je l'ai immédiatement constater. De là mon "obstination" au calibrage. J'ai réussi en passant... ;)


Mesurer le nombre d'impulsions pour une quantité fixe , ex 5L à un débit de 1L/mn et disons 5L/mn, et comparer les valeurs.
Ce capteur est un capteur à turbine, comme les compteurs divisionnaires (précision de l'ordre de 1%,, au mieux, ft de la classe et de l'orientation).
Il ne sont pas précis, mais fidèles selon le constat des tes mesures, on peut donc corriger l'erreur).
Possible que la dernière proposition ne fonctionne pas.
LA solution est de placer un circuit RC différenciateur entre le capteur et le µC, pour déclencher l'interruption comme précédemment, mais le problème du blocage disparait.
C'est ce que je pensais faire jusqu'auà ce que j'utilise COUNT qui fonctionne...
 

ddaweb

New Member
Effectivement ça serait l'idéal sauf que SETINT ne fonctionne pas avec ce débitmètre. T'as 50% de chance d'entrer dans une boucle infini à chaque usage de la pompe.
Au risque de dire une bêtise, il me semblait que le setint réagissait soit sur un flanc montant, soit sur un flanc descendant :
Pour une interruption seulement sur l’entrée 1 à l’état haut : setint %00000010,%00000010
Pour une interruption seulement sur l’entrée 1 à l’état bas : setint %00000000,%00000010
Le seuil du flanc ne serait pas atteint, ou le retour à l'autre état ?
 
Last edited:

MGU

Senior Member
Ok, En fait la différence entre persévérance et obstination dépend du résultat obtenu: si c'est négatif, c'était de l'obstination, mais si c'est positif, c'était de la persévérance. Et si ça fonctionne, bravo.

setint fonctionne avec une liaison capacitive, j'ai vérifié, il faut que le pulse descendant arrive au niveau 0 TTL, Donc l'idéal est réalisable.
Ce serait plus propre avec le monostable évoqué #47

count donne effectivement un volume par unité de temps donc un débit, ça peut servir.

Quel est le débit moyen pour une douche en L/mn? 1, 5, 10 L/mn?
Si tu faisais le test impulsions/débit, pour voir comment réagit ton capteur.

Si ton programme fonctionne, merci de le publier, que chacun puisse en bénéficier.
Si count affecte time, c'est probablement qu'il utilise le même timer (comme serout).
count est aussi une commande bloquante, quand il compte, le µC ne fait rien d'autre, même les interruptions sont fonctionnent plus.

Programme de test avec liaison capacitive:
Code:
#picaxe 14M2
    symbol conso=w13
    symbol partiel=b1
    dirsB=%11111
    setfreq M32
    setint %0,%10    ;niveau 0 sur C.1
    serout B.0,T9600_32,(254,1)
        pause 100
    do
    bit0=time
    outpinB.1=bit0     ;B.1 clignote 
    loop

;****** sub interruption ***************************************     
interrupt: 
    inc partiel
    if partiel>=45 then        ;n litres/min = fréq/7,5
        inc conso            ;-> 1 litre/min = 7,5 impulsions/s
        partiel=0            ;-> 1 L = 7,5 x60 = 450 impulsions -> 0,1L =45 impulsions
        bintoascii conso,b2,b3,b4,b5,b6
        serout B.0,T9600_32,(254,128,"conso= ",b2,b3,b4,b5,",",b6)
    endif
       do loop while pinC.1=0     
    setint %0,%10    ;niveau 0 sur C.1 
    return
Mais comme ça fonctionne, ça sert à rien

MM
 
Last edited:

MGU

Senior Member
Au risque de dire une bêtise, il me semblait que le setint réagissait soit sur un flanc montant, soit sur un flanc descendant :
Le seuil du flanc ne serait pas atteint, ou le repos à l'autre état ?
Hello,
Non, l'interruption ne s'active pas par un front, mais par un niveau, et elle reste active tant que cette condition est vérifiée.
MM
 

ddaweb

New Member
Hello,
Non, l'interruption ne s'active pas par un front, mais par un niveau, et elle reste active tant que cette condition est vérifiée.
MM
Ok, merci pour cette info.
Il me semble donc que s'il reste dans une boucle infinie, la tension d'un seuil ne soit pas correcte ?
 

PieM

Senior Member
Vous ne semblez pas réaliser qu'il existe une relation entre débit et quantité.
Mes capacités intellectuelles ne me permettent pas effectivement de faire une relation directe, sans intervention de la notion de temps !
Chez moi mon compteur d'eau me donne le volume d'eau consommé, sans que j'utilise un chrono.
Vous vous obstinez (oui) à utiliser la fonction count qui donne une quantité en fonction du temps, donc un débit.
La seule chose qui serait "utile" dans cette mesure, compte tenu de la non linéarité du capteur en fonction de ce débit (voir #44), serait de corriger le cumul des impulsions selon la loi donnée par la courbe débit > pulses/litre.
Mais vu la galère que semble représenter ces mesures jusqu'à présent, il faut l'oublier!

Michel, pour le circuit différentiateur, je pense qu'il faudrait mettre une diode entrée picaxe > Vdd pour limiter le pic de tension positif..
Sinon, l'interruption bascule dont je parlais en #36 devrait marcher ! Mais si ça marche avec une simple capa, c'est mieux.
Ça semble relativement linéaire entre 200 et 600 l.
Il faudrait savoir si l'utilisation est dans cette plage ou pas...
Tout à fait ! après avoir contrôlé les valeurs réelles, car la doc me semble assez approximative, avec un graphique qui ne correspond pas au tableau!!
 
Last edited:

BESQUEUT

Senior Member
Mes capacités intellectuelles ne me permettent pas effectivement de faire une relation directe, sans intervention de la notion de temps !
Chez moi mon compteur d'eau me donne le volume d'eau consommé, sans que j'utilise un chrono.
Vous vous obstinez (oui) à utiliser la fonction count qui donne une quantité en fonction du temps, donc un débit.
La seule chose qui serait "utile" dans cette mesure, compte tenu de la non linéarité du capteur en fonction de ce débit (voir #44), serait de corriger le cumul des impulsions selon la loi donnée par la courbe débit > pulses/litre.
Mais vu la galère que semble représenter ces mesures jusqu'à présent, il faut l'oublier!

Michel, pour le circuit différentiateur, je pense qu'il faudrait mettre une diode entrée picaxe > Vdd pour limiter le pic de tension positif..
Sinon, l'interruption bascule dont je parlais en #36 devrait marcher ! Mais si ça marche avec une simple capa, c'est mieux.

Tout à fait ! après avoir contrôlé les valeurs réelles, car la doc me semble assez approximative, avec un graphique qui ne correspond pas au tableau!!
Mesurez le temps et le nombre d'impulsions nécessaires pour remplir un volume donné (1l ou 5l) à différentes pressions (=en ouvrant plus ou moins le robinet)
De là un petit tour dans Excel et on aura la courbe, et donc l'éventuel correctif à appliquer.
 

PieM

Senior Member
Mesurez le temps et le nombre d'impulsions nécessaires pour remplir un volume donné (1l ou 5l) à différentes pressions (=en ouvrant plus ou moins le robinet)
De là un petit tour dans Excel et on aura la courbe, et donc l'éventuel correctif à appliquer.
Bien d'accord ! Mais...
sinon, une interruption à bascule qui ne se bloque pas:
Rich (BB code):
#picaxe 08M2
setint %00, %10
b0 = 0
do
'......
'......     
loop
interrupt:
if b0 = 0 then
      inc b1 : b0 = 1
      setint %10, %10
else 
setint %00, %10: b0=0: endif
return
 

BESQUEUT

Senior Member
Bien d'accord ! Mais...
sinon, une interruption à bascule qui ne se bloque pas:
Rich (BB code):
#picaxe 08M2
setint %00, %10
b0 = 0
do
'......
'......     
loop
interrupt:
if b0 = 0 then
      inc b1 : b0 = 1
      setint %10, %10
else 
setint %00, %10: b0=0: endif
return
Oui, mais plutôt
inc w1
Vu le nombre d'impulsions à compter
 

MGU

Senior Member
Oui, mais plutôt
inc w1
Vu le nombre d'impulsions à compter
Oui, mais plutôt
inc w1
Vu le nombre d'impulsions à compter
Bonjour,

Merci BESQUEUT, je connaissais le cheval à bascule, mais l'interruption à bascule, je n'y aurais peut être pas pensé. C'est une alternative à la liaison capacitive, je vais tester.

Comme d'hab, il faut faire une partie du CDC.
Le débit des douches:
Sur le bateau, il faut chasser le gaspi. Limiter le débit de chaque douche à un max de 10l/mn (robinet en amont) me semble utile, (voire indispensable). 5 mn de douche=50l => 1000/50 = 20 douches , ça donne une idée. En plus, on reste dans la partie "linéaire" de la courbe, avec une précision acceptable, mesurable et éventuellement compensable. (Yex2 fera ce qu'il veut de la calibration...).
La mesure journalière demande une mesure de temps, une RTC, par ex. Autre idée, aux Antilles, la nuit tombe tous les jours à 6h du soir, Une LDR, on ajoute 6h et on a minuit avec une bonne approximation, sans pb de mise à l'heure. Mais à moins de fêter (laver) tous les jours au champagne celui qui à fait la conso mini la veille, je vois pas l'intérêt.

Pour revenir sur la liaison capacitive, pour les pulses positifs, la diode de protection fait son travail, mais une bat85 n'est pas inutile. Autre soluce , la mise en forme par un 555, qui donnerait des pulses positifs calibrés. Mais la "bascule de BESQUEUT" est une autre solution.

MM
 
Last edited:

Yex2

Well-known member
Ok, En fait la différence entre persévérance et obstination dépend du résultat obtenu: si c'est négatif, c'était de l'obstination, mais si c'est positif, c'était de la persévérance. Et si ça fonctionne, bravo.

setint fonctionne avec une liaison capacitive, j'ai vérifié, il faut que le pulse descendant arrive au niveau 0 TTL, Donc l'idéal est réalisable.
Ce serait plus propre avec le monostable évoqué #47

count donne effectivement un volume par unité de temps donc un débit, ça peut servir.

Quel est le débit moyen pour une douche en L/mn? 1, 5, 10 L/mn?
Si tu faisais le test impulsions/débit, pour voir comment réagit ton capteur.

Si ton programme fonctionne, merci de le publier, que chacun puisse en bénéficier.
Si count affecte time, c'est probablement qu'il utilise le même timer (comme serout).
count est aussi une commande bloquante, quand il compte, le µC ne fait rien d'autre, même les interruptions sont fonctionnent plus.

Programme de test avec liaison capacitive:
Code:
#picaxe 14M2
    symbol conso=w13
    symbol partiel=b1
    dirsB=%11111
    setfreq M32
    setint %0,%10    ;niveau 0 sur C.1
    serout B.0,T9600_32,(254,1)
        pause 100
    do
    bit0=time
    outpinB.1=bit0     ;B.1 clignote
    loop

;****** sub interruption ***************************************  
interrupt:
    inc partiel
    if partiel>=45 then        ;n litres/min = fréq/7,5
        inc conso            ;-> 1 litre/min = 7,5 impulsions/s
        partiel=0            ;-> 1 L = 7,5 x60 = 450 impulsions -> 0,1L =45 impulsions
        bintoascii conso,b2,b3,b4,b5,b6
        serout B.0,T9600_32,(254,128,"conso= ",b2,b3,b4,b5,",",b6)
    endif
       do loop while pinC.1=0  
    setint %0,%10    ;niveau 0 sur C.1
    return
Mais comme ça fonctionne, ça sert à rien

MM
Salut Michel,

Je vais l'essayer parce que la fonction "time" ne fonctionne pas bien avec COUNT même lorsque celui-ci ne compte rien. J'ai l'impression que sa simple présence dans le code bloque l'horloge. L'horloge s'arrête lorsque que COUNT compte des impulsions. Elle repart lentement(1/3 de la vitesse) lorsque COUNT à fini de compter.

Dans ma dernière version avec SETINT la fonction "time" fonctionnait. Je m'en servais pour enregistrer les données MIN et MAX après chaque cycle (douche). J'avais programmé d'enregistrer les données de la douche après 120 secondes d'inactivitées de la pompe (version chalet) et 24 heures d'inactivitées (version bateau).

Questions concernant ton code :

Tu écris : "setint %0,%10 ;niveau 0 sur C.1",
c'est la même chose que "setint %00000000,%00000010 ;niveau 0 sur C.1" ? On peut négliger les 0 inutiles ?

Tu écris :
bintoascii conso,b2,b3,b4,b5,b6
serout B.0,T9600_32,(254,128,"conso= ",b2,b3,b4,b5,",",b6)

Est-ce une manière raccourcis de communiquer avec le LCD où il y a du code supplémentaire qu'on ne voit pas ?

A+

Yves
 
Last edited:

Yex2

Well-known member
Ok, merci pour cette info.
Il me semble donc que s'il reste dans une boucle infinie, la tension d'un seuil ne soit pas correcte ?
Salut ddaweb,

C'est le débitmètre qui est construit comme ça. Lorsqu'il cesse de tourner il s'arrête sur l'un ou l'autre des niveaux "0" ou "1" et reste là jusqu'à ce qu'il tourne à nouveau. Alors s'il s'arrête sur le niveau que tu as choisi pour générer l'intérruption, il cause une loop infini. C'est une véritable loterie !

Ça m'a pris deux jours pour réaliser pourquoi mon programme entrait dans une loop infinie une fois sur deux... Mais à 4 Euro l'appareil, il fallait pas s'attendre à la qualité de la NASA... ;-)

Le découplage capacitif est intéressant et simple à réaliser. Il reste à vérifier s'il sera assez précis sans manquer d'impulsion. Le problème que j'entrevois c'est la basse fréquence du débitmètre. Et malheureusement je ne me souviens plus tellement des formules à utiliser pour calculer la bonne valeurs des composantes à utiliser.
 

Yex2

Well-known member
M
Mes capacités intellectuelles ne me permettent pas effectivement de faire une relation directe, sans intervention de la notion de temps !
Chez moi mon compteur d'eau me donne le volume d'eau consommé, sans que j'utilise un chrono.
Vous vous obstinez (oui) à utiliser la fonction count qui donne une quantité en fonction du temps, donc un débit.
La seule chose qui serait "utile" dans cette mesure, compte tenu de la non linéarité du capteur en fonction de ce débit (voir #44), serait de corriger le cumul des impulsions selon la loi donnée par la courbe débit > pulses/litre.
Mais vu la galère que semble représenter ces mesures jusqu'à présent, il faut l'oublier!

Michel, pour le circuit différentiateur, je pense qu'il faudrait mettre une diode entrée picaxe > Vdd pour limiter le pic de tension positif..
Sinon, l'interruption bascule dont je parlais en #36 devrait marcher ! Mais si ça marche avec une simple capa, c'est mieux.

Tout à fait ! après avoir contrôlé les valeurs réelles, car la doc me semble assez approximative, avec un graphique qui ne correspond pas au tableau!!
M. PieM,

Mettons les choses au clair.

A) Je ne vous ai rien demandé personnellement. J'ai ouvert ce sujet en demandant simplement si quelqu'un connaissait la fonction COUNT. Apparemment ce n'est pas le cas, puisque personne ne m'a répondu à date...

B) c'est mon deuxième projet avec les picaxes. Le premier c'est un projet de sonde capacitive que Michel a fait. J'ai rien conçu, Michel à pas mal tout fait. Pour ce projet je désire le faire moi-même. De là mon "obstination" à vouloir comprendre les fonctions du micro contrôleur...

C) Je fais ce projet pour m'amuser et bricoler. Le projet en soit n'a pas d'importance c'est l'apprentissage qui compte. Que mon choix de fonction "COUNT vs SETINT" vous déplaise, ou que vous croyez que je me trompe d'approche ou fais fausse route, désolé MAIS j'en ai vraiment rien à foutre ! À la fin de ce projet, je serai comment utiliser les deux fonctions. C'est le but de l'excercise. Mon programme avec COUNT fonctionne déjà et maintenant je vais réessayer celui avec SETINT parce que je n'aime pas échouer et je veux comprendre. L'apprentissage est plus important que le projet.

D) Finalement, je n'ai pas besoin de vos critiques désagréables et non-constructive. Tant pis si vous croyez que la persévérance c'est de l'obstination. À chacun son point de vu. Je me console ne me rappelant que les grands scientistes de ce monde ont parfois mis une vie entière à prouver une théorie que leurs collègues s'entêtaient à leur dire qu'il faisait fausse route...

Bonne journée et bonne réflexion,

Yex.

PS: si vous aviez pris le temps de regarder la manière que j'ai utilisé COUNT, vous comprendriez que c'est effectivement une quantité que j'obtiens. J'ai essayer plusieurs périodes (1/4 de sec, 1/2 sec, etc) et il s'avère qu'elle sont pas mal précise à partir d'une seconde.

Code:
    Count C.3, 4000, Hz        ; comptage des impulsions pendant 1 s, Le pic tourne à 16 MHz

    impulsions    = Hz + impulsions
Ensuite je fais le même traitement avec impulsion pour compter le 0.1 L et incrémenter la consommation.

Voilà, le débit dans le temps donne une quantité. ;)

Ce qui est intéressant avec la fonction COUNT avec une période de 1 sec c'est que Hz correspond justement ± à la fréquence du débitmètre.
 
Last edited:

Yex2

Well-known member
Mesurez le temps et le nombre d'impulsions nécessaires pour remplir un volume donné (1l ou 5l) à différentes pressions (=en ouvrant plus ou moins le robinet)
De là un petit tour dans Excel et on aura la courbe, et donc l'éventuel correctif à appliquer.
Bonjour,

Ce n'est pas nécessaire de faire compliquer pour mon projet. Un simple calibrage au départ est suffisant puisque la pompe utilisée a un débit et pression constante. Elle devrait rester dans une plage assez constante.

Dans le cas du premier projet (chalet) elle est de 11 L/min @ une pression de 3.4 BAR max. Donc théoriquement 660 L/H. Avec la résistance de la plomberie, on devrait aller sous les 600 L/H. Si je suis chanceux, le débit sera entre 400 et 600 L/H qui semble être une plage assez constante. Donc le calibrage initial devrait mener vers une mesure relativement précise.

Dans le cas du deuxième projet (le voilier) je ne le sais pas. Je sais qu'elle est plus forte mais je ne sais pas de combien. Par contre il y a 4 douches à des distance inégale de la pompe. Le calibrage s'impose. Comme le bateau se trouve à± 2000 km d'ici, il faut que je fasse un programme qui permettra de se calibrer automatiquement. Sinon une fois sur place ça risque de ne pas fonctionner et je ne pourrai pas corriger le programme avant l'année suivante.
 
Last edited:

Yex2

Well-known member
Bien d'accord ! Mais...
sinon, une interruption à bascule qui ne se bloque pas:
Rich (BB code):
#picaxe 08M2
setint %00, %10
b0 = 0
do
'......
'......     
loop
interrupt:
if b0 = 0 then
      inc b1 : b0 = 1
      setint %10, %10
else 
setint %00, %10: b0=0: endif
return
Je trouve ça génial et simple comme idée. (y)

Dans ce cas il faudrait également coder la bascule au début du programme parce que lorsqu'on met le circuit sous tension, le débitmètre sera dans l'une ou l'autre des états causant un bloquage au départ une fois sur deux si pas de bascule...
 

Yex2

Well-known member
La mesure journalière demande une mesure de temps, une RTC, par ex. Autre idée, aux Antilles, la nuit tombe tous les jours à 6h du soir, Une LDR, on ajoute 6h et on a minuit avec une bonne approximation, sans pb de mise à l'heure. Mais à moins de fêter (laver) tous les jours au champagne celui qui à fait la conso mini la veille, je vois pas l'intérêt.
Intéressant comme idée. Je pourrais justement utiliser les panneaux solaires en guise d’œil magique. Lorsqu'ils sont à 0V, j'ajoute 6 ou 7 heures afin que le reset se fasse toujours dans la nuit.
 

PieM

Senior Member
A) Je ne vous ai rien demandé personnellement. J'ai ouvert ce sujet en demandant simplement si quelqu'un connaissait la fonction COUNT. Apparemment ce n'est pas le cas, puisque personne ne m'a répondu à date...
Pensez à préciser qui a le droit de vous répondre sur un forum publique.
Je me suis donné la peine de répondre en #3 . pas assez rapide ?
Pour la liaison capteur picaxe, j'ai proposé en #36 une solution :
- avec circuit dérivateur, repris ensuite par Michel.
- avec utilisation d'une interruption a bascule également en #36, que j'ai explicité en #56 par un bout de programme.
ça ne vous intéresse pas ? Cela m'est totalement équilatéral.
Utiliser la fonction count, ça veut dire que votre picaxe ne pourra rien faire d'autre que des count successifs. même faire une addition, il peut passer à coté d'une impulsion!
Rassurez vous, je n'ai pas l'intention de passer plus de temps sur votre problème avec un obstiné mal comprenant.
Je me console ne me rappelant que les grands scientistes de ce monde ont parfois mis une vie entière à prouver une théorie que leurs collègues s'entêtaient à leur dire qu'il faisait fausse route...
Bon vent monsieur le grand scientiste... et gare aux chevilles!
 

Yex2

Well-known member
Pour la liaison capteur picaxe, j'ai proposé en #36 une solution :
- avec circuit dérivateur, repris ensuite par Michel.
- avec utilisation d'une interruption a bascule également en #36, que j'ai explicité en #56 par un bout de programme.
ça ne vous intéresse pas ? Cela m'est totalement équilatéral.
relisez donc #65...

Utiliser la fonction count, ça veut dire que votre picaxe ne pourra rien faire d'autre que des count successifs. même faire une addition, il peut passer à coté d'une impulsion!
Effectivement, je l'avais constaté et mentionné. Cependant, il passait à côte de façon rigoureuse... Au final le résultat demeurait précis.:unsure:

C'est justement pourquoi je posais la question initial, "comment ça marche cette fonction" ?

Rassurez vous, je n'ai pas l'intention de passer plus de temps sur votre problème avec un obstiné mal comprenant.

Bon vent monsieur le grand scientiste... et gare aux chevilles!
Gardez vos jugements de valeur pour vous SVP. C'est précisément ce que j’essayais de vous expliquer à #62...
 

PieM

Senior Member
Gardez vos jugements de valeur pour vous SVP. C'est précisément ce que j’essayais de vous expliquer à #62...
Que mon choix de fonction "COUNT vs SETINT" vous déplaise, ou que vous croyez que je me trompe d'approche ou fais fausse route, désolé MAIS j'en ai vraiment rien à foutre
Je ne suis effectivement pas certain que le forum vous soit d'une grande aide, et vu vos difficultés à comprendre le B.A. BA de la documentation du Picaxe, c'est mal barré.
 

Yex2

Well-known member
Je ne suis effectivement pas certain que le forum vous soit d'une grande aide, et vu vos difficultés à comprendre le B.A. BA de la documentation du Picaxe, c'est mal barré.
Toujours aussi plaisant à ce que je vois o_O. Inutile d'être déplaisant monsieur. Gardez vos énergies négatives pour les vrais combats de la vie. Ce n'est qu'un forum de hobby ici, for God's sake! Revenez sur terre...

Dans la vie il y a des personnalités qui ne sont pas compatibles. Visiblement c'est notre cas. Je vous trouve déplaisant depuis votre toute première intervention. Alors comme disent les Anglais, "lets agree to disagree". Si vous êtes incapable d'être courtois avec moi alors Ignorez moi et je ferai de même.

Merci de votre attention, et bonne soirée.

Yex.
 

BESQUEUT

Senior Member
Dans ce cas il faudrait également coder la bascule au début du programme parce que lorsqu'on met le circuit sous tension, le débitmètre sera dans l'une ou l'autre des états causant un bloquage au départ une fois sur deux si pas de bascule...
Ben non : pas de blocage.
Si le compteur ne tourne pas il n'y a pas d'interruption ce qui est normal.

Une autre façon d'écrire l'interruption, plus concise, mais pas mieux que la version Piem car elle incrémente dans les deux sens...
Rich (BB code):
interrupt:  ' 15 octets
      b0=%10-b0
      setint b0, %10
      inc w0
return
Il faudra donc diviser par deux le facteur de conversion d'impulsions en litres...

Mais le mieux serait d'utiliser une interruption hard, laquelle fonctionne sur une transition et non sur un état.
Dans ce cas, l'interruption serait :
Rich (BB code):
interrupt:
      inc w0
return
epicetout !
 
Last edited:

BESQUEUT

Senior Member
MGU said:
Toutefois, il est possible (probable) que le débit ait une influence sur cette mesure. Pour voir cette influence, il faut faire un test:

C'est la première chose que j'ai fait et je l'ai immédiatement constater. De là mon "obstination" au calibrage. J'ai réussi en passant... ;)
Mais en #63 vous affirmez que le débit est toujours le même : donc il n'est pas nécessaire de tenir compte du débit,
et donc il suffit de compter le nombre d'impulsions pour avoir un compteur et non un débitmètre.
Par contre, pour connaitre le coefficient de conversion optimal, il est nécessaire de faire au moins un test avec le circuit réel.
A défaut, j'ai proposé de faire différents tests avec des débits différents, ce qui permet d'ajuster ce coefficient automatiquement en fonction du débit constaté.
 

PieM

Senior Member
Mais le mieux serait d'utiliser une interruption hard, laquelle fonctionne sur une transition et non sur un état.
Pas possible sur un M2 .
Et si c'est un X2 il y a encore plus simple en utilisant settimer externe qui compte en tâche de fond les fronts montant, sans avoir d'interruption à gérer.
Le preload permettrait également éventuellement de corriger la variation liée au débit. Car contrairement à ce qui est affirmé, par construction une pompe centrifuge obéît à une loi de variation qui est une courbe débit/pression; le débit ne peut être constant quand la charge réseau varie...
 

BESQUEUT

Senior Member
Pas possible sur un M2 .
Et si c'est un X2 il y a encore plus simple en utilisant settimer externe qui compte en tâche de fond les fronts montant, sans avoir d'interruption à gérer.
Le preload permettrait également éventuellement de corriger la variation liée au débit. Car contrairement à ce qui est affirmé, par construction une pompe centrifuge obéît à une loi de variation qui est une courbe débit/pression; le débit ne peut être constant quand la charge réseau varie...
tres juste...
Mais comme d'habitude on choisi d'abord le Picaxe et on écrit le programme avant d'écrire le CDC...
 

PieM

Senior Member
Mais comme d'habitude on choisi d'abord le Picaxe et on écrit le programme avant d'écrire le CDC...
Il manque en fait que la longueur du bateau et la surface du chalet. On sait qu'il faut se ravitailler aux Antilles et qu'il y a du champagne à bord.
Il était important de préciser le contexte...
 

MGU

Senior Member
Bonjour,

Je reviens sur la liaison capacitive, et je réponds à #60.
Les 0 non significatifs ne sont pas obligatoires. On les met parfois pour signaler qu'il s'agit d'octets.

Voici un schéma qui fonctionne de 0 à 30L/mn (au moins)
Le LCD est un 1602 avec adaptateur série, lent, pour ne pas rater de pulses, la fréquence doit être à 32 MHz, ce n'est peut être pas obligatoire avec un LCD I2C.
Schéma:
23087

Le code d'essai, la led est pour la déco et visualiser le fonctionnement de time (0,5Hz à 32MHz)

Code:
#picaxe 14M2
    symbol conso=w13
    symbol partiel=b1
    dirsB=%11111
    setfreq M32
    pause 500        ;init LCD
    serout B.0,T9600_32,(254,1)
    serout B.0,T9600_32,(254,1,254,128,"conso= ")
        setint %0,%10    ;niveau 0 sur C.1 
    do
    bit0=time
    outpinB.1=bit0     ;led sur B.1 clignote 
    loop

;****** sub interruption ***************************************     
interrupt: 
    inc partiel
    if partiel>=45 then        ;n litres/min = fréq/7,5
        inc conso            ;-> 1 litre/min = 7,5 impulsions/s
        partiel=0            ;-> 1 L = 7,5 x60 = 450 impulsions -> 0,1L =45 impulsions
        bintoascii conso,b2,b3,b4,b5,b6
        serout B.0,T9600_32,(254,136,b2,b3,b4,b5,",",b6)
    endif
       do loop while pinC.1=0     
    setint %0,%10    ;niveau 0 sur C.1 
    return
 
Last edited:

BESQUEUT

Senior Member
On ne le répétera jamais assez :
Le code d'une interruption doit être le plus rapide possible. En tout cas jamais de commandes séries et de do loop dans une interruption, au risque de rater des événements...
Piem et moi-même avons donné des codes non bloquants.
 

MGU

Senior Member
On ne le répétera jamais assez :
Le code d'une interruption doit être le plus rapide possible. En tout cas jamais de commandes séries et de do loop dans une interruption, au risque de rater des événements...
Piem et moi-même avons donné des codes non bloquants.
Vous avez tout à fait raison dans le principe. Mais, avec ce code d'essai, si on place le serout dans la,boucle principale, on rate la moitié des pulses, il faut limiter l'usage du serout au strict minimum et le do loop est juste là pour vérifier que la condition de l'interruption a disparu.
Mais ce n'est sans doute pas un exemple à suivre, même si en l’occurrence, il fonctionne.

Mm
 

BESQUEUT

Senior Member
. Mais, avec ce code d'essai, si on place le serout dans la,boucle principale, on rate la moitié des pulses,
Qu'est-ce qui vous fait dire ça ?
Si c'était le cas, ce serait la même chose avec votre code.
Quand au do loop
A priori il provoque un blocage du programme une fois sur deux...
 

MGU

Senior Member
Qu'est-ce qui vous fait dire ça ?
Si c'était le cas, ce serait la même chose avec votre code.
Quand au do loop
A priori il provoque un blocage du programme une fois sur deux...
Un simple essai en vraie grandeur. En plaçant le serout dans la boucle principale, il est exécuté inutilement à chaque boucle et on lit à 75 Hz une quantité de 5 ou 6 litres au lieu de 10.
Dans l'interrupt, il n'est exécuté que toutes les 45 interruptions, on monte à 30l/mn sans problème, à 32MHz. même si on perd quelques pulses. A 75Hz (10L/mn) T=13,3ms
Avec la liaison capacitive, il n'y a pas de blocage. L'interruption est sur le niveau bas, avec 100nF et 10k (RC= 1ms) en 1ms, le niveau bas du pulse est au dessus du niveau 0 TTL

Cela dit, vous avez raison, mais le but était de valider le déclenchement de l'interruption. la10k est en fait remplacée par un pont 10k/22k pour être moins sensible au niveau des créneaux du capteur hall.

MM
 

PieM

Senior Member
Question idiote: est-il bien nécessaire d'actualiser un affichage tous les 0.1l pour quelqu'un qui prend une douche ....
Parce que prendre une douche en ayant les yeux fixés sur un compteur, fallait l'inventer!
Et à titre indicatif un serout B.0,T9600_32,(254,136,b2,b3,b4,b5,",",b6) prend environ 13 à 15 ms : 5.2 ms pour l'interprétation de serout et 8,3 ms pour transmettre les données à 9600bauds...
 
Top