#define FLOW_SENSOR_PIN 4 // Flow meter signal pin
#define POTENTIOMETER_PIN 34 // Potentiometer analog pin
volatile int pulseCount = 0; // To store pulse count
float flowRate = 0.0; // Flow rate in liters per minute
float totalVolume = 0.0; // Total volume in liters
unsigned long oldTime = 0;
// Interrupt Service Routine for counting flow meter pulses
void IRAM_ATTR countPulse() {
pulseCount++;
}
void setup() {
Serial.begin(115200);
// Configure pins
pinMode(FLOW_SENSOR_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(FLOW_SENSOR_PIN), countPulse, RISING);
analogReadResolution(12); // ESP32 analog resolution (0-4095)
pinMode(POTENTIOMETER_PIN, INPUT);
Serial.println("Water Flow");
}
void loop() {
// Calculate flow rate
unsigned long currentTime = millis();
unsigned long timeInterval = currentTime - oldTime;
if (timeInterval > 1000) { // Calculate every second
// Calculate flow rate in liters per minute
flowRate = (pulseCount / 7.5) / (timeInterval / 1000.0); // Formula depends on flow meter specs
pulseCount = 0; // Reset pulse count
oldTime = currentTime;
// Add to total volume
totalVolume += (flowRate / 60.0); // Convert minutes to seconds
// Read potentiometer value
int potValue = analogRead(POTENTIOMETER_PIN); // Read potentiometer (0-4095)
float setFlow = map(potValue, 0, 4095, 0, 10); // Map to a Set Value for flow rate (0-10 L/min)
// Output flow information
Serial.print("Set Value: ");
Serial.print(setFlow);
Serial.print(" L/min, ");
Serial.print("Flow Rate: ");
Serial.print(flowRate);
Serial.print(" L/min, ");
Serial.print("Total Volume: ");
Serial.print(totalVolume);
Serial.println(" L");
// Simulate flow adjustment (e.g., using PWM for a water pump)
adjustWaterFlow(setFlow);
}
}
void adjustWaterFlow(float setFlow) {
// Simulate adjustment using Set Value for flow rate
// Example: Generate PWM signal to control a water pump
int pwmValue = map(setFlow, 0, 10, 0, 255); // Map Set Value for flow to PWM range
analogWrite(25, pwmValue); // Send PWM signal on pin 25
}