#define flowsensor_pin 34 // Waterflow sensor pin
volatile int pulse; // Measures flow sensor pulses
volatile int total_pulse = 0;
unsigned long current_time;
unsigned long last_time;
//unsigned long interval = 1000;
float total_volume;
float flowrate;
float average_flowrate = 0;
float total_flowrate = 0;
int average_counter = 0;
float volume_per_pulse = 2.9; //value for calibration
void pulse_counter()
{
pulse++;
}
void waterflow_information (float &flowrate, float &average_flowrate,
float &total_flowrate, float &volume_per_pulse,float &total_volume, volatile int &pulse,
volatile int &total_pulse, unsigned long ¤t_time, unsigned long &last_time,
int &average_counter)
{
//Interval time per data taken
unsigned int interval = 1000;
current_time = millis();
// Every second, calculate and print litres/hour
if (current_time >= (last_time + interval)){
last_time = current_time; // Updates last_time
if (pulse != 0){
// Pulse frequency (Hz) = 7.5Q, Q is flow rate in mL/sin.
// flowrate = (pulse / 7.5); // (Pulse frequency x 60 min) / 7.5Q = flowrate in L/hour
//flowrate Counter
flowrate = (pulse * volume_per_pulse);
//Average Flowratea Counter
average_counter++;
total_flowrate += flowrate;
average_flowrate = total_flowrate / average_counter;
//Total Volume Counter
total_volume = total_volume + flowrate;
//Total Pulse Counter
total_pulse += pulse;
//Serial Monitor Flowrate
Serial.print("Rate: ");
Serial.print(flowrate);
Serial.println(" mL/s");
//Serial Monitor Average Flowrate
Serial.print("Ave Flow: ");
Serial.print(average_flowrate);
Serial.println("mL/s");
//Serial Monitor Total Volume
Serial.print("Total Volume:");
Serial.print(total_volume);
Serial.print(" mL");
//Serial Monitor How much time data taken
Serial.print("\t Take: ");
Serial.println(average_counter);
////Serial Monitor Pulse Rate per Second
Serial.print("Pulse: ");
Serial.println(pulse);
//Serial Monitor Total Pulse For Confirmation
Serial.print("Total Pulse: ");
Serial.println(total_pulse);
Serial.println("-----------------------");
pulse = 0; // Reset Pulse Counter
}
else{
//Serial Monitor If No Measurement taken
Serial.println("Rate: 0 mL/s ");
//Serial Monitor Average Flowrate
Serial.print("Ave Flow: ");
Serial.print(average_flowrate);
Serial.println("mL/s");
//Serial Monitor Total Volume
Serial.print("Total Volume:");
Serial.print(total_volume);
Serial.print(" mL");
//Serial Monitor How much time data taken
Serial.print("\t Take: ");
Serial.println(average_counter);
////Serial Monitor Pulse Rate per Second
Serial.print("Pulse: ");
Serial.println(pulse);
//Serial Monitor Total Pulse For Confirmation
Serial.print("Total Pulse: ");
Serial.println(total_pulse);
Serial.println("-----------------------");
}
}
delay(10);
}
void setup()
{
Serial.begin(115200);
pinMode(flowsensor_pin, INPUT);
digitalWrite(flowsensor_pin, HIGH); // Optional Internal Pull-Up
attachInterrupt(digitalPinToInterrupt(flowsensor_pin), pulse_counter, RISING); // Setup Interrupt
current_time = millis();
last_time = current_time;
}
void loop() {
waterflow_information ( flowrate, average_flowrate, total_flowrate, volume_per_pulse,
total_volume, pulse, total_pulse, current_time, last_time, average_counter);
}