Adding http support to calibrate flow sensor

This commit is contained in:
Sasa Karanovic
2021-07-10 18:48:03 -04:00
parent 9567465883
commit 55a0eb9f48
2 changed files with 63 additions and 14 deletions
@@ -1,3 +1,4 @@
#include <EEPROM.h>
#include "WiFi.h"
#include "ESPAsyncWebServer.h"
#include <esp_task_wdt.h>
@@ -7,6 +8,7 @@
#include "Wire.h"
#define WDT_TIMEOUT 20000
#define EEPROM_SIZE 4
AsyncWebServer server(80);
int WiFi_status = WL_IDLE_STATUS;
@@ -15,6 +17,7 @@ volatile uint32_t nFlowSensorCount_last = 0;
char dbgBuff[4024] = {0};
uint32_t dbgBuffPos = 0;
float fImpulsePerML = 0;
void IRAM_ATTR ISR_flowSensor() {
nFlowSensorCount++;
@@ -40,6 +43,21 @@ void setup()
Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN);
// EEPROM begin
EEPROM.begin(EEPROM_SIZE);
// Debug EEPROM before read
Serial.println("Before read: fImpulsePerML");
Serial.println((float)(fImpulsePerML),4);
// Read flow value from EEPROM
fImpulsePerML = EEPROM.readFloat(0);
// Debug EEPROM after read
Serial.println("After read: fImpulsePerML");
Serial.println((float)(fImpulsePerML),4);
// Configure WDT
Serial.println("Configuring WDT...");
esp_task_wdt_init(WDT_TIMEOUT, true); //enable panic so ESP32 restarts
@@ -273,6 +291,36 @@ void setupWebServer(void)
request->send(200, "text/plain", "OK");
return;
});
// Calibrate flow sensor
server.on("/calibrateFlowSensor", HTTP_GET, [] (AsyncWebServerRequest *request) {
Serial.println("Calibrate edges per mL");
if ( request->hasParam("edges") )
{
String xEdges;
float fEdges = 0;
xEdges = request->getParam("edges")->value();
fEdges = xEdges.toFloat();
// Update value
fImpulsePerML = fEdges;
EEPROM.writeFloat(0, fEdges);//EEPROM.put(address, param);
EEPROM.commit();
Serial.print("Changing fImpulsePerML to ");
Serial.println((float)(fImpulsePerML),4);
request->send(200, "text/plain", "OK");
return;
}
else
{
request->send(404, "text/plain", "MISSING_ARGUMENT");
return;
}
});
}
@@ -161,8 +161,8 @@ void PlantSystem_tick(void)
flowInterruptEnabled(true);
// - Turn ON pump
bWateringError = true;
Serial.println("Turning pump ON");
delay(200);
digitalWrite(WATER_PUMP_EN_PIN, HIGH);
esp_task_wdt_reset();
@@ -170,31 +170,32 @@ void PlantSystem_tick(void)
// Calculate water flow
uint32_t nWaterFlow_millis_timestamp = millis();
float flowRate = 0.0;
unsigned int flowMilliLitres =0;
float flowMilliLitres = 0.0;
unsigned long totalMilliLitres = 0;
// Wait until target mL or timeout is reached
while(millis() < nTimeout)
{
if((millis() - nWaterFlow_millis_timestamp) > 1000) // Only process counters once per second
// Calculate mL every second
if( millis() >= nWaterFlow_millis_timestamp)
{
// Disable interrupts
flowInterruptEnabled(false);
nFlowSensorCount_last = nFlowSensorCount;
nFlowSensorCount = 0;
bWateringError = true;
flowRate = ((1000.0 / (millis() - nWaterFlow_millis_timestamp)) * nFlowSensorCount_last) / WATERING_FLOW_EDGES_PER_L;
flowMilliLitres = (flowRate / 60) * 1000;
// Update mL
flowMilliLitres = nFlowSensorCount/fImpulsePerML;
totalMilliLitres += flowMilliLitres;
// Check if target has been reached
if(totalMilliLitres >= nWatering_volume)
{
bWateringError = false;
break;
}
nWaterFlow_millis_timestamp = millis();
// Update for next iteration
nWaterFlow_millis_timestamp = millis() + 1000;
nFlowSensorCount = 0;
esp_task_wdt_reset();
flowInterruptEnabled(true);
}
@@ -221,7 +222,7 @@ void PlantSystem_tick(void)
bWatering_requestPending = false;
if(bWateringError)
{
LED_Blink(3, 250);
LED_Blink(4, 250);
}
else
{