Calcul d'un débit

Bonjour, pour mon projet de TSTI2D SIN, une partie de mon projet est de calculer le débit et la quantité d'eau grâce à un débitmetre, j'ai récupéré et adapté un code que j'ai trouvé sur internet seulement je dois être capable d'expliquer tout le code mais une ligne me pose problème.

#include <SPI.h>

long NbTopsFan; // Variable front montant
long NbTopsFan_2;
int hallsensor = 2; // Signal debimetre en port 2
float Calc; // Variable calcul

void rpm ()     // Appel du sous programme rpm
{
  NbTopsFan++;  // Cette fonction permet de mesurer le front montant et descendant du debimètre

}
void setup()
{
Serial.begin(9600); // Voici la fonction setup (configuration) où le port série est 
pinMode(hallsensor, INPUT); // Initialisation d'un entrée en port 2
attachInterrupt(0, rpm, RISING); // Interruption est fixe

}

void loop()
{
  {
  NbTopsFan = 0;  //Initialise le front montant a 0
  sei();    // Active l'interruption
  delay (125);  // Attend 125 ms
  cli();    // desactive l'interruption
  Calc = ((NbTopsFan * 60 / 7.5) / 43 ); // (Fréquence des implusions * 60 / 7.5)
  Serial.println(Calc); //Imprime les chiffres calculés ci-dessus
  }
}

Voici la ligne qui pose problème :
Calc = ((NbTopsFan * 60 / 7.5) / 43 ); // ((Fréquence des implusions * 60 / 7.5) / 45)

Je sais que :
NbTopsFan = Nombre d'impulsions du débitmetre

  • 60 = Multiplication pour les avoirs à la minutes
    / 43 = Division nécessaire pour avoir le débit en litre (Trouvée sur le site constructeur)

Voici les informations du débitmetre si besoin

  • Caractéristique débit / impulsion: Fréquence (Hz) = 43 x débit (L/min)
  • Impulsion par litre: 5880

Le problème c'est que je ne sais pas à quoi correspond la division par 7.5, et je risque fortement d'avoir une question sur ce calcul et si je n'arrive pas à l'expliquer ça risque de pas trop plaire à mes examinateurs ^^

Merci d'avance pour vos réponses

Bonjour,

Ou as tu trouvé cette formule?

La fréquence en Hz est NbTopsFan1000/125 soit NbTopsFans8

Edit: je viens de m'apercevoir que justement 60/7.5=8 (mais je me demande d'ou vient ce 7.5)

Bonjour, j'ai trouvé la formule sur ce site
http://www.wikidebrouillard.org/index.php?title=Capteur_de_débit_d'eau
et aussi sur le forum arduino, sur le topic d'un élève qui devait faire a peu près le même système (je ne retrouve pas le lien)
le code fonctionne très bien il me donne la bonne quantité de débit (vérifié avec la quantité indiqué par le constructeur de la pompe) Je cherche juste à savoir à quoi correspond le 7.5

Edit : Je viens de voir ton édit, ça marcherai si la priorité de la multiplication n'étais pas présente car le programme fait d'abord (NbTopsFan * 60) puis divise le tout par 7.5

Tu as eu du bol que 60/7.5 donne 8
7.5 c'est le coefficient de conversion impulsion par mn -> débit du capteur utilisé dans ton tuto

Oublies ces 7.5 et refais le calcul correctement:

Dans ton cas:
la fréquence est NbTopsFans1000/125 1000 durée 1s en ms 125: durée de la mesure
donc le débit est NbTopsFans
1000.0/125.0/43.0 (le .0 c'est pour faire le calcul en flottant)

Effectivement tout fonctionne bien, merci !!

Zeiko:
Edit : Je viens de voir ton édit, ça marcherai si la priorité de la multiplication n'étais pas présente car le programme fait d'abord (NbTopsFan * 60) puis divise le tout par 7.5

Ca ne change pas grand chose: que tu divises avant ou après, tu divises. (12 / 3) / 4 et ((12 / 4) / 3) sont égaux.

Je pense que le 7.5 est un coefficient qui a été mis là pour rendre évidentes le sens des valeurs utilisées, plutôt que d'utiliser un seul coefficient qui aurait plus "obscur".

Comme Kamill le dit, reformate ton calcul. Et éventuellement, si tu veux être précis dans ce que tu fais, tu peux vérifier que ton coefficient 43 est bon aussi. Il doit être lié à la section du tube là où sont comptées les impulsions. Tu utilises le même capteur que ceux des exemples que tu as trouvé?

De même, je me permets la traditionnelle remarque sur l'utilisation de delay(), qui est une fonction bloquante. Si jamais tu as le temps, ça vaut le coup (je crois), que tu modifies ton programme: compter les impulsions tout le temps, et, ou bien:

  • lancer le calcul de débit à intervalle régulier (tous les 100ms, par exemple), ce qui te ramènera dans le même cas.
  • compter un nombre d'impulsion donné, et mesurer le temps écoulé pour compter ces impulsions.

43 est le coef donné par le constructeur de mon débitmetre

Ce qui est quand même étrange c'est que ce coefficient ne correspond pas au nombre d'impulsions par litre (ou inversement).

  • Caractéristique débit / impulsion: Fréquence (Hz) = 43 x débit (L/min)
  • Impulsion par litre: 5880

Lequel des deux est exact ?

Pour mesurer le débit de ma chaudière, j'utilise un tel débitmètre, mais au pas de G3/4.

A la rubrique "Output Table" de ce document, on voit par exemple que le débitmètre délivre une fréquence de 39 impulsions/S pour un débit de 7 litres/mn.

Donc, pour 1 litre par minute, on a : 39 / 7 = 5.57 imp/S. Soit au bout de 1 mn, on a 5.57 x 60 = 334 imp/litre.

D'où le nombre de litres /mn : N = nb_imp/S x 60 / 334, ou encore : N = nb_imp/S / 5.57

Ma procédure est la suivante (l'intervalle de temps entre deux mesures peut être n'importe quoi car je prends en compte cet intervalle pour le calcul. Pour ce qui me concerne, dans mon application, je fait un calcul toutes les deux minutes, ça lisse les résultats) :

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
}

void DelaiSurNouvPoint(long t) { // Fonction appelée toutes le t millisecondes
  mesCourbes.ptCour[2] = NbTopsFan / (5.57 * (t - tPrec) / 1000); // (Pulse frequency) / 5.55, = flow rate in L/minute
  tPrec = t;
  NbTopsFan = 0; // remise à  zéro des impulsions

Cordialement.

Pierre

bonjour moi je doit utiliser la fonction "void rpm " pour la vitesse du vent

voici le programme

#define pinILS 3
#define pi 3.14159265359
#define RayonDesBras 0.1 // en mètre de l'anénomètre
#define TEMPO 1000

unsigned long millis_old(0);
float deltaTime(0);
float vitesseVent(0);
int NombreTourSec;
float FEtalonage(1);
/* NB : La fonction d'étalonnage traduit les propriétés aérodynamiques de
l'anémomètre et les frottements qui altèrent le mouvement de rotation de l'anémomètre.
Elle dépend des dimensions et matériaux de l'anémomètre et de sa vitesse de rotation.
Seuls des essais en soufflerie à différents régimes de vent permettent de la déterminer précisément. */
bool isActive(false);

void rpm () //This is the function that the interupt calls
{

Serial.print

}

void setup()
{
pinMode(pinILS, INPUT_PULLUP);// résistance de tirage vers VCC en interne
attachInterrupt(1, rpm, RISING); //and the interrupt is attached to pin 3 //l'interruption est attachée à pin( la broche ) 3

Serial.begin(9600);
}

void loop()
{

//convertion periode -> fréquense

//vitesse du vent

vitesseVent = 2piRayonDesBras*NombreTourSec; //*FEtalonage;
//affichage de la vitesse

Serial.print(NombreTourSec);
Serial.print(" la vitesse du vent est de ");
Serial.print(vitesseVent);
Serial.println(" m/s.");
delay(1000);
}

// the loop() method runs over and over again,
// as long as the Arduino has power
void vitesse_vent ()
{

//Wait 1 second
cli(); //Disable interrupts
vitesseVent = 2piRayonDesBras*NombreTourSec; //*FEtalonage;
NombreTourSec = 0; //Set NbTops to 0 ready for calculations
sei(); //Enables interrupts

Serial.println (" ml/min"); //Prints "L/hour" and returns a new line
}

Julien:
je déduis, au vi de la richesse de votre argumentation, que vous avez tiré un grand profit intellectuel de la discussion ci dessus. Mais est ce que votre post ne serait pas un quadruple post?