Go Down

Topic: Récupérer les données d'un débitmètre  (Read 774 times) previous topic - next topic

68tjs

Il ne faut pas faire passer 100 mA dans le contact, il faut simplement ajouter une résistance en série avec la 47 ohms.
- soit comme le propose Fdufnews en utilisant les résistances de tirage interne (les pull-up) . Les pull-up font entre 30 k et 70 k ohms selon le lot de fabrication du microcontrôleur.
-soit comme je l'ai proposé en ajoutant une résistance externe de 10k ohms en série avec la 47 ohms.

Sans oublier dans tous les cas d'utiliser un anti rebond matériel (condensateur de 100 nF) ou logiciel.

Quote
On ne va quand même pas chercher à 'rééduquer les chauffagistes !!"....
Et pourquoi pas :smiley-mr-green:

C'est vrai que j'ai lu beaucoup de bien sur les produits de cette marque,et que je trouvais étrange d'avoir une si mauvaise documentation.
Sans les envoyer en camp de rééducation ils pourraient voir ce que fait la concurrence et qui est beaucoup plus clair.



Claire21

J'obtiens des valeurs autour de 15 pour la position fermée et autour de 1000 pour la position ouverte, sur plaque, avec le programme de J-M-L.
Avec le débitmètre, j'obtiens des valeurs assez bizarres. Si par exemple le compteur commence à compter à 1L, à 1,03L j'obtiens des valeurs vers 1000, à 1,09L des valeurs vers 15, à 1,13L des valeurs vers 1000, à 1,19L des valeurs vers 15 etc...
Aucune variation liée à l'ouverture et à la fermeture ne semble être mise en évidence (Il y a une fermeture tout les 0,1 L normalement).
Dans la configuration des tests avec ce programme, le débitmètre n'était pas alimenté.

Je vais tester d'autres choses, comme des interrupts. J'avais essayé avec une pin digitale, pas analogique, mais je ne pense pas que ça va changer grand chose. J'ai aussi essayé d'alimenter le débitmètre en 3,3 V et de de rajouter une résistance extérieure de 47 Ohms, sans résultat, de même avec les PULL-UP. Je vais essayer avec une résistance externe de 94 Ohms, je n'ai pas plus pour le moment.

Je ne comprends toujours pas s'il est nécessaire d'alimenter le débitmètre (en respectant la limite des 50mA bien sûr) afin de récupérer le courant si l'interrupteur est fermé, ou bien si je pourrais capter les impulsions lors de la fermeture du circuit. J'ai essayé les 2 options mais sans résultats pour le moment.

J'ajouterai un anti-rebond quand j'arriverai à capter la fermeture du circuit, merci de m'y avoir fait penser.

J-M-L

Je ne comprends toujours pas s'il est nécessaire d'alimenter le débitmètre (en respectant la limite des 50mA bien sûr) afin de récupérer le courant si l'interrupteur est fermé, ou bien si je pourrais capter les impulsions lors de la fermeture du circuit. J'ai essayé les 2 options mais sans résultats pour le moment.
si vous n'envoyez rien d'un côté, la fermeture ou ouverture du contact ne va pas vous aider à mesurer quoi que ce soit. pour mesurer une "continuité" il faut envoyer un truc d'un côté et voir s'il ressort de l'autre :)

Dans mon exemple en mettant la PIN en INPUT_PULLUP et l'autre côté au GND, ça crée un circuit avec très peu de courant qui circule (car le pull-up est de 20k à 50kΩ en interne sur un UNO)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Claire21

Finalement, après réflexion cela fonctionne même sans envoyer de courant.
En effet, si on a ces valeurs :
0,03 : affiche 1000
0,09 : affiche 15
0,13 : affiche 1000
0,19 : affiche 15
0,23 : affiche 1000

