Go Down

Topic: Problème débitmètre (Read 1 time) previous topic - next topic

Youhou

Jul 12, 2013, 10:01 pm Last Edit: Jul 12, 2013, 10:10 pm by Youhou Reason: 1
Bonjour tout le monde  :)

Depuis plusieurs semaines j'essaye de résoudre un problème.
En effet j'ai acheter un débitmètre il y'a quelque semaine de ça,tout marche parfaitement le seul problème c'est que j'arrive pas à afficher le débit en temps réel.
Pour le nombre de litres qui se sont déjà écouler pas de soucis avec ça.

Le débitmètre fonctionne sur le principe d'un capteur à effet hall et je sais que chaque impulsion c'est 2,25ml et le problème c'est que le débit en temps réel fait appel à la notion de temps L/m, et j'ai vraiment du mal avec ça... =( .

Après avoir longuement réfléchi j'en suis venu au fait qu'il fallait que je détermine le nombre d'impulsion du débitmètre sur une période de 1 seconde puis multiplier cette valeur par 2,25 puis multiplier tout ça par 60 pour obtenir des ml/m

Comment je pourrais obtenir le nombre d'impulsion pendant exactement une seconde? "je sais que la fonction delay serait fausse car je sais pas combien de temps l'arduino traite le calcul ce qui donnerais delay+temps de calcul"

Voici mon code:"J'ai utiliser un code d'exemple trouvé sur internet"
Code: [Select]


//-------------------------------------------------------------------------//
//-----------------Inclusion des librairies-------------------------------//

                 #include <LiquidCrystal.h>//
               
                 #define FLOWSENSORPIN 10  //pin débitmètre
                 LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

         // count how many pulses!
         volatile uint16_t pulses = 0;
         // track the state of the pulse pin
         volatile uint8_t lastflowpinstate;
         // you can try to keep time of how long it is between pulses
         volatile uint32_t lastflowratetimer = 0;
         // and use that to calculate a flow rate
         volatile float flowrate;
         // Interrupt is called once a millisecond, looks for any pulses from the sensor!
         SIGNAL(TIMER0_COMPA_vect) {
           uint8_t x = digitalRead(FLOWSENSORPIN);
 
     if (x == lastflowpinstate) {
       lastflowratetimer++;
       return; // nothing changed!
     }
     
     if (x == HIGH) {
       //low to high transition!
       pulses++;
     }
     
     lastflowpinstate = x;
     flowrate = 1000.0;
     flowrate /= lastflowratetimer;  // in hertz
     lastflowratetimer = 0;
     delay(10);  
}
         void useInterrupt(boolean v) {
           if (v) {
             // Timer0 is already used for millis() - we'll just interrupt somewhere
             // in the middle and call the "Compare A" function above
             OCR0A = 0xAF;
             TIMSK0 |= _BV(OCIE0A);
           } else {
             // do not call the interrupt function COMPA anymore
             TIMSK0 &= ~_BV(OCIE0A);
           }
           
}

//-------------------------------------------------------------------------//
//----------------------------------SETUP---------------------------------//


void setup()

              {
 
                 
                    Serial.begin(9600);                
                   lcd.begin(20,4);
                   delay(10);                
                   lcd.setCursor(4,1);
                   lcd.print("LCD TEST");                  
                   delay(2000);                
                   lcd.clear();
                   delay(10);
                              pinMode(FLOWSENSORPIN, INPUT);
                              digitalWrite(FLOWSENSORPIN, HIGH);
                              lastflowpinstate = digitalRead(FLOWSENSORPIN);
                              useInterrupt(true);
 



               }

void loop() {

/*
 // if a brass sensor use the following calculation
 float liters = pulses;
 liters /= 8.1;
 liters -= 6;
 liters /= 60.0;
*/


 lcd.setCursor(0, 0);
 lcd.print("Pulses:"); lcd.print(pulses, DEC);
 lcd.setCursor(0,1);
 lcd.print("Hz:");
 lcd.print(flowrate);
 //lcd.print(flowrate);

 
 
 // if a plastic sensor use the following calculation
 // Sensor Frequency (Hz) = 7.5 * Q (Liters/min)
 // Liters = Q * time elapsed (seconds) / 60 (seconds/minute)
 // Liters = (Frequency (Pulses/second) / 7.5) * time elapsed (seconds) / 60
 // Liters = Pulses / (7.5 * 60)
 float liters = pulses;
 liters /= 7.5;
 liters /= 60.0;
 

float debit;

/*
 // if a brass sensor use the following calculation
 float liters = pulses;
 liters /= 8.1;
 liters -= 6;
 liters /= 60.0;
*/
 Serial.print(liters); Serial.println(" Liters");
 lcd.setCursor(0, 2);
 lcd.print(liters); lcd.print(" Liters        ");
 lcd.setCursor(0,3);
 

 delay(100);

     }

     

J'ai vraiment besoin de résoudre ce problème merci d'avance.

Pac2Kro

Regardes du coté de millis().

En ce qui concerne ton matériel, ce n'est pas un débitmètre, mais un compteur.
Le compteur + le traitement que tu feras avec l'arduino feront un débitmètre.

Youhou

merci pour ta réponse!

Donc tu penses que je peux compter le nombre d'impulsions en une seconde avec la fonction millis()?
Je vois pas trop comment faire :(

Pac2Kro

A l'instant T0 tu stock millis() dans une variable
tu commences à compter le nombre d'impulsion
Tu arrêtes de compter les impulsions lorsque DuréeSouhaitée > millis() - T0


bricoleau

#4
Jul 13, 2013, 01:15 am Last Edit: Jul 13, 2013, 01:17 am by bricoleau Reason: 1
Ben pour moi tu as déjà un débit calculé dans ton code (t'es sûr de le comprendre ?)
ou plus exactement il s'agit d'une fréquence d'impulsions, mais bon c'est pareil à un coef multiplicateur près

Il s'agit de la variable flowrate, calculée en Herz

Sauf que là je vois qu'elle est calculée à chaque changement d'état du capteur.
Moi je l'aurais plutôt vue calculée sur front montant uniquement.

C'est à dire déplacer
Code: [Select]

     flowrate = 1000.0;
     flowrate /= lastflowratetimer;  // in hertz
     lastflowratetimer = 0;

dans le bloc "if" juste au dessus

après, c'est un truc du style :
Code: [Select]

debit_instantane_litre_par_minute = flowrate * (2.5 /1000.0) * 60.0;

Youhou

Merci pour vos réponses je viens de trouver la réponse en ayant calculer la fréquence il me rester plus qu'a faire :
Code: [Select]

float debit;
                  debit=flowrate*2,25;
                  debit=debit/1000;
                  debit=debit*60;
                  if(debit<5)
                  {
                    debit=0;
                  }

:) encore merci

Go Up