Created
October 1, 2019 09:12
-
-
Save IdrisCytron/1b23265ede09577c19ef6acc27ee848d to your computer and use it in GitHub Desktop.
Interface water flow sensor with ESP32 board.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
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"); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks very much, looking forward to try this out when I get the chance.