Skip to content

Instantly share code, notes, and snippets.

@IdrisCytron
Created October 1, 2019 09:12
Show Gist options
  • Save IdrisCytron/1b23265ede09577c19ef6acc27ee848d to your computer and use it in GitHub Desktop.
Save IdrisCytron/1b23265ede09577c19ef6acc27ee848d to your computer and use it in GitHub Desktop.
Interface water flow sensor with ESP32 board.
/*
Application:
- Interface water flow sensor with ESP32 board.
Board:
- ESP32 Dev Module
https://my.cytron.io/p-node32-lite-wifi-and-bluetooth-development-kit
Sensor:
- G 1/2 Water Flow Sensor
https://my.cytron.io/p-g-1-2-water-flow-sensor
*/
#define LED_BUILTIN 2
#define SENSOR 27
long currentMillis = 0;
long previousMillis = 0;
int interval = 1000;
boolean ledState = LOW;
float calibrationFactor = 4.5;
volatile byte pulseCount;
byte pulse1Sec = 0;
float flowRate;
unsigned int flowMilliLitres;
unsigned long totalMilliLitres;
void IRAM_ATTR pulseCounter()
{
pulseCount++;
}
void setup()
{
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(SENSOR, INPUT_PULLUP);
pulseCount = 0;
flowRate = 0.0;
flowMilliLitres = 0;
totalMilliLitres = 0;
previousMillis = 0;
attachInterrupt(digitalPinToInterrupt(SENSOR), pulseCounter, FALLING);
}
void loop()
{
currentMillis = millis();
if (currentMillis - previousMillis > interval) {
pulse1Sec = pulseCount;
pulseCount = 0;
// Because this loop may not complete in exactly 1 second intervals we calculate
// the number of milliseconds that have passed since the last execution and use
// that to scale the output. We also apply the calibrationFactor to scale the output
// based on the number of pulses per second per units of measure (litres/minute in
// this case) coming from the sensor.
flowRate = ((1000.0 / (millis() - previousMillis)) * pulse1Sec) / calibrationFactor;
previousMillis = millis();
// Divide the flow rate in litres/minute by 60 to determine how many litres have
// passed through the sensor in this 1 second interval, then multiply by 1000 to
// convert to millilitres.
flowMilliLitres = (flowRate / 60) * 1000;
// Add the millilitres passed in this second to the cumulative total
totalMilliLitres += flowMilliLitres;
// Print the flow rate for this second in litres / minute
Serial.print("Flow rate: ");
Serial.print(int(flowRate)); // Print the integer part of the variable
Serial.print("L/min");
Serial.print("\t"); // Print tab space
// Print the cumulative total of litres flowed since starting
Serial.print("Output Liquid Quantity: ");
Serial.print(totalMilliLitres);
Serial.print("mL / ");
Serial.print(totalMilliLitres / 1000);
Serial.println("L");
}
}
@dai63
Copy link

dai63 commented Jul 20, 2024

Thanks very much, looking forward to try this out when I get the chance.

@LucianoBrill
Copy link

Thanks very much

@MatiasRaya
Copy link

Hi, I wanted to know if you connect the flowmeter directly to the board. I'm asking because I understand it has an output between 0V and 5V, while the board's input supports 3.3V. If you could share with me how you connect it, I'd appreciate it. Regards

@dai63
Copy link

dai63 commented Apr 14, 2025 via email

@dai63
Copy link

dai63 commented Apr 15, 2025 via email

@MatiasRaya
Copy link

MatiasRaya commented Apr 22, 2025

Hello, how do you measure the flowmeter output with 5 volts? I'm asking because that would burn the meter. Could you share photos of the wiring?

@dai63
Copy link

dai63 commented Apr 24, 2025

Hi Matias,
Youre not using 5V to monitor the output of the flowmeter; youre monitoring the signal line of the flow meter which is connected to PIN 27 of the ESP. I have connected the flow meter to a 12V supply.
The ESP is fed with 5V from the DC-DC converter (12V to 5V).

I hope this helps
Converter
Yellow = Signal Line

@MatiasRaya
Copy link

Hello, thank you so much for the help, there I was able to make it work.

@dai63
Copy link

dai63 commented Apr 25, 2025

No issues, glad you got there.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment