Pages: [1]   Go Down
Author Topic: Flow Sensor: How to get quantity rather than rate  (Read 2118 times)
0 Members and 1 Guest are viewing this topic.
South East USA
Offline Offline
God Member
*****
Karma: 5
Posts: 658
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

The below code is from Seeedstudio as an example on how to read the current flow rate of the sensor.  Would it be easy to change this so that instead of getting a flow rate, it actually meters out a specific amount of water?  So if I have a long PulseCount, is will let me know when that many pulses have occurred.
Thanks,





Code:
// reading liquid flow rate using Seeeduino and Water Flow Sensor from Seeedstudio.com
// Code adapted by Charles Gantt from PC Fan RPM code written by Crenn @thebestcasescenario.com
// http:/themakersworkbench.com http://thebestcasescenario.com http://seeedstudio.com

volatile int NbTopsFan; //measuring the rising edges of the signal
int Calc;                               
int hallsensor = 2;    //The pin location of the sensor

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
}
// The setup() method runs once, when the sketch starts
void setup() //
{
  pinMode(hallsensor, INPUT); //initializes digital pin 2 as an input
  Serial.begin(9600); //This is the setup function where the serial port is

initialised,
  attachInterrupt(0, rpm, RISING); //and the interrupt is attached
}
// the loop() method runs over and over again,
// as long as the Arduino has power
void loop ()   
{
  NbTopsFan = 0;   //Set NbTops to 0 ready for calculations
  sei();      //Enables interrupts
  delay (1000);   //Wait 1 second
  cli();      //Disable interrupts
  Calc = (NbTopsFan * 60 / 7.5); //(Pulse frequency x 60) / 7.5Q, = flow rate

in L/hour
  Serial.print (Calc, DEC); //Prints the number calculated above
  Serial.print (" L/hour\r\n"); //Prints "L/hour" and returns a  new line
}
Logged

South East USA
Offline Offline
God Member
*****
Karma: 5
Posts: 658
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Preferable without adding delay to my code, or at least with the option of checking to see if any input has come from my keypad...
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 360
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Get rid of the delay in your loop, and don't reset your counter - just let your ISR keep adding it up, to get total quantity flowed. No performance loss.

Logged

Left Coast, CA (USA)
Offline Offline
Brattain Member
*****
Karma: 362
Posts: 17307
Measurement changes behavior
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Actually you need to keep track of two measurements on rate based and one time based, if you need know the total amount of material that has flowed over time. One is the specific flow rate at any given time it's measured and the other measurement is the flow totalizer the integrates the flow rate over time. It's not as simple as it might first appear.

 Total flow amount (a quantity) is equal to flow (a rate of flow) over a specified time span. The difficulty is if the flow rate can or does change rather then always being a fixed rate, hence the need to do a integration calculation and periodically reset the flow, as in total gallons per day, etc.

If flow rate is a constant then you just need to keep track of time passed from start and keep a running total quantity flowed sense start.
 
Logged

Global Moderator
Netherlands
Online Online
Shannon Member
*****
Karma: 227
Posts: 14051
In theory there is no difference between theory and practice, however in practice there are many...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Not a flowsensor but I had a similar thing with KWH, wrote article on the playground that is easily converted to a flowsensor.
See - http://www.arduino.cc/playground/Main/EEM12L-32AKWhMonitoring

Succes,
Rob
Logged

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

South East USA
Offline Offline
God Member
*****
Karma: 5
Posts: 658
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I should have been more specific.  I don't need to know anything about the RATE.  All I need to do is know how much water flows (how many pulses)  If it's just a few lines, would someone be able to show me a simple counter sketch that would count the number of pulses?  I was hoping it'd be just a few simple lines to count the pulses until I get to a specificied pulse count.  I'm new at this.

Logged

Left Coast, CA (USA)
Offline Offline
Brattain Member
*****
Karma: 362
Posts: 17307
Measurement changes behavior
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Here is something you can play with. It compiles but I haven't tested it, it's just for concept.

Code:
// flow pulse counter
// Uses pin 2 interupt to measure flow of material signal input
// retrolefty 2/5/11

  
volatile unsigned long isrCounter;
unsigned long pulseCount;
unsigned long stopCount = 100000;

void setup() {

  Serial.begin(57600);
  Serial.println ("Flow counter starting");     // signal initalization done
  attachInterrupt(0, countP, RISING);

  }  // End of setup


void loop() {
  delay(100);
  noInterrupts();
  long pulseCount = isrCounter;
  interrupts();
  Serial.print("Flow pulses =  ");
  Serial.print("   ");
  Serial.println(pulseCount);
  if (pulseCount > stopCount)
      {
        // issue a stop command here for the pump
        // some kind of digitalWrite(pumpPin, LOW);
        Serial.println("Pump stopped after ");
        Serial.print(pulseCount);
        Serial.println(" pulses");
        while(true) {}  // endless loop here to stop program
      }
 
}  // end of loop

void countP()
 {
   isrCounter++;
 }


Lefty
« Last Edit: February 05, 2011, 06:08:40 pm by retrolefty » Logged

South East USA
Offline Offline
God Member
*****
Karma: 5
Posts: 658
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

THANKS!  I was just reading about the attachInterrupt function, and wondering if it could do something for me...
So do I understand it right:
 attachInterrupt(0, countP, RISING)

...the external interrupt(0) is on pin 2 on the Uno, so my sensor is connected there.
...countP is the code that will run when RISING occures.
This is perfect!  This does exactly what I'm needing!
Thanks again.
Logged

Left Coast, CA (USA)
Offline Offline
Brattain Member
*****
Karma: 362
Posts: 17307
Measurement changes behavior
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
So do I understand it right:
 attachInterrupt(0, countP, RISING)

...the external interrupt(0) is on pin 2 on the Uno, so my sensor is connected there.
...countP is the code that will run when RISING occures.

You got it, and you are welcome.

Lefty
Logged

Pages: [1]   Go Up
Jump to: