Compteur d'eau

Salut, à tous, je reviens pour une amelioration d'un systeme existant. Je dois ramener tous les jours de l'eau à mes vaches (secheresse oblige) au moyen de plusieurs cubes d'eaux. Il faut en moyenne 25 mn pour remplir le cube. J'aimerai donc creer un systeme qui, en fonction du litrage programmé, arretera l'eau au moyen d'une electrovane et me préviendra via une notification sur mon iphone. J'usque la pas de soucis, je sais faire. Par contre , j'ai un petit soucis au niveau du capteur de débit qui m'indique un débit ( en L/mn en instantanné. Je ne sais pas trop comment gerer ça pour qu'il me compte les litrages passés dans la vanne. ci joint le code que j'ai trouvé : merci d'avance pour votre aide

/ reading liquid flow rate using Seeeduino and Water Flow Sensor from Seeedstudio.com
// Code adapted by Charles Gantt from PC Fan RPM code written by Crenn @thebestcasescenario.com
// http:/themakersworkbench.com http://thebestcasescenario.com http://seeedstudio.com

volatile int NbTopsFan; //measuring the rising edges of the signal
int Calc;
int hallsensor = 2;    //The pin location of the sensor
int total = 0;
void rpm ()     //This is the function that the interupt calls
{
  NbTopsFan++;  //This function measures the rising and falling edge of the

//hall effect sensors signal
}
// The setup() method runs once, when the sketch starts
void setup() //
{
  pinMode(hallsensor, INPUT); //initializes digital pin 2 as an input
  Serial.begin(9600); //This is the setup function where the serial port is

//initialised,
  attachInterrupt(0, rpm, RISING); //and the interrupt is attached
}
// the loop() method runs over and over again,
// as long as the Arduino has power
void loop ()
{
  NbTopsFan = 0;   //Set NbTops to 0 ready for calculations
  sei();      //Enables interrupts
  delay (1000);   //Wait 1 second
  cli();      //Disable interrupts
  Calc = ((NbTopsFan * 60 / 7.5))/60; //(Pulse frequency x 60) / 7.5Q, = flow rate

//in L/hour
  Serial.print (Calc, DEC); //Prints the number calculated above
  Serial.print (" L/min\r\n"); //Prints "L/hour" and returns a  new line


  
}[code]

Peux-tu décrire le problème ? Qu'est-ce que tu obtiens qui ne va pas ?

Tu peux éventuellement changer le delay :

 sei();      //Enables interrupts
 delay (1000);   //Wait 1 second
 cli();      //Disable interrupts

devient:

 unsigned long chrono = millis();
 sei();      //Enables interrupts
 while (millis()-chrono < 1000ul);   //Wait 1 second
 cli();      //Disable interrupts

Sinon, cette ligne mélange les int et les float :

Calc = ((NbTopsFan * 60 / 7.5))/60;

Tu devrais déclarer Calc en float et faire

Calc = ((NbTopsFan * 60.0 / 7.5))/60.0;

Au fait : pourquoi multiplier puis diviser par 60 ? Pourquoi pas simplement

Calc = NbTopsFan / 7.5;

Merci pour votre réponse , le code fonctionne bien, en soufflant dans le capteur de débit, la valeur de Calc change. Mais j’obtiens un débit en L/mn alors que j’aimerai incrémenter un compteur en fonction de la quantité d’eau qui passe . Est c’est là que je ne vois pas trop comment puisque la valeur de Calc peut varier

Ton code :

void loop ()
{
  NbTopsFan = 0;   //Set NbTops to 0 ready for calculations
  sei();      //Enables interrupts
  delay (1000);   //Wait 1 second
  cli();      //Disable interrupts
  Calc = ((NbTopsFan * 60 / 7.5))/60; // flow rate in L/hour
  Serial.print (Calc, DEC); //Prints the number calculated above
  Serial.print (" L/min\r\n"); //Prints "L/hour" and returns a  new line
}

Les 4 premières lignes font ceci (le reste est de la mise en forme et de l'affichage) :

  • initialisation du nombre de tours à 0
  • autorisation des interruptions
  • attente d'une seconde : pendant ce temps, les interruptions arrivent et le nombre de tour s'incrémente
  • arrêt des interruptions
    Tu as une fonction qui compte le nombre de tours :
void rpm () {    //This is the function that the interupt calls
  NbTopsFan++;  //This function measures the rising and falling edge of the hall effect sensors signal
}

Tu peux changer ta loop pour afficher le nombre de tours cumulé chaque seconde :

void loop ()
{
  sei();      //Enables interrupts
  delay (1000);   //Wait 1 second
  cli();      //Disable interrupts
  Serial.print (NbTopsFan); 
}

Tu peux même tester en ôtant sei() et cli().

Dans l'en-tête, change

volatile unsigned int NbTopsFan = 0;

Pour connaitre la quantité d'eau correspondant à chaque tour, il faudrait avoir la notice de ton capteur ou savoir comment le 7.5 a été calculé. Sinon, tu peux étalonner ton capteur : tu verses une bouteille d'eau et tu notes combien de tours correspondent au volume versé. Une règle de trois suffira ensuite.

Fredericzim:
Merci pour votre réponse , le code fonctionne bien, en soufflant dans le capteur de débit, la valeur de Calc change. Mais j’obtiens un débit en L/mn alors que j’aimerai incrémenter un compteur en fonction de la quantité d’eau qui passe . Est c’est là que je ne vois pas trop comment puisque la valeur de Calc peut varier

Bonjour Frederic
Je suppose que tu utilise un capteur de debit à effet Hall ? (1 tour = impulsion ) sur du raccord 20/27 (3/4 ")

Soit tu connais déjà les caracteristiques de ton capteur ( volume par tour)
soit il te faut les determiner
le plus simple est de vider un volume connu d'eau (I.E 10l ) au travers du capteur et de relever le nb d'impulsion

Ce sera ton facteur de calibration , de toutes façons tu ne recherche pas le nanolitre 8)

J'ai de la famille eleveur ici en Normandie et ici aussi les bêtes tirent la langue
8)

