|
#include "DHT.h"
#include <WiFi.h>
#include <WebServer.h>
const byte interruptPin1 = 25;
const byte interruptPin2 = 24;
volatile int interruptCounter = 0;
int numberOfInterrupts = 0;
float calibrationFactor = 4.5;
volatile byte pulseCount;
float flowRate;
unsigned int flowMilliLitres;
unsigned long totalMilliLitres;
float Q; //Q m^3/s
float V; //V m/s
const float plo = 0.001; // kg/m^3
float Pressure; //q (BAR) q = ½ρ v²
float Diameter = 2.15/100; //A m
float Area = 3.14159*Diameter*Diameter; //m²
unsigned long oldTime;
portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;
void IRAM_ATTR handleInterrupt() {
portENTER_CRITICAL_ISR(&mux);
interruptCounter++;
portEXIT_CRITICAL_ISR(&mux);
//Serial.println("interrupt");
}
void setup() {
Serial.begin(115200);
Serial.println("Monitoring interrupts: ");
pinMode(interruptPin1, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin1), handleInterrupt, FALLING);
pulseCount = 0;
flowRate = 0.0;
flowMilliLitres = 0;
totalMilliLitres = 0;
oldTime = 0;
}
void loop() {
if(interruptCounter>0){
portENTER_CRITICAL(&mux);
interruptCounter--;
pulseCount++;
portEXIT_CRITICAL(&mux);
numberOfInterrupts++;
// Serial.print("An interrupt has occurred. Total: ");
// Serial.println(numberOfInterrupts);
flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
// Note the time this processing pass was executed. Note that because we've
// disabled interrupts the millis() function won't actually be incrementing right
// at this point, but it will still return the value it was set to just before
// interrupts went away.
oldTime = 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;
Q = flowMilliLitres;
// Add the millilitres passed in this second to the cumulative total
totalMilliLitres += flowMilliLitres;
unsigned int frac;
// // 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("."); // Print the decimal point
// // Determine the fractional part. The 10 multiplier gives us 1 decimal place.
// frac = (flowRate - int(flowRate)) * 10;
// Serial.print(frac, DEC) ; // Print the fractional part of the variable
// Serial.print("L/min");
// Print the number of litres flowed in this second
Serial.print(" Current Liquid Flowing: "); // Output separator
Serial.print(flowMilliLitres);
Serial.print("mL/Sec");
V = (Q / Area)/1000000;
//calculate q = ½ρ v² (SI units):
Pressure = (0.5*(plo)*V*V)/0.00001; //Bar)
Serial.print(" Pressure Liquid: ");
Serial.print(Pressure);
Serial.print("Bar");
// Print the cumulative total of litres flowed since starting
Serial.print(" Output Liquid Quantity: "); // Output separator
Serial.print(totalMilliLitres);
Serial.println("mL");
// Reset the pulse counter so we can start incrementing again
pulseCount = 0;
}
}
|
|