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)
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 ^^
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 NbTopsFans1000.0/125.0/43.0 (le .0 c'est pour faire le calcul en flottant)
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.
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
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?