Comment brancher un débitmètre sur une carte Arduino Uno

Bonjour,

Dans le cadre d'un projet scolaire, je dois étudier la consommation de l'eau en L/min lors d'un arrosage. Je dispose d'un débitmètre qui fonctionne avec un émetteur à impulsion (1IMP/L) : https://cdn.store-factory.com/www.compteur-energie.com/media/B-Meters-GSD8-compteur-eau-froide-fiche-compteur-energie_2021-2.pdf et d'une carte Arduino Uno.

Mon problème est que :
1) je ne sais pas du tout comment brancher le débitmètre à l'arduino uno.
2) Mon débitmètre possède 2 fils : la phase et le neutre. Donc surement brancher le neutre sur le GND et la phase sur une entrée/sortie de l'arduino?
3) Et comment je peux savoir si un éventuel branchement est correct, si je récupère le signal émit par le débitmètre.

Bonsoir @nythix et Bienvenue !

la doc que tu donnes est celle d'un compteur divisionnaire d'eau froide qui peut être surmonté d'un "émetteur d'impulsion"
EF

:mag_right: Si tu lis attentivement la page tu verras l'invitation a aller page 60 de la doc complète !!

ll est question de 'REED" ce qui sous entendrait que cet "emetteur' se comporterait en fait comme un simple contact sec (ampoule REED) se fermant brièvement à chaque fois qu'un litre a traversé le compteur.

la page 60 confirmera peut être celà........ :wink:

Si oui cela revient à câbler un bouton poussoir et à compter le nombre d'appuis en une minute pour afficher le résultat

Ola !
Attention, tu vas te faire prendre au mot et il va ajouter un bouton poussoir (on est presque au mois de mai)
"Cela revient à câbler le relai reed comme s'il était un bouton poussoir :grinning:."

Relai reed (ou relai ILS) : c'est une ampoule de verre dans laquelle il y a un contact.

image

Le contact peut être commandé soit par un bobinage, c'est alors un relai classique qui a la particularité d'avoir un temps de fermeture très court.
Soit par un aimant, ce qui est probablement le cas, l'aimant étant fixé sur une roue qui passe à intervalle régulier devant le relai.

Il ne te reste plus qu'à utiliser les tutos d'Eskimon pour voir comment câbler un bouton poussoir et comment l'utiliser.

PS : attention un contact sec présente des rebonds à la fermeture qu'il faut gérer (bounce et débounce en franglais)

Bonjour nythix

Ca se câble comme un bouton poussoir (dixit @al1fch) avec une résistance de PULL_UP
Pour le comptage, le mieux et plus pratique est de travailler en mode interruption, ainsi la lecture du contact donc le comptage se fait en mode "presque" transparente au déroulement du reste de ton programme. Il faudra juste prévoir un "petit" anti rebonds avec une temporisation ou un condensateur, c'est à voire si nécessaire.

Sais tu quelle serait la fréquence maximum des impulsions?

Cordialement
jpbbricole

Merci d'avoir répondu.

J'ai trouvé une documentation du débitmètre beaucoup plus détaillée : https://cdn.store-factory.com/www.compteur-energie.com/media/Bmeters-compteur-eau-impulsion-mid-r160_compteur-energie_com.pdf

La fréquence maximal serait de 400 Hz.

Si je dois revenir à l'Arduino, il faudrait que j'utilise ce schéma avec une résistance PULL_UP :

image

Et en utilisant les interruptions de l'Arduino :

pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), ISRImpulsions, RISING);

Merci de prendre le temps de répondre.

Bonjour @nythix

Je dispose d'un débitmètre qui fonctionne avec un émetteur à impulsion (1IMP/L)
......La fréquence maximal serait de 400 Hz

Donc 400 litres par seconde !!!! :star_struck:
Quel type d'arrosage dois tu monitorer ?

page 7 de la nouvelle documentation on voit bien qu'il s'agit , comme supposé, d'une petite ampoule à contact REED

Pull up ?
le pull up interne est peu énergique, dans ton cas mieux vaut mette un pul up externe de quelques kOhm7

interruption : avec ton schéma et RISING il y a aura interruption à chaque ouverture de contact, fin d'implulsion.

Bonjour al1fch,

C'est un arrosage pour un stade de foot d'environ 8000 m^2.

Ok, donc faudrait opter pour une résistance externe d'environ 5kOhm.

Sinon, est-ce qu' il y aurait une astuce qui confirme que mon câblage est correct. Que le moniteur série de l’Arduino puisse détecter le débitmètre (si je souffle dedans).

Cordialement
nythix

C'est un arrosage pour un stade de foot d'environ 8000 m^2.

