Besoin d'info pour interfacer un compteur d'eau à émetteur d'impulsion

Bonjour à tous, je dispose d'un compteur d'eau qui est équipé d'un émetteur d'impulsion, je souhaite l'interfacer avec mon arduino mais je rencontre quelques difficultés car je suis pas très doué en électronique :disappointed_relieved:, les caractéristiques de la sortie «impulsion» sont les suivantes :

  • Sortie transistor à collecteur ouvert de type NPN
  • Etat fermé en présence d’une impulsion.
    je dispose de deux fil l'un pour les impulsions l'autre pour la masse

pour mon code j'ai besoin impérativement d'utiliser un interruption de ce faite j'ai bêtement connecté le fils impulsion sur la broche 2 et le fils de masse sur mon arduino, pour le code j' ais utilisé celui-ci dessous issu d'un tuto, le compteur envoi 1 impulsion lorsque 1L d'eau est consommée le problème étant que quand l'arduino reçois l'impulsion elle m'en compte trois au lieu d'une

si quelqu'un peut m'aiguiller sur mon pb merci d'avance

volatile int comptageImpulsion=0; 

void setup()   { 

digitalWrite(2, HIGH);
Serial.begin(115200);

attachInterrupt(0, gestionINT0, CHANGE);

}


void loop(){ 

} 

void gestionINT0() {

comptageImpulsion=comptageImpulsion+1;

Serial.print("Nombre impulsions = "); 
Serial.println(comptageImpulsion); 

}

Bonjour,

Je ne sais pas pourquoi 3 mais 2 ça parait normal puisqu'il me semble que ce code

attachInterrupt(0, gestionINT0, CHANGE);

contenant les modes de déclenchement possibles = LOW, CHANGE, RISING, FALLING (cf. mon club elec)

va compter les changements d'état, donc il y en a au moins 2 (passage de 0 à 1 puis de 1 à 0),
a la place de CHANGE, un RISING me parait plus approprié.

mais 3 ?? un oscillo sous la main peut être ?? ou sinon un arduino :slight_smile: avec un snapshot du signal pour valider son fonctionnement ?

Lionel

merci pour ta réponse, pour la partie interrupt j'ai déjà essayé les quatres LOW, CHANGE, RISING, FALLING mais j'ai le même pb, malheureusement je n'ai pas d'oscillo, sous la main sinon quelle est cette methode avec l'arduino "snapshot de signal" ?

merci encore

Peut-être un effet de rebond. Essaye en RISING et en désactivant les interruptions une fois la routine d'interruption lancée, et en les relançant à la fin de la même routine.

Effectivement, ça peut être du rebond

gnomathibus:
merci pour ta réponse, pour la partie interrupt j'ai déjà essayé les quatres LOW, CHANGE, RISING, FALLING mais j'ai le même pb, malheureusement je n'ai pas d'oscillo, sous la main sinon quelle est cette methode avec l'arduino "snapshot de signal" ?

le lien que j'ai mis plus haut
http://code.google.com/p/xoscillo/
permet d'utiliser un arduino comme un oscilloscope (modeste)
je te suggérai de l'installer et de l'utiliser pour analyser le signal issu de ton capteur, au cas ou les rebonds ne soient pas trop rapides pour être capturés.
et enfin de faire une capture d'écran (snapshot)

Lionel

Merci pour les replys, dès que je peux je fais les tests avec les conseils donnés et je vous retiendrais au courant

retour de test, j'ai donc mis mon arduino en mode oscillo avec le prog xoscillo puis branché la sortie impulsion de l’émetteur sur la broche 0 analogique de l'arduino mais malheureusement le trigger du programme de l'oscillo ne se déclenche pas, donc pas de visu de l'impulsion :frowning:

sinon j'ai mis la désactivation de l'interruption quand celle-ci s'ouvre, puis réactivation lorsqu'elle celle-ci termine son exécution et la c'est mieux il compte 2 impulsion au lieu des trois précédemment mais j'ai toujours pas régler mon pb.

Plus performant que Xoscillo (qui ne fait chez moi aucune acquisition analogique ou numérique) il y a ça pour enregistrer, observer et analyser des signaux logiques :
http://arduino.cc/forum/index.php/topic,69885.0.html

La sortie impulsion est en collecteur ouvert, tu as bien une résistance de pull up sur l'entrée ?