Encore plus précis, compter combien d’impulsions pour 1000L

Merci à tous, je vais voir ça !

Salut à tous, nouveau probleme . en voulant étalonner le capteur, branché sur la conduite d'eau avec un volume de 25 litres à remplir pas de soucis avec le code . J'ai voulu donc approfondire les tests en mesurant 100 L et c'est la que ça se gatte. Arrivé à environ 32000 tours, ma variable devient négative et donc les litres également.
J'ai refait le test plusieurs fois, et cest toujours la même chose .

// reading liquid flow rate using Seeeduino and Water Flow Sensor from Seeedstudio.com
// Code adapted by Charles Gantt from PC Fan RPM code written by Crenn @thebestcasescenario.com
// http:/themakersworkbench.com http://thebestcasescenario.com http://seeedstudio.com

volatile int NbTopsFan; //measuring the rising edges of the signal
int Calc;
int hallsensor = 2;    //The pin location of the sensor
int total = 0;
void rpm ()     //This is the function that the interupt calls
{
  NbTopsFan++;  //This function measures the rising and falling edge of the

//hall effect sensors signal
}
// The setup() method runs once, when the sketch starts
void setup() //
{
  pinMode(hallsensor, INPUT); //initializes digital pin 2 as an input
  Serial.begin(9600); //This is the setup function where the serial port is

//initialised,
  attachInterrupt(0, rpm, RISING); //and the interrupt is attached
}
// the loop() method runs over and over again,
// as long as the Arduino has power
void loop ()
{
  total = (NbTopsFan / 529);
  sei();      //Enables interrupts
  delay (1000);   //Wait 1 second
  cli();      //Disable interrupts
  Serial.print (NbTopsFan, DEC); 
  Serial.println( " tours "); 
Serial.print (total, DEC);
Serial.println ( " litres ");
  
}
[code]

Fredericzim:
Salut à tous, nouveau probleme . en voulant étalonner le capteur, branché sur la conduite d'eau avec un volume de 25 litres à remplir pas de soucis avec le code . J'ai voulu donc approfondire les tests en mesurant 100 L et c'est la que ça se gatte. Arrivé à environ 32000 tours, ma variable devient négative et donc les litres également.
J'ai refait le test plusieurs fois, et cest toujours la même chose .

// reading liquid flow rate using Seeeduino and Water Flow Sensor from Seeedstudio.com

// Code adapted by Charles Gantt from PC Fan RPM code written by Crenn @thebestcasescenario.com
// http:/themakersworkbench.com http://thebestcasescenario.com http://seeedstudio.com

volatile int NbTopsFan; //measuring the rising edges of the signal
int Calc;
int hallsensor = 2;    //The pin location of the sensor
int total = 0;
void rpm ()     //This is the function that the interupt calls
{
 NbTopsFan++;  //This function measures the rising and falling edge of the

//hall effect sensors signal
}
// The setup() method runs once, when the sketch starts
void setup() //
{
 pinMode(hallsensor, INPUT); //initializes digital pin 2 as an input
 Serial.begin(9600); //This is the setup function where the serial port is

//initialised,
 attachInterrupt(0, rpm, RISING); //and the interrupt is attached
}
// the loop() method runs over and over again,
// as long as the Arduino has power
void loop ()
{
 total = (NbTopsFan / 529);
 sei();      //Enables interrupts
 delay (1000);   //Wait 1 second
 cli();      //Disable interrupts
 Serial.print (NbTopsFan, DEC);
 Serial.println( " tours ");
Serial.print (total, DEC);
Serial.println ( " litres ");
 
}

[code]



[/code]

bonjour Frederic
ta valeur total est defini comme int tu arrive donc rapidement à un debordement
remplace la définition de total par un unsigned long au lieu d''un int

Ahhhhh oui , suis je bête ! Comment j’ai pu passer à coter de ça ! En tous cas merci artouste

Bon alors malgré le changement de la variable total en unsigned long, arrivé à 31000 tours environ, 'ca me fait n'importe quoi.

Il faut aussi changer le type de NbTopsFan