OK mais le compteur d'eau froide que tu utlises est prévu au maximum pour un débit de 5m3 par heure , pas plusieurs m3 à la minute.......si le contat REED est capable de battre à 400Hz il est peu probable que le compteur qui l'active l'amène à cette cadence !!

C'est le genre de compteur divisionnaire qu'on voit en appartement

La fréquence maximale que tu dois avoir en vue est celle découlant du débit maximal qui traversera le compteur dans le système d'arrosage, 1 Hz c'est déjà beaucoup pour ton compteur d'eau froide d'appartement =1 litre par seconde

Sinon, est-ce qu' il y aurait une astuce qui confirme que mon câblage est correct. Que le moniteur série de l’Arduino puisse détecter le débitmètre (si je souffle dedans).

OUi : Faire l'essai en soufflant assez longtemps ..... sans chercher à atteindre les 400Hz.......!

Bonjour nythix

Pas une astuce, un petit bout de programme :wink:

//------------------------------------- Débimètre (debm)
const int debmReedPin = 2;     // Pin du contact reed
volatile long debmComptage = 0;     // Pour comptage des impulsions
long debmComptageAffichage = 0;     // Pour affichage de la valeur

void setup()
{
	Serial.begin(115200);
	delay(500);
	
	pinMode(debmReedPin, INPUT_PULLUP);     // Sans résistance externe
	pinMode(debmReedPin, INPUT);     // Avec résistance externe
	attachInterrupt(digitalPinToInterrupt(debmReedPin), debmImpulsionInterrupt, FALLING);
}

void loop()
{
	if (debmComptageAffichage != debmComptage)
	{
		debmComptageAffichage = debmComptage;
		Serial.print(F("Impulsions: ")); Serial.println(debmComptageAffichage);
	}

}

void debmImpulsionInterrupt()
{
	debmComptage ++;
}

La console à 115200.
$Cet exemple est simple sans traitement de rebonds!

Cordialement
jpbbricole

Merci jpbbricole.

J'ai réalisé un programme avant que je vois le tien.

Est-ce que mon programme est cohérent ?

Dans le moniteur série, j'ai bien mon débit qui augmente quand je souffle dedans.

Bonsoir nythix

Le programme peut-être, mais pas la façon de le mettre sur le forum :wink:.
Il faut le copier dans le presse-papier, cliquer sur l'icône
image
et coller.

Cordialement
jpbbricole

Dans le programme il y a trois blagues:
− Si le débit est de 4L/s soit 240L/mn, en 2000ms (delay), il passera 8L et l'affichage indiquera 8L/min
− pas impossible que l'abréviation de litre soit l (vu que Mr Litre n'a pas vécu) et que minutes d'abrévie par mn (pas sûr!).
− si le débit ne dépasse pas les 256l/mn, il vaut mieux prendre un uint8_t (ou un byte) pour la variable compteur. En prenant un entier, on risque une erreur si pendant la remise à zéro du compteur qui se fait en deux fois (octet par octet) intervient l'interruption. Pour l'instant la mesure se fait sur 2s, mais si tu veux un peu de précision, il faudra faire plus tard une mesure sur un temps plus long; et on risque de dépasser les 255 litres. Mais un entier non signé est sans doute plus rigoureux (uint16_t ou word).

L'Arduino étant avare en mémoire, ce n'est pas forcément une mauvaise habitude que d'écrire un code court sans variables en trop. Perso, je supprimerais les variables litres et debit pour écrire au final Serial.print(compteur/60.0); à la place de Serial.print(debit); Il faudra forcément mettre le compteur à zéro après! Mais ce qui est fait est bon. Dispendieux, mais bon.

Je détaille pour ceux qui veulent aller plus loin l'inter au milieu de la remise à zéro:
Si la remise à zéro se fait en commençant par l'octet de poids fort et que compteur valait 3*256+255 (0x3FF = 1023):
− on met à 0 l'octet de poids fort, compteur vaut alors 255.
− l'interruption incrémente compteur qui v passer de 255 à 256 (0x100)
− on met à 0 l'octet de poids faible qui est déjà à 0
-> on avait 1023, puis après la remise à zéro on passe avec 255 de trop
Si la remise à zéro se fait en commençant par l'octet de poids faible je crois que dans le cas d'une incrémentation il n'y a pas de problèmes.

Il faut donc s'assurer que la remise à zéro commence bien par les poids faibles! Sinon on peut protéger la raz en d'encadrant par un couple noInterrupt(); interrupt();

Bonsoir nythix

Non seulement il est cohérent, hormis les remarques de @vileroi, mais il fonctionne très bien :clap:

Petit bémol: delay (2000) ; une temporisation avec millis() est un poil plus compliquée mais plus "élégante" et, surtout, elle n'est pas bloquante.
Regardes l'exemple BlinkWithoutDelay.ino

J'ai "converti" ton programme:

const int broche_debit = 2;
volatile int compteur = 0;

unsigned long displayTempo = 2000UL;     // Rythme d'affichage
unsigned long displayMillis = millis();     // Chrono d'affichage

void ISRImpulsions(){
	compteur++;
}
void setup() {
	Serial.begin (9600);
	pinMode (broche_debit, INPUT_PULLUP); // Utilise la résistance de 1'Arduino
	attachInterrupt(digitalPinToInterrupt (broche_debit), ISRImpulsions, RISING); // passe de LOW a HIGH = RISING
}

void loop(){
	// 1 litre correspond a 1 Impulsion
	if (millis()-displayMillis >= displayTempo)     // Si periode d'affichage
	{
		float litres = compteur;

		// Remettre le compteur a zéro
		compteur = 0;

		// Calcul du débit en L/min
		float debit = litres/60;
		Serial.print ("Debit : ");
		Serial.print (debit);
		Serial.println(" L/min");
		
		displayMillis = millis();
	}
}

Cordialement
jpbbricole

Mon cher Olivier,

  • tu as certainement raison en raison de la règle suivante :

En général les symboles des unités sont écrits en
minuscules mais, si le nom de l’unité dérive d’un nom propre, la première lettre du symbole
est en majuscule.

  • mais, le litre n'est pas une unité officielle.

L'unité officielle de volume est le m3.
1 litre = 1dm3

Toutefois, sur le document du lien indiqué, en page 33 tu constateras que si le litre n'est pas une unité officielle, c'est une unité tolérée, et même avec une grande tolérance (:grinning: ) puisque l'on peut écrire "L" ou "l".
Bien que M Litre n'ait pas existé (on aurait pu demander l'avis de son cousin M Littré plus qualifié en ce qui concerne le dictionnaire), tu n'es donc pas dans l'erreur, malgré que ce soit en contradiction avec la règle de la minuscule, mais la tolérance, c'est la tolérance. :grinning:

Un peu de sérieux !
Lien vers la dernière édition du système d'unité officiel "SI",
En France, "MKSA" (créé en 1946) a remplacé le système "CGS" au début des années 1960, directive du Ministère de l'Éducation Nationale qui menaçait de peines de prison les professeurs de Physique Chimie qui continueraient à utiliser le système CGS, ça ne rigolait pas à l'époque.

"SI", créé en 1960, a remplacé à son tour "MKSA" ("SI" est une généralisation de "MKSA").
Et en 2022, certains pays, dit évolués, utilisent encore des diamètres 1 pouce 12/64 !

Pour les jeunes qui n'aurait pas connu :
"CGS" = Centimètre Gramme Seconde
"MKSA" = Mètre Kilogramme Seconde Ampère.

PS : Merci Wikipédia pour dates.

https://www.bipm.org/documents/20126/41483022/SI-Brochure-9.pdf/fcf090b2-04e6-88cc-1149-c3e029ad8232

Désolé pour la perturbation du sujet.

Merci @jpbbricole,

Du coup, j'ai repris ce que vous avez fait avec la fonction millis(). Il y a juste le "debit = litres*60" à modifier et normalement c'est bon.

Tu viens de te faire faire ton sujet pour le bac, c'est un peu limite.
Avec al1fch nous nous sommes limités à te mettre sur la voie, le projet, c'est quand même coefficient 7 ou 8.
D'un autre côté, les professeurs suivent silencieusement de très près ce forum, alors ...

Pourquoi faudrait-il que le code soit non bloquant? Quel en est l'intérêt.

Le bac je l'ai obtenu il y a quelques années... Et la gestion du débitmètre c'est 1/6 du projet.
De plus, si tu observes bien, il m'a juste conseillé d'utiliser la fonction millis() à la place du delay().

Et si tu veux tout savoir, je suis entrain de transformer ce code procédural en langage objet.

Cordialement
nythix

Bonjour vileroi

Essentiellement pour la "beauté du geste"!
Et puis, c'est "un poil" plus élégant que delay()!
Et puis, il faut regarder plus loin que le bout de ton nez et te dire qu'un programme ne fait que rarement qu'une chose et ce serait bête que de bloquer ce programme avec un delay() alors que c'est si facile de l'éviter!
Et puis, recherches dans le forum il y a plein d'article qui préconisent cette façon de faire!
Et puis,....

Une belle journée à toi.
Cordialement
jpbbricole

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.