Pages: [1]   Go Down
Author Topic: Problème débitmètre  (Read 641 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour tout le monde  smiley

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... smiley-cry .

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:

 //-------------------------------------------------------------------------//
 //-----------------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.
« Last Edit: July 12, 2013, 03:10:49 pm by Youhou » Logged

France
Offline Offline
Full Member
***
Karma: 0
Posts: 154
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-sad
Logged

France
Offline Offline
Full Member
***
Karma: 0
Posts: 154
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Offline Offline
Full Member
***
Karma: 3
Posts: 132
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
     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:
debit_instantane_litre_par_minute = flowrate * (2.5 /1000.0) * 60.0;
« Last Edit: July 12, 2013, 06:17:28 pm by bricoleau » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
float debit;
                  debit=flowrate*2,25;
                  debit=debit/1000;
                  debit=debit*60;
                  if(debit<5)
                  {
                    debit=0;
                  }
smiley encore merci
Logged

Pages: [1]   Go Up
Jump to: