Salut!
Alors pour les variables,
currentTime
stocke le temps écoulé depuis le démarrage du programme en millisecondes. Elle est mise à jour à chaque itération de la loop
avec millis()
.
- et la variable
cloopTime
sert de point de référence pour mesurer des intervalles de temps d'une seconde. Elle est mise à jour chaque fois qu'une seconde s'est écoulée.
Dans le code currentTime = millis();
et cloopTime = currentTime;
initialise les deux variables avec le même temps de départ. C'est équivalent à
currentTime = cloopTime = millis();
Ensuite, currentTime
sera mis à jour à chaque loop
, alors que cloopTime
ne sera mis à jour que toutes les secondes.
Ton code n'étant pas très lisible, je l'ai refais à ma façon, dis moi si c'est plus clair pour toi ?
#define PIN_CAPTEUR_DEBIT 2
#define IMPULSIONS_PAR_LITRE 450.0 // 7,5 impulsions/seconde = 1 L/min, donc en une minute : 7,5 * 60 = 450 impulsions pour 1L.
volatile unsigned long compteurImpulsions = 0;
#define INTERVALLE_AFFICHAGE 1000 // 1 seconde
unsigned long dernierAffichage = 0;
void compterImpulsion()
{
compteurImpulsions++; // on incrémente le compteur d'impulsion avec ++ (donc +1)
}
void setup()
{
Serial.begin(115200);
pinMode(PIN_CAPTEUR_DEBIT, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PIN_CAPTEUR_DEBIT), compterImpulsion, RISING);
sei(); // on active les interruptions globalement
}
void loop()
{
if ((millis() - dernierAffichage) >= INTERVALLE_AFFICHAGE) // à chaque seconde
{
// on récupère le nombre d'impulsion et on met le conteur d'impulsion à 0
noInterrupts();
unsigned long impulsions = compteurImpulsions;
compteurImpulsions = 0;
interrupts();
// on calcule le débit (pas besoin de variable intermédiaire !)
float debit = (impulsions * 60.0) / IMPULSIONS_PAR_LITRE; // L/heure
// on affiche le débit en litre par heure
Serial.print(debit, 2);
Serial.println(" L/heure");
// on affecte la valeur du temps courant à la valeur du temps précédent, pour savoir quand 1 seconde se sera écoulée
dernierAffichage = millis();
}
}
Tapé ici, non testé
En gros, on utilise une interruption matérielle pour compter le nombre d'impulsion (avec RISING
c'est un front montant - donc quand on passe de 0
à 1
sur la pin) - pour en savoir plus sur les interruptions, un bon article :
https://www.locoduino.org/spip.php?article64
Le capteur YF-B2 envoie des impulsions électriques à chaque passage d'une certaine quantité d'eau. Ces impulsions sont comptées par la fonction d'interruption compterImpulsion()
, qui incrémente un compteur.
Toutes les secondes, de manière non bloquante, on regarde le nombre d'impulsions, on remet à 0 le compteur, on calcule de débit, et on l'affiche sur le moniteur série (réglé à 115200 bauds/s, 9600 étant un peu trop lent ). Enfin, on affecte le temps courant à la variable dernierAffichage
, pour pouvoir savoir quand 1 seconde se sera écoulé ensuite (pour en savoir plus sur l'utilisation de millis, regarde l'exemple suivant).
Après n'ayant jamais utilisé ce capteur je te dis peut-être n'importe quoi autant sur le code que sur les variables, mais il me semble que c'est ça.
En espérant t'avoir aidé,
Cordialement
Pandaroux007