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]
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
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 :
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)
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
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