From 6109967939c7f10f9bd3b55735a51ccc275b2b18 Mon Sep 17 00:00:00 2001 From: Alexander Klein Date: Tue, 14 Feb 2023 10:40:11 +0100 Subject: [PATCH] add class Pump --- lib/Pump/pump.cpp | 65 +++++++++++++++++++++++++++++++++++++++++++++++ lib/Pump/pump.h | 49 +++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 lib/Pump/pump.cpp create mode 100644 lib/Pump/pump.h diff --git a/lib/Pump/pump.cpp b/lib/Pump/pump.cpp new file mode 100644 index 0000000..b7fc60d --- /dev/null +++ b/lib/Pump/pump.cpp @@ -0,0 +1,65 @@ +#include "pump.h" + +Pump::Pump(uint8_t pumpPin, uint8_t pressurePin, uint8_t flowPin) { + this->pumpPin = pumpPin; + this->pressurePin = pressurePin; + this->flowPin = flowPin; + + pinMode(this->pumpPin, OUTPUT); + pinMode(this->pressurePin, INPUT); + + digitalWrite(this->pumpPin, LOW); +} + +void Pump::loop() { + if (millis() - lastMillisLoop < this->delayLoopMs) + return; + this->lastMillisLoop = millis(); + + this->calculatePressure(); + this->calculateFlow(); + this->checkErrors(); +} + +bool Pump::switchPump(bool state) { + if (this->error != Error::None) + return false; + + if (state) + this->pumpRunningStart = millis(); + + digitalWrite(this->pumpPin, state); + return true; +} + +uint32_t Pump::getPumpRunningTime() { + if (pumpState) + return millis() - this->pumpRunningStart; + return 0; +} + +void Pump::calculatePressure() { + uint16_t pressure; + uint16_t rawValue = analogRead(this->pressurePin); + if (rawValue < 104) + pressure = 0; + else if (rawValue > 922) + pressure = 550; + else + pressure = map(rawValue, 104, 922, 0, 550); + + //TODO: wenn pumpe lange an und druck hoch dann aus +} + +void Pump::calculateFlow() { + +} + +void Pump::checkErrors() { + if (this->error == Error::None) + return; + + digitalWrite(this->pumpPin, LOW); + if (this->errorFunction) + this->errorFunction(this->error); +} diff --git a/lib/Pump/pump.h b/lib/Pump/pump.h new file mode 100644 index 0000000..7ae9368 --- /dev/null +++ b/lib/Pump/pump.h @@ -0,0 +1,49 @@ +#pragma once + +#include + + +class Pump { + public: + enum Error : uint8_t { + None, + HighPressure, + LowFlow, + Both + }; + typedef void (*ErrorFunction)(Error); + + Pump(uint8_t pumpPin, uint8_t pressurePin, uint8_t flowPin); + + void loop(); + void clearError() { this->error = Error::None; } + bool switchPump(bool state); + void incrementFlowCounter() { this->flowCounter++; }; + + uint8_t getFlowPin() { return this->flowPin; } + uint32_t getPumpRunningTime(); + + void setErrorFunction(ErrorFunction ptr) { this->errorFunction = ptr; } + + private: + void calculatePressure(); + void calculateFlow(); + void checkErrors(); + + Error error = Error::None; + ErrorFunction errorFunction = nullptr; + + bool pumpState = false; + + uint8_t pumpPin; + uint8_t pressurePin; + uint8_t flowPin; + uint8_t delayLoopMs = 20; + + uint16_t flowCounter = 0; + + uint32_t lastMillisLoop = 0; + uint32_t lastPressureCalculation = 0; + uint32_t lastFlowCalculation = 0; + uint32_t pumpRunningStart = 0; +}; \ No newline at end of file