Ce qu'il faut surtout retenir : **1 impulsion = 1 litre**
VU ! donc 1 impulsion chaque seconde c'est 1 litre par seconde
Apparement tu actives l'interruption pendant une seconde , le décompte des interruptions survenues pendant ce laps de temps est donc un nombre de litres par seconde ou l/s, si tu divises ça par 1000 tu as des m3/s
Quand prévois-tu la remise à zéro du décompte d'interruptions ? sans cela pas de débit-mètre , mais un compteur totalisateur, un cumul des litres ayant traversé le compteur
Par défaut Serial.print() affiche les floats avec deux décimales, les chiffres significatifs sont au delà de la deuxième décimale.
Affiche avec plus de décimales Serial.print(q,5);
Merci d'avoir répondu. En effet, j'avais un doute s'il fallait diviser par 1000 vu qu'il y avait déjà un delay(1000) au dessus. le compteur, je l'ai remis en entier (int). Je l'avais mit en float pour des testes.
De plus, j'ai remarqué que quand je compilais, le moniteur série affichait les anciennes valeurs. Donc oui il faut une remise à 0, donc compteurImpulsions = 0. Mais je sais pas où je dois le placer dans mon code.
Enfin, si j'enlève le "/1000" mes calculs de débit sont justes. Il y a juste ma variable pulseCount qui n'affiche plus le volume en L mais des L/sec ? Ainsi, si je veux avoir également la consommation d'eau : je dois faire Q = Volume/durée <=> Volume = Q * durée = pulseCount * 1000 ?
si tu veux la consommation d'eau en litres il faut cumuler à part les impulsions (=les litres) dans une variable spécifique.
les comptage des interruptions va lors faire progresser :
-une variable remise à zéro après chaque intervalle de comptage pour le débit en litre/s
-une variable non remise à zéro pour la consommation en litres
Le code que vous proposez ne compile pas.
Il manque au moins l'initialisation de la variable « pulseCount ». Du coup, comment obtenez-vous l'affichage 0L ? Avez-vous vérifié que programme a bien été uploadé dans l'Arduino ?
Par ailleurs, avec cette partie de la loop :
sei(); // Active l'interruption
delay (1000); // Attend 1 seconde
cli(); // Désactive l'interruption
vous activez l'interruption pendant 1 seconde. Êtes-vous sûr « d'intercepter » un pulse durant cette durée ? Si il n'y a pas de pulse pendant que l'interruption est active, le volume est forcément à 0 ainsi que le débit.
Si vous voulez pouvoir calculer un débit, il faut maintenir l'interruption active, incrémenter le nombre d'impulsions détectées tout en comparant avec l'instant courant par rapport au démarrage de l'Arduino :
le volume en L est donné par le nombre d'impulsion (d'après **1 impulsion = 1 litre**)
le débit en L/s est donné par le nombre d'impulsions/intervalle de temps depuis le démarrage de l'Arduino (ou depuis l'initialisation d'un temps de référence correspondant à l'activation de l'interruption) : debit=nombre d'impulsion/(instant courant-instant référence).
Non, ce n'est pas nécessaire.
Ton delay (1000); // Attend 1 seconde n'est pas très bon, cette fonction est dite bloquante, c'est à dire que ton programme ne peut plus rien faire pendant ce temps, sauf le comptage en interrupt. Il y a mieux à faire avec millis() (Exemple BlinkWithoutDelay.ino).
Je te donne l'exemple en adaptant ton programme, la variable mesureTempo assure le rythme des mesures à toi de l'ajuster à ta guise. La fonction int recupVolume() n'est plus nécessaire.
Je te laisse rajouter tout les autres calculs.
const int broche_debit = 2;
volatile int compteurImpulsions;
int consommation =0;
unsigned long mesureTempo = 1000; // Toutes les secondes
unsigned long mesureMillis = millis; // Chronomètre
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()
{
if (millis()-mesureMillis >= mesureTempo) // Si fin de periode de mesures
{
consommation = compteurImpulsions;
compteurImpulsions = 0;
Serial.println("consommation = " + String(consommation));
mesureMillis = millis(); // Redémarrage du chrono
}
}
void ISRImpulsions()
{
compteurImpulsions++;
}
//int recupVolume()
//{
//// Stock le volume de litre dans une autre variable
//int consommation = compteurImpulsions; // 1 litre = 1 impulsion
//return consommation;
//}
Il y a quelque chose que je ne comprends pas. On a déjà réglé ces problèmes ici il y a une semaine.
Pourquoi avoir ouvert un nouveau fil de discussion pour reposer sensiblement les mêmes questions. On tourne en rond!! @nythix Tu avais d'ailleurs conclu
" 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."
Donc pourquoi avoir tout cassé pour repartir avec le soft à l'origine de tes problèmes?
Donc vu les résultats que j'obtiens, tu as surement raison @MB_F_45, en 1 seconde il n'a pas le temps de détecter une impulsion ce qui affiche la valeur 0.
Peut-être mettre la période de mesures toutes les 3 secondes ?
Mais ducoup faut modifier le calcul et écrire : debit = consommation/3000*60000 L/min (pas sur du calcul)