Volume d'eau

Bonjour à tous,

J'espère que vous vous portez bien en cette période !

Voilà pour un projet Arduino, j'ai besoin d'un volume d'eau de 15L passant par un débitmètre standard Arduino à effet Hall, où l'on a 2500 impulsions par Litre. Alors j'ai trouvé un code sur le forum mais je n'arrive pas à le modifier pour avoir ce volume.

Je vous laisse le code que j'aimerai modifier, il fonctionne pour avoir le débit en instantané (je n'ai pas pu le tester encore).

 volatile unsigned long pulseCount = 0;
uint32_t curTime; 
unsigned long startTime  = 0;			//début du nouveau comptage 
unsigned long pulseCountPrec = 0; 		//comptage précédent 

void setup ( ) 
{
	Serial.begin(9600); 
	attachInterrupt(digitalPinToInterrupt(2), countImpulsions, RISING);		
						//fil du capteur connecté sur le pin 2
}
void loop ( )
{ 
	curTime = millis ( ); 			//temps depuis le début d’exécution du programme 
	if (curTime - startTime > 1000) 	//calcul du débit toutes les secondes 
	{
		//2500 impulsion pour 1L 
		//débit pas forcément constant donc calcul du nombre d’impulsion sur 1s
		//Q = (NbrImpulsions / 1s) / 2500
		float q = (pulseCount - pulseCountPrec ) / ((curTime - startTime) / 1000.0) / 2500.0; 
		startTime = curTime; 
		pulseCountPrec = pulseCount; 
		Serial.printIn(q);
	}
	//Serial.printIn(pulseCount); 		//nombre d’impulsions totales depuis le début 
}
void countImpulsions( )
{
	pulseCount ++;
}

Merci à vous !
Et surtout prenez soin de vous !!

Bonjour,

Comment tu veux avoir ce volume? Tu pilotes une électrovanne?

Si tu veux simplement calculer le volume qui a été débité c'est simple

    float volume=pulseCount/2500.0;

S'il y a 2500 impulsions/L et que tu veux 15L il faut donc compter 152500 impulsions.
Il faut tester la valeur de pulseCount et quand pulseCount == 15
2500, tu coupes ton électrovanne

Bonjour Kamill,

En effet je pilote une électrovanne reliée à une arrivée d'eau. Et de cette arrivée d'eau je souhaite que lorsque le débitmètre à déterminer que 15L d'eau sont passés je referme mon électrovanne.

Bonjour fdufnews,

Je comprend ce que tu m'écris là mais en revanche je ne vois pas comment le mettre en pratique et l'intégrer dans mon programme.

Et de ce fait je n'ai pas besoin de tout ce code ?

Je vais y réfléchir de mon coté et voir ce que je peux coder.

@kamill et @fdufnews,

j'ai modifié mon code est ce que vous pourriez me dire si il est cohérent et si je ne me complique pas trop la vie ?

j'y ai également rajouté ma commande d'électrovanne (via le Relais)

volatile unsigned long pulseCount = 0;
uint32_t curTime;
unsigned long startTime = 0; 
unsigned long pulseCountPrec = 0; 
int Relais = 2; 

void setup () 
{
  curTime = millis (); 
  if (curTime - startTime > 1000) 
  { 
    float q = (pulseCount - pulseCountPrec) / ((curTime - startTime) / 1000.0) / 2500.0; 
    float v = (pulseCount - pulseCountPrec) / 2500.0;
    startTime = curTime; 
    pulseCountPrec = pulseCount; 
    Serial.println(q); 
    Serial.println(v); 
  } 
  if (pulseCount == 37500)
  {
    digitalWrite(Relais, LOW); 
  }
  //Serial.printIn(pulseCount); 
}
void countImpulsions ()
{
  pulseCount ++;
}

Qu'est ce que ça donne à la compilation?

@kamill,

Eh bien après quelques erreur de frappes corrigées, mauvaise nouvelle il ne compile pas...

Que faire ? Je ne possède pas les différentes bibliothèques, serais-ce à cause de cela ? (je ne connais pas la bibliothèque pour le pulseCount, une idée ?)

Merci à vous !

Mets ton dernier programme.
Tu n'as pas besoin de bibliothèque pulsecount, cest une variable.

D'accord, alors qu'est ce qui peut en être la cause ? j'avoue que je suis un peu perdu là :confused:

volatile unsigned long pulseCount = 0;
uint32_t curTime;
unsigned long startTime = 0; 
unsigned long pulseCountPrec = 0; 
int Relais = 2; 

void setup () 
{
  curTime = millis (); 
  if (curTime - startTime > 1000) 
  { 
    float q = (pulseCount - pulseCountPrec) / ((curTime - startTime) / 1000.0) / 2500.0; 
    float v = (pulseCount - pulseCountPrec) / 2500.0;
    startTime = curTime; 
    pulseCountPrec = pulseCount; 
    Serial.println(q); 
    Serial.println(v); 
  } 
  if (pulseCount == 37500)
  {
    digitalWrite(Relais, LOW); 
  }
  //Serial.printIn(pulseCount); 
}
void countImpulsions ()
{
  pulseCount ++;
}

Pourquoi tu n'es pas reparti sur ton 1er programme?

  • Il manque la loop()
  • ce qui est dans setup() devrait être dans loop()
  • il manque ce qui devrait être dans setup()
  • ...

Ton programme devrait ressembler à ça:

volatile unsigned long pulseCount = 0;
uint32_t curTime;
unsigned long startTime = 0;
unsigned long pulseCountPrec = 0;
const int Relais = 2;
const int pinCapteur=3;     // entrée du capteur

void setup ()
{
  Serial.begin(115200);
  attachInterrupt(digitalPinToInterrupt(pinCapteur), countImpulsions, RISING);   
  pinMode(Relais,OUTPUT);
  digitalWrite(Relais,HIGH);  // ouvre la vanne
}

void loop()
{
  curTime = millis ();
  if (curTime - startTime > 1000)
  {
    float q = (pulseCount - pulseCountPrec) / ((curTime - startTime) / 1000.0) / 2500.0;
    float v = (pulseCount - pulseCountPrec) / 2500.0;
    startTime = curTime;
    pulseCountPrec = pulseCount;
    Serial.println(q);
    Serial.println(v);
  }
  if (pulseCount >= 37500)
  {
    digitalWrite(Relais, LOW);
  }
//  Serial.println(pulseCount);

}
void countImpulsions ()
{
  pulseCount ++;
}

Dans tes calculs c'est quoi la différence entre v et q. v et q représentent quoi et en quelle unité?

ah oui ! mince je me suis planter j'ai oublier de remettre ça..

Merci beaucoup !

v c'est le volume d'eau en Litre;
q c'est le débit en L/s, sachant qu'il ne me sert à rien je vais le retirer.

Dans ton calcul v et q sont les mêmes.

pourtant je ne fais pas intervenir la notion de temps dans mon calcul de v

Si puisque pulseCountPrec cest pulseCount à la seconde précédente
Donc pulseCountPrec-pulseCount cest le nombre de pulse en 1 seconde
Le volume c'est vol=pulseCount / 2500.0

En effet tu as raison

J'ai changé ma loop

void loop()
{
  curTime = millis ();
  if (curTime - startTime > 1000)
  {
    float v = pulseCount / 2500.0;
    Serial.println(v);
  }
  if (pulseCount >= 37500)
  {
    digitalWrite(Relais, LOW);
  }

Est ce que comme ça j'obtiendrai mon volume ? J'ai repris le calcul que tu m'as donné au dessus.

Il manque des choses dans la loop . Il faut que tu reprennes la loop que je t'ai mise au post #10 et que tu changes juste le calcul de v.

Comme ça de ce fait ?

void loop()
{
  curTime = millis ();
  if (curTime - startTime > 1000)
  {
    float q = (pulseCount - pulseCountPrec) / ((curTime - startTime) / 1000.0) / 2500.0;
    float v = pulseCount / 2500.0;
    startTime = curTime;
    pulseCountPrec = pulseCount;
    Serial.println(q);
    Serial.println(v);
  }
  if (pulseCount >= 37500)
  {
    digitalWrite(Relais, LOW);
  }

Il manque le } de fin et il n'y a plus qu'à essayer

oui exact, je vais modifier ça

Dès que je reçois mon capteur j'essaye ça, confinement oblige.. en tout cas il compile !

Merci beaucoup !!