Donc finalement, cette information suffit car tous les 0,1 L, on revient à 1000. Seule la première valeur est fausse et donc à corriger.
Je peux donc dans le programme mettre de compter 0,1 L à chaque fois qu'on obtient autour de 1000, après avoir corrigé l'erreur du début. Cela me suffit pour calculer mon débit.

Merci à tous pour votre aide.  :)
Je mettrai mon programme complet pour le calcul de débit dans cette conversation si ça peut aider certains.

al1fch

#19
Dec 14, 2018, 04:55 pm Last Edit: Dec 14, 2018, 05:08 pm by al1fch
Comme sur la doc de ce compteur volumétrique :   une fermeture de contact tous les décilitres.... mais pas en goutte à goutte  car le comptage ne progresse correctement que si le débit est supérieur à 0,4l/h
(Le terme 'générateur d'impulsion' trouble l'électronicien puis qu'il ne s'agit en fait que d'un contact d'ILS)

J-M-L

Finalement, après réflexion cela fonctionne même sans envoyer de courant.
quand vous mettez la pin en INPUT_PULLUP vous envoyez du courant, suffisamment pour allumer très légèrement une LED par exemple

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

68tjs

#21
Dec 14, 2018, 07:49 pm Last Edit: Dec 14, 2018, 08:09 pm by 68tjs
Je pense que Claire ne voit pas très bien le rôle des composants.

L'ampoule Reed qui est dans le compteur ressemble à ceci
L'image provient de Wikipédia http://fr.wikipedia.org/wiki/Interrupteur_reed:

Les lames sont magnétiques et on les ferme à l'aide d'un champ magnétique.
Dans le cas du compteur volumétrique le champ magnétique est apporté par l'aimant qui est actionné par le compteur.

Le schéma de la sortie du compteur  à l'entrée de la carte arduino est celui ci :



Note : Le condensateur n'est utile que si tu fais un anti rebond matériel, valeur 100 nF

A gauche tu as la sortie du compteur volumétrique : l'ampoule reed et sa résistance de protection de 47 ohms.
Un coté est relié à la masse le 0V, l'autre coté est relié à l'entrée D2 de la carte arduino ( pour le cas où tu choisirai d'utiliser les interruptions).
L'entrée D2 est configurée par la fonction pinMode pour avoir la résistance de pull-up en service. Cette résistance fait entre 30 et 70 k ohms.
L'autre extrémité de cette résistance est relié au Vcc à l'intérieur du micro, donc quand le contact est fermé il passe un courant maximal de 5V/30k =0,16 mA et la tension est donné par le pont diviseur 30k/47 ohms ce qui donne V = 8mV.
Quand le contact est ouvert la tension est Vcc = 5V

La variante que je proposais est de mettre une 10 k à l'extérieur du micro au lieu d'utiliser la pull_up du micro,  mais c'est du détail cela fonctionnera très bien avec la pull-up interne.

fdufnews

#22
Dec 14, 2018, 08:26 pm Last Edit: Dec 14, 2018, 08:30 pm by fdufnews
Finalement, après réflexion cela fonctionne même sans envoyer de courant.
En effet, si on a ces valeurs :
0,03 : affiche 1000
0,09 : affiche 15
0,13 : affiche 1000
0,19 : affiche 15
0,23 : affiche 1000

Donc finalement, cette information suffit car tous les 0,1 L, on revient à 1000. Seule la première valeur est fausse et donc à corriger.
Je peux donc dans le programme mettre de compter 0,1 L à chaque fois qu'on obtient autour de 1000, après avoir corrigé l'erreur du début. Cela me suffit pour calculer mon débit.

Merci à tous pour votre aide.  :)
Je mettrai mon programme complet pour le calcul de débit dans cette conversation si ça peut aider certains.
Ce n'est pas une erreur de début. A un instant donné, l'ILS est ouvert ou fermé.
Si il est fermé, tu mesures une valeur proche de 0.
Si il est ouvert, tu mesures une valeur proche de 1023.
Maintenant tu ne peux pas te contenter de compter + 0,1L à chaque fois que tu relèves une valeur autour de 1000, car si le compteur s'arrête avec l'ILS ouvert tu vas avoir 1000 en permanence.