Dans un autre ordre d'idée, il y a tout un tas de choses qu'il est préférable d'éviter dans les routines d'interruption.
Personnellement j'aurais sorti les Serial.print de cette routine, positionné un booléen à 1 pour indiquer le passage dans l'IT. Dans loop() j'aurais testé le booléen et s'il est positionné j'imprime la variable et je le remets à 0.

comme j'ai indiqué dans mon premier post j'ai branché la sortie impulsion en direct sur la broche 2 de mon arduino et j'ai activé le pull up interne de la carte, mais comme je ne suis pas très calé en électronique pense tu qu'il soit necessaire de rajouter une résistance de pull up et de quelle valeur ?

avec le pull up interne de 20 kOhm ça devrait aller mais je ne suis pas certain qu'il soit activé sans la séquence suivante qui écrit 1 sur un pin positionnée au préalable en entrée. (Après un reset il me semble que les pins sont en entrées par défaut mais deux précautions valent mieux qu'une !!)

pinMode(2, INPUT);
digitalWrite(2, HIGH)

Sinon un pull up externe de 10 kOhm ferait l'affaire avec éventuellement 100nF entre pin2 et masse.

Pour l"attach interrupt" je mettrai RISING ou FALLING comme conseillé précédemment.

Dans la routine d'interruption je pense également qu'il est préférable en général de ne laisser que "ce qui ne peut pas attendre" et qui peut être "vite fait" (incrémenter le compteur et lever un drapeau 'le nombre a changé').... l'affichage, lui, peut etre fait dans la boucle loop() de manière conditionnelle si le drapeau est levé.

Peut être que dans ce programme simple les deux serial.print() passent ......

de retour de week end, j'ai donc essayer de mettre le pull up externe avec la résistance de 10KOhm et le condo de 100nF mais malheureusement ce n'est pas contre faut - il que la résistance et le condo soit proche de l'arduino pour être efficace ?

il que la résistance et le condo soit proche de l'arduino pour être efficace ?

Y'a une longue distance entre la sortie du compteur et l'arduino?

il y a 15m environ

il y a 15m environ

Information très importante !!
Avec une telle distance il faut soigner la laison (pas n'importe quel câble) et filtrer un peu à l'arrivée (côté Arduino). Il ne serait pas superflu également de protéger l'Arduino contre les surtensions.

-Est-il absolument certain que l'émetteur soit à transistor et qu'il ne s'agisse pas en réalité d'un contact avec les rebonds inévitables ?
-l'interruption est elle toujours définie de type 'change' comme dans le code montré au début de ce fil ou bien 'rising' ou 'falling' ?

Avec une telle distance il faut soigner la laison (pas n'importe quel câble)

Pour le cable c'est un RJ45 cat5 j'utilise que 2 fils dessus,

-Est-il absolument certain que l'émetteur soit à transistor et qu'il ne s'agisse pas en réalité d'un contact avec les rebonds inévitables ?

C'est ce qu'il est indiqué dans la doc du fabriquant de l’émetteur d'impulsion, donc je pense que oui

-l'interruption est elle toujours définie de type 'change' comme dans le code montré au début de ce fil ou bien 'rising' ou 'falling' ?

je test maintenant avec 'rising' ou faillng' comme on m'a conseillé dans un reply plus haut

merci pour l’intérêt porté à mon pb

Avec une telle distance il faut soigner la laison

Avec une telle longueur il faut filtrer à l'arrivée et surtout abaisser l'impédance. Le pullup de 10k est beaucoup trop élevé. Il serait préférable de passer dans les quelques centaines d'ohms (à adapter en fonction des caractéristiques de la sortie du compteur). Sinon tu vas avoir France Inter, Europe1 et du 50Hz sur la ligne.
Et comme le suggérait al1fch un filtrage et une protection contre les surtensions. Parce que sinon au premier orage crac boum la carte.

j'ai solutionné mon problème enfin ! j'ai mis une résistance de 4,7kHom et un condensateur chimique de 10µ auparavant je mettais un condo céramique et je pense que c'est la que venait le problème. sinon merci à tous pour les précisions données !

Tu peux mettre un schema de ton circuit ? je dois interfacer une compteur d'eau aussi et ton schema pourra m'interesser

Moi aussi je serai intéressé par le schéma.
thanks