Projet Compteur d'eau

Bonjour, dans le cadre d'un projet en terminale SSI, mon groupe et moi réalisons un système permettant de compter le nombre de litres qui passent dans un débit-mètre, pour bloquer la circulation d'eau avec une électrovanne une fois 80L passés.

Nous avons acheté le débitmètre suivant : https://www.amazon.fr/dp/B00K67YL98/ref=sxbs_sxwds-stvp_2?pf_rd_m=A1X6FK5RDHNB96&pf_rd_p=1566153327&pd_rd_wg=Buuu4&pf_rd_r=NP2K410SXDGN2XSGVAQ2&pf_rd_s=desktop-sx-bottom-slot&pf_rd_t=301&pd_rd_i=B00K67YL98&pd_rd_w=bj2hu&pf_rd_i=débit+metre+eau&pd_rd_r=bdfb1d18-15da-4257-9f36-9362a5a87ed4&ie=UTF8&qid=1518683356&sr=2

Il envoie 450 impulsions par litre qui passe dans le débitmètre. Notre professeur nous a indiqué qu'il fallait utiliser une horloge RTC couplée a un IRQ afin de compter les impulsions envoyée par le capteur pendant un temps donné, l'IRQ permettant que le comptage ne s'arrête jamais.

Nous avons le code suivant :

int impulsion;
int pinDebitMetre;
int etatPin;  //etatPin sera la variable qui contiendra l'état du bouton

void setup() {
  impulsion = 0;
  etatPin = LOW;
  pinDebitMetre = 6;  // pin sur lequel est branché la sortie du débitmètre
  pinMode(pinDebitMetre, INPUT);   //on le définit en tant qu'entrée
  digitalWrite(pinDebitMetre, LOW);  // on initialise au niveau BAS
}

void loop() {

   etatPin = digitalRead(pinDebitMetre);    // on associe l'état du pin a une variable
  if (etatPin == HIGH){
  impulsion++ ;

 

}

L'un des problèmes est que le comptage des impulsion se fait directement après le lancement de l'Arduino, même si le débitmètre n'a pas tourné, et ne s'arrête plus.
Aussi, on a mit en place l'horloge RTC et on a réussi a afficher l'heure en temps réel sur un écran, mais on ne sait pas s'en servir pour effectuer un comptage des impulsions pendant un certain temps.

Nous avons le code suivant pour les interruptions

#include <LiquidCrystal.h> // on importe la bibliothèque
LiquidCrystal monEcran(12,11,5,4,3,6); // on crée l'objet écran
int impulsion;
int pinDebitMetre = 2;
const inter = 2;

int etatPin;  //etatPin sera la variable qui contiendra l'état du bouton


void setup() {
  Serial.begin(9600);
  impulsion == 0;
  etatPin == LOW;
  pinMode(pinDebitMetre, INPUT);
  initialisation_inter();
}

void loop() {
  delay(1000);
  void initialisation_inter()
  {  
  attachInterrupt(digitalPinToInterrupt(pinDebitMetre), etatPin, RISING);
  }

  void etatPin()
  {
    etatPin = digitalRead(pinDebitMetre); 
    if (etatPin == HIGH)
    {
    impulsion++ ;
    }
  }

  monEcran.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
  monEcran.clear(); // on efface l'écran
  monEcran.print(impulsion);
  monEcran.setCursor(0,1); //on passe à la ligne suivante
  monEcran.print("Impulsions"); 

}

Merci de votre aide

Salut
Ce genre de capteur fournit un signa rectangulaire. Il serait bien de mesurer le temps entre deux impulsions, donc tenir compte des états bas.

Beaucoup de problèmes dans ton code.
Il faudrait ressortir les fonctions etatPin et initialisation_inter de la fonction loop().
La variable etatPin porte le même nom que la fonction etatPin.
const inter = 2; il manque son type et elle n'est pas utilisée.

Ceci peut certainement aider :
https://forum.arduino.cc/index.php?topic=411473.0

J'ai dû mal à saisir l'intérêt de la rtc, sauf éventuellement si la mesure doit se faire sur plusieurs jours, et encore... L'arduino sait très bien mesurer le temps tout seul sans se rajouter de la complexité.

À mon avis tu as juste besoin de compter les fronts descendants de ton signal du capteur via une interruption, et de vérifier de temps en temps la valeur de millis() pour la fenêtre temporelle, et l'affaire est faite