al1fch

#23
Dec 14, 2018, 08:45 pm Last Edit: Dec 14, 2018, 09:18 pm by al1fch
L'état ouvert ou fermé du contact dépend de la position angulaire du champ magnétique tournant.
Quand le débit est nul ou trés faible le champ magnétique arrête sa rotation dans une position angulaire quelconque
Il faut compter les changements d'état du contact.

68tjs

#24
Dec 14, 2018, 09:32 pm Last Edit: Dec 14, 2018, 09:33 pm by 68tjs
Mais pourquoi faire une mesure analogique ?
Cela ne rime à rien dans l'application où on mesure du tout ou rien.

Une mesure analogique utilise largement plus de cycles horloge qu'une mesure numérique.

J'aurai pu le préciser mais quand je parlais d'interruption c'était bien pour détecter les fronts.
Cela me fait penser qu'on ne sait toujours pas quelle est la carte arduino utilisée, on peut toujours proposer des numéros de pins pour une Uno mais si de l'autre coté c'est une mega ou une leonardo ça va planter immédiatement.

fdufnews

#25
Dec 14, 2018, 10:12 pm Last Edit: Dec 14, 2018, 10:14 pm by fdufnews
C'est une Uno. C'est dit dans le 1er message.
Le problème sera le même avec une entrée logique. Il faut travailler sur les fronts et non sur l'état.

J-M-L

#26
Dec 14, 2018, 11:13 pm Last Edit: Dec 14, 2018, 11:14 pm by J-M-L
Cf plus haut oui j'ai utilisé une entrée analogique juste pour voir si les valeurs n'étaient pas proches de 0 et 1023 - histoire de savoir si quelque chose se passait au sein de son système

Comme dit plus haut migrer vers D2 en interruption sur CHANGE est la bonne chose à faire
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Claire21

Bonjour à tous,

j'ai pris note de vos remarques et je vais tester avec les interruptions. Je pense qu'elles me seront également utiles lorsque je voudrais envoyer les données à l'aide du shield suivant :
https://www.gotronic.fr/art-shield-gprs-iot-tel0089-25733.htm

Encore merci  :smiley:

Claire21

Bonjour,

Après plusieurs tests, j'ai obtenu le programme suivant qui fonctionne. Je récupère donc un débit toutes les 10 impulsions.

Code: [Select]

#include <TimeLib.h>

volatile boolean change;
volatile int i = 0; //nonbre d'implusions reçues
int SWITCHPIN = 2; 
int start = 0;
int tps; //timer
float debit;
int k = 0; //compte des minutes
float duree ; //temps écoulé entre 10 impulsions

void setup() {
Serial.begin(9600);
pinMode(SWITCHPIN, INPUT_PULLUP);
attachInterrupt(1, IntChange, CHANGE);
}

void loop() {
Serial.println(digitalRead(SWITCHPIN));
delay(1000);
if (change==true) {
    i+=1;
    Serial.println("i=");Serial.println(i);
    change=false;
    //delay(1000);
  }
if (i>1) //pour enlever la première impulsion qui fausserait potentiellement le calcul du débit
tps=second();

if (tps >= 59)
k+=1;

if (i > 10)
{
  duree = tps + k*60 ;
  Serial.print("duree="); Serial.println(duree);
  debit = 3600/duree ;
  Serial.print("debit="); Serial.println(debit);
  i = 0;
  tps = 0;
  k = 0;
  delay(1000);
}
 
}

void IntChange() {
 if (digitalRead(SWITCHPIN)==LOW) {
  start=0;
  change=false;
 }
 else {
  if (start<1) {
    change=true;
    start=1;
  }
  else {
    start=1;
    change=false;
  }
  }
}


Je joins également un schéma du montage réalisé.

Merci à tous pour vos conseils et votre aide :)

Go Up