From a62c403cc21df326e0a12e1b56c5eb339288224c Mon Sep 17 00:00:00 2001 From: Alexander Klein Date: Thu, 6 Jul 2023 11:56:35 +0200 Subject: [PATCH] more improvements --- .vscode/settings.json | 3 ++- lib/Pump/pump.cpp | 59 +++++++++++++++++++++++++++++++++++-------- lib/Pump/pump.h | 14 +++++++--- src/main.cpp | 26 +++++++++++++++++-- 4 files changed, 85 insertions(+), 17 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 89b615e..2ff05ea 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,5 +6,6 @@ "SRCLK", "SROE", "SRSER" - ] + ], + "cmake.configureOnOpen": false } \ No newline at end of file diff --git a/lib/Pump/pump.cpp b/lib/Pump/pump.cpp index 992d200..47633f9 100644 --- a/lib/Pump/pump.cpp +++ b/lib/Pump/pump.cpp @@ -1,5 +1,10 @@ #include "pump.h" +volatile uint32_t interruptCounter = 0; +void flowISR() { + interruptCounter++; +} + Pump::Pump(uint8_t pumpPin, uint8_t pressurePin, uint8_t flowPin, uint8_t ledPin) { this->pumpPin = pumpPin; this->pressurePin = pressurePin; @@ -9,7 +14,8 @@ Pump::Pump(uint8_t pumpPin, uint8_t pressurePin, uint8_t flowPin, uint8_t ledPin pinMode(this->pumpPin, OUTPUT); pinMode(this->ledPin, OUTPUT); pinMode(this->pressurePin, INPUT); - // Hall flow sensor? + attachInterrupt(digitalPinToInterrupt(this->flowPin), flowISR, RISING); + this->lastMillisReadFlow = millis(); digitalWrite(this->pumpPin, LOW); digitalWrite(this->ledPin, LOW); @@ -34,6 +40,12 @@ void Pump::loop() { this->stateStandby(); break; + case State::PreError : { + bool res = this->checkSensorsValues(); + this->statePreError(res); + } + break; + case State::Error : this->stateError(); break; @@ -81,15 +93,24 @@ uint32_t Pump::getRemainingTime() const { } void Pump::readSensorValues() { - if (millis() - this->lastMillisReadSensor < Pump::delayReadSensor) - return; - this->lastMillisReadSensor = millis(); + if (millis() - this->lastMillisReadPressure > Pump::delayReadPressure) { + this->pressure = analogRead(this->pressurePin); + // this->pressure = 12; + this->lastMillisReadPressure = millis(); + } + // Flussimpulseigenschaften: F=(8xQ-4)±5%, F ist die Frequenz, Q ist L/Min. + if (millis() - this->lastMillisReadFlow > Pump::delayReadFlow) { + uint32_t edgesDelta = interruptCounter; + interruptCounter = 0; + this->lastMillisReadFlow = millis(); - //TODO: read pressure - this->pressure = 12; - //TODO: read flow - this->flow = 13; + uint32_t timeDelta = millis() - this->lastMillisReadFlow; + if (timeDelta > Pump::delayReadFlow + 50) + Serial.println(F("Flow resualt may be inaccurate")); + this->flow = (edgesDelta + 4) / 8; + // this->flow = 13; + } } bool Pump::checkSensorsValues() { @@ -97,12 +118,12 @@ bool Pump::checkSensorsValues() { return true; this->lastMillisCheckSensor = millis(); - if (this->flow) { + if (this->flow > 1) { return true; } - if (!this->pressure) { - this->changeState(State::Error); + if (this->pressure < Pump::minPressure) { + this->changeState(State::PreError); return false; } @@ -158,6 +179,11 @@ void Pump::changeState(State state) { this->handlePins(false); break; + case State::PreError : + this->lastStatePreError = this->state; + this->preErrorStartTime = millis(); + break; + case State::OnStupid : this->handlePins(true); break; @@ -203,3 +229,14 @@ void Pump::stateError() { } } } + +void Pump::statePreError(bool checkSensor) { + if (checkSensor) { + this->changeState(this->lastStatePreError); + return; + } + + if (millis() - this->preErrorStartTime > Pump::maxPreErrorTime) { + this->changeState(State::Error); + } +} diff --git a/lib/Pump/pump.h b/lib/Pump/pump.h index 8ba24c6..19a4fac 100644 --- a/lib/Pump/pump.h +++ b/lib/Pump/pump.h @@ -10,7 +10,8 @@ class Pump { Timer = 2, Standby = 3, clearErrorHelper = 99, - Error = 100, + PreError = 100, + Error = 110, OnStupid = 200 }; @@ -33,10 +34,13 @@ class Pump { private: static const uint8_t delayCheckSensor = 100; - static const uint8_t delayReadSensor = 33; + static const uint8_t delayReadPressure = 33; + static const uint8_t minPressure = 100; static const uint16_t blinkTime = 1000; + static const uint16_t delayReadFlow = 1000; static const uint16_t maxPressure = 1000; static const uint16_t maxMaxPressureTime = 30000; + static const uint16_t maxPreErrorTime = 30000; void readSensorValues(); bool checkSensorsValues(); @@ -45,7 +49,9 @@ class Pump { void stateTimer(); void stateStandby(); void stateError(); + void statePreError(bool checkSensors); State state = State::Off; + State lastStatePreError; bool ledState = false; bool timerStandby = false; @@ -63,6 +69,8 @@ class Pump { uint32_t duration; uint32_t lastMillisTimer = 0; uint32_t lastMillisCheckSensor = 0; - uint32_t lastMillisReadSensor = 0; + uint32_t lastMillisReadPressure = 0; + uint32_t lastMillisReadFlow = 0; uint32_t maxPressureStart = 0; + uint32_t preErrorStartTime; }; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index e741dc0..12981f2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -36,17 +36,25 @@ Pump pump(SSR_PIN, PRESSURE_PIN, INT_HALL_PIN, STATUS_LED_1_PIN); Valve valves(MAX_VALVE_OPEN); EthernetClient ethClient; PubSubClient client(ethClient); +// Adafruit_BMP085 bmp; void reconnect(); void callback(char* topic, byte* payload, unsigned int length); void sendPumpStatus(); void sendValveStatus(uint8_t valveNumber); void sendInfo(); +// void sendEnviromentInfo(); void setup() { Serial.begin(115200); Serial.println(F("Arduino Irrigation")); + // if (!bmp.begin()) { + // Serial.println(F("Could not find a valid BMP085 sensor,check wiring!")); + // while (true); + // } + + pinMode(SROE_PIN, OUTPUT); pinMode(SRCLR_PIN, OUTPUT); digitalWrite(SROE_PIN, LOW); @@ -62,7 +70,7 @@ void setup() { client.setCallback(callback); Ethernet.begin(mac, ip, dns, gateway, subnet); - Serial.print("Info: "); + Serial.print(F("Info: ")); Serial.println(Ethernet.localIP() ); // if (Ethernet.begin(mac) == 0) { @@ -95,6 +103,7 @@ void loop() { if (millis() - lastDataSend > 2000) { sendInfo(); sendPumpStatus(); + // sendEnviromentInfo(); for (uint8_t i = 0; i < VALVE_COUNT; i++) sendValveStatus(i); lastDataSend = millis(); @@ -111,7 +120,7 @@ void callback(char* topic, byte* payload, unsigned int length) { DeserializationError error = deserializeJson(doc, payload, length); if (error) { - Serial.print(F("deserializeJson() failed: ")); + Serial.print("deserializeJson() failed: "); Serial.println(error.f_str()); return; } @@ -212,3 +221,16 @@ void sendInfo() { client.publish(topic, buffer, n); } +// void sendEnviromentInfo() { +// StaticJsonDocument<96> doc; +// JsonObject enviroment = doc.createNestedObject("enviroment"); + +// enviroment["temperature"] = bmp.readTemperature(); +// enviroment["pressure"] = bmp.readPressure(); + +// char buffer[256]; +// char topic[64]; +// sprintf(topic, "%s/info", mainTopic); +// size_t n = serializeJson(doc, buffer); +// client.publish(topic, buffer, n); +// }