diff --git a/interface/build/app/icon.png b/interface/build/app/icon.png deleted file mode 100644 index 13dd442..0000000 Binary files a/interface/build/app/icon.png and /dev/null differ diff --git a/interface/build/app/manifest.json b/interface/build/app/manifest.json deleted file mode 100644 index f775661..0000000 --- a/interface/build/app/manifest.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name":"ESP8266 React", - "icons":[ - { - "src":"/app/icon.png", - "sizes":"48x48 72x72 96x96 128x128 256x256" - } - ], - "start_url":"/", - "display":"fullscreen", - "orientation":"any" -} diff --git a/interface/build/css/roboto.css b/interface/build/css/roboto.css deleted file mode 100644 index ac21f0f..0000000 --- a/interface/build/css/roboto.css +++ /dev/null @@ -1,22 +0,0 @@ -/* Just supporting latin due to size constrains on the esp chip */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url(../fonts/li.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2212, U+2215; -} -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url(../fonts/re.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2212, U+2215; -} -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url(../fonts/me.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2212, U+2215; -} \ No newline at end of file diff --git a/interface/build/favicon.ico b/interface/build/favicon.ico deleted file mode 100644 index 399ccae..0000000 Binary files a/interface/build/favicon.ico and /dev/null differ diff --git a/interface/build/fonts/li.woff2 b/interface/build/fonts/li.woff2 deleted file mode 100644 index 52c5845..0000000 Binary files a/interface/build/fonts/li.woff2 and /dev/null differ diff --git a/interface/build/fonts/me.woff2 b/interface/build/fonts/me.woff2 deleted file mode 100644 index 8dceabc..0000000 Binary files a/interface/build/fonts/me.woff2 and /dev/null differ diff --git a/interface/build/fonts/re.woff2 b/interface/build/fonts/re.woff2 deleted file mode 100644 index 7e854e6..0000000 Binary files a/interface/build/fonts/re.woff2 and /dev/null differ diff --git a/interface/build/js/1.b30b.js.gz b/interface/build/js/1.b30b.js.gz deleted file mode 100644 index 3c4fd46..0000000 Binary files a/interface/build/js/1.b30b.js.gz and /dev/null differ diff --git a/src/GeneralInfoService.cpp b/src/GeneralInfoService.cpp index 431ac61..7062e40 100644 --- a/src/GeneralInfoService.cpp +++ b/src/GeneralInfoService.cpp @@ -4,6 +4,7 @@ #include "GeneralInfoService.h" #include "Pins.h" +#include "Timer.h" GeneralInfoService::GeneralInfoService(AsyncWebServer *server, float *lasthum, float *lasttemp) : hum(lasthum), @@ -21,10 +22,12 @@ void GeneralInfoService::reply(AsyncWebServerRequest *request) { root["temp"] = *temp; root["hum"] = *hum; - root["lastpumptime"] = lastPumpTime != 0 ? (millis() - lastPumpTime) / 1000 : 0; - root["lastWaterOutage"] = lastWaterOutage != 0 ? (millis() - lastWaterOutage) / 1000 : 0; - root["lastPumpDuration"] = lastPumpDuration != 0 ? lastPumpDuration / 1000 : 0; - root["runtime"] = millis() / 1000; + const uint32_t systime = Timer::getSystemSeconds(); + + root["lastpumptime"] = lastPumpTime != 0 ? systime - lastPumpTime : 0; + root["lastWaterOutage"] = lastWaterOutage != 0 ? systime - lastWaterOutage : 0; + root["lastPumpDuration"] = lastPumpDuration != 0 ? lastPumpDuration : 0; + root["runtime"] = systime; root["watersensor"] = digitalRead(WasserSensorPin) ? true : false; root["pressuresensor"] = digitalRead(DruckSensorPin) ? true : false; @@ -35,14 +38,14 @@ void GeneralInfoService::reply(AsyncWebServerRequest *request) { request->send(response); } -void GeneralInfoService::setlastPumpTime(unsigned long lastPumpTime) { +void GeneralInfoService::setlastPumpTime(uint32_t lastPumpTime) { this->lastPumpTime = lastPumpTime; } -void GeneralInfoService::setlastWaterOutage(unsigned long lastWaterOutage) { +void GeneralInfoService::setlastWaterOutage(uint32_t lastWaterOutage) { this->lastWaterOutage = lastWaterOutage; } -void GeneralInfoService::setPumpDuration(unsigned long lastPumpDuration) { +void GeneralInfoService::setPumpDuration(uint32_t lastPumpDuration) { this->lastPumpDuration = lastPumpDuration; } diff --git a/src/GeneralInfoService.h b/src/GeneralInfoService.h index fee1adf..b2947d1 100644 --- a/src/GeneralInfoService.h +++ b/src/GeneralInfoService.h @@ -23,19 +23,19 @@ public: * sets the last time when the pump was on * @param lastPumpTime pump time in ms */ - void setlastPumpTime(unsigned long lastPumpTime); + void setlastPumpTime(uint32_t lastPumpTime); /** * sets the last time of a water outage * @param lastWaterOutage last wateroutage time in ms */ - void setlastWaterOutage(unsigned long lastWaterOutage); + void setlastWaterOutage(uint32_t lastWaterOutage); /** * sets the duration of the last pump cycle * @param lastPumpDuration duration in ms */ - void setPumpDuration(unsigned long lastPumpDuration); + void setPumpDuration(uint32_t lastPumpDuration); private: void reply(AsyncWebServerRequest* request); diff --git a/src/Heating.cpp b/src/Heating.cpp index 06ea111..fa0f1af 100644 --- a/src/Heating.cpp +++ b/src/Heating.cpp @@ -5,37 +5,21 @@ #include "Heating.h" #include "Pins.h" +Heating::Heating() : mHeizungTicker(), + mLuefterTicker(), + mTurnOffTicker(), + msettings(nullptr), + mHeatingStatus(), + lasttemp(0), + lasthum(0), + sensor() {} + +void Heating::init(unsigned mode, const SettingState *settings) { + msettings = settings; -void Heating::init(unsigned mode, const SettingState* settings) { switch (mode) { case TIME: { - const unsigned percentOn = 20; - const unsigned refreshperiod = 900; - - const auto func = [this]() { - mLuefterTicker.detach(); - - // every minute turn on the heating - digitalWrite(LuefterPin, HIGH); - digitalWrite(HeizungPin, HIGH); - - Serial.println("Turning on heating"); - - mTurnOffTicker.once((int) ((float) refreshperiod * (float) percentOn / 100.0), []() { - digitalWrite(HeizungPin, LOW); - - Serial.println("Turned off heating!"); - }); - - mLuefterTicker.once((int) (((float) refreshperiod * (float) percentOn / 100.0) + 30.0), []() { - digitalWrite(LuefterPin, LOW); - - Serial.println("Turned off fan!"); - }); - }; - - func(); - mHeizungTicker.attach(refreshperiod, func); + this->handleTimeHeater(); break; } case HUMIDITY: @@ -51,31 +35,7 @@ void Heating::init(unsigned mode, const SettingState* settings) { this->lasttemp = temp; this->lasthum = hum; - if (hum > (float)settings->heatUp) { - // turn off active turnoff timers - mLuefterTicker.detach(); - Serial.println("heating should run now!"); - // turn on heating and fan - digitalWrite(LuefterPin, HIGH); - digitalWrite(HeizungPin, HIGH); - mHeatingStatus = true; - } else if (hum < (float)settings->heatLow) { - // if humidity too low turn off heating and fan after 60secs - digitalWrite(HeizungPin, LOW); - Serial.println("heating should NOT run now!"); - - // if heating status in on set ticker to turn of fan in 60sec - if (mHeatingStatus) { - mLuefterTicker.once((float)settings->fanRuntime, []() { - // turn off fan - digitalWrite(LuefterPin, LOW); - schedule_function([]() { - Serial.println("turning off fan"); - }); - }); - } - mHeatingStatus = false; - } + this->handleHeatingEvents(); }); }); @@ -83,6 +43,11 @@ void Heating::init(unsigned mode, const SettingState* settings) { this->lasttemp = -1.0; this->lasthum = -1.0; + // emergency turnoff of heating + if(mHeatingStatus){ + digitalWrite(HeizungPin, LOW); + } + schedule_function([e]() { Serial.printf("Error: %d\n", e); }); @@ -106,10 +71,60 @@ float *Heating::getLastHum() { return &lasthum; } -Heating::Heating() : mHeizungTicker(), - mLuefterTicker(), - mTurnOffTicker(), - mHeatingStatus(), - lasttemp(0), - lasthum(0), - sensor() {} +void Heating::handleHeatingEvents() { + if (this->lasthum > (float) msettings->heatUp) { + // turn off active turnoff timers + mLuefterTicker.detach(); + Serial.println("heating should run now!"); + // turn on heating and fan + digitalWrite(LuefterPin, HIGH); + digitalWrite(HeizungPin, HIGH); + mHeatingStatus = true; + } else if (this->lasthum < (float) msettings->heatLow) { + // if humidity too low turn off heating and fan after 60secs + digitalWrite(HeizungPin, LOW); + Serial.println("heating should NOT run now!"); + + // if heating status in on set ticker to turn of fan in 60sec + if (mHeatingStatus) { + mLuefterTicker.once((float) msettings->fanRuntime, []() { + // turn off fan + digitalWrite(LuefterPin, LOW); + schedule_function([]() { + Serial.println("turning off fan"); + }); + }); + } + mHeatingStatus = false; + } +} + +void Heating::handleTimeHeater() { + const unsigned percentOn = 20; + const unsigned refreshperiod = 900; + + const auto func = [this]() { + mLuefterTicker.detach(); + + // every minute turn on the heating + digitalWrite(LuefterPin, HIGH); + digitalWrite(HeizungPin, HIGH); + + Serial.println("Turning on heating"); + + mTurnOffTicker.once((int) ((float) refreshperiod * (float) percentOn / 100.0), []() { + digitalWrite(HeizungPin, LOW); + + Serial.println("Turned off heating!"); + }); + + mLuefterTicker.once((int) (((float) refreshperiod * (float) percentOn / 100.0) + 30.0), []() { + digitalWrite(LuefterPin, LOW); + + Serial.println("Turned off fan!"); + }); + }; + + func(); + mHeizungTicker.attach(refreshperiod, func); +} diff --git a/src/Heating.h b/src/Heating.h index 428b440..d238b3a 100644 --- a/src/Heating.h +++ b/src/Heating.h @@ -13,9 +13,23 @@ class Heating { public: Heating(); + /** + * initialize the heater + * @param mode select the operating mode + * @param settings a settings object is needed for HUMIDITY mode to get percent values set by user + */ void init(unsigned mode, const SettingState* settings); + /** + * get the last captured humidity value + * @return humidity value + */ float* getLastHum(); + + /** + * get the last captured temperature value + * @return temperature value + */ float* getLastTemp(); enum MODES {TIME, HUMIDITY}; @@ -24,10 +38,25 @@ private: Ticker mLuefterTicker; Ticker mTurnOffTicker; + const SettingState* msettings; + bool mHeatingStatus; float lasttemp; float lasthum; DHT22 sensor; + + /** + * handle events after successfully received a humidity value + * - turn on/off of heating + * - afterrun of fan + */ + void handleHeatingEvents(); + + /** + * handle events for time-heating mode + * when to turn on/off heating + fan + */ + void handleTimeHeater(); }; diff --git a/src/Pins.h b/src/Pins.h index 9a1355b..a158462 100644 --- a/src/Pins.h +++ b/src/Pins.h @@ -16,6 +16,6 @@ #define TempSensorPin D4 // version info -#define VERSION "v1.2.0" +#define VERSION "v1.2.1" #endif //PUMPENSTEUERUNG_PINS_H diff --git a/src/Timer.cpp b/src/Timer.cpp new file mode 100644 index 0000000..fe18308 --- /dev/null +++ b/src/Timer.cpp @@ -0,0 +1,10 @@ +// +// Created by lukas on 09.12.20. +// + +#include +#include "Timer.h" + +uint32_t Timer::getSystemSeconds() { + return (uint32_t)(micros64() / 1000000); +} diff --git a/src/Timer.h b/src/Timer.h new file mode 100644 index 0000000..3f84212 --- /dev/null +++ b/src/Timer.h @@ -0,0 +1,18 @@ +// +// Created by lukas on 09.12.20. +// + +#ifndef PUMPENSTEUERUNG_TIMER_H +#define PUMPENSTEUERUNG_TIMER_H + +class Timer { +public: + /** + * get system time in seconds + * @return system time in seconds + */ + static uint32_t getSystemSeconds(); +}; + + +#endif //PUMPENSTEUERUNG_TIMER_H diff --git a/src/main.cpp b/src/main.cpp index 47f7452..e40605a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,6 +5,7 @@ #include "Pins.h" #include "GeneralInfoService.h" #include "SettingsService.h" +#include "Timer.h" bool allow; bool error = false; @@ -18,7 +19,7 @@ Ticker pumpendauer; //WifiManager mang; Heating mHeat; -unsigned long turnontime = 0; +uint32_t turnontime = 0; AsyncWebServer server(80); ESP8266React esp8266React(&server); @@ -31,7 +32,7 @@ void pumpeSchalten(bool on) { if (on) { Serial.println("versuche Pumpe EIN zuschalten"); // refresh last pump counter - generalinfo.setlastPumpTime(millis()); + generalinfo.setlastPumpTime(Timer::getSystemSeconds()); } else { Serial.println("versuche Pumpe AUS zuschalten"); } @@ -40,7 +41,7 @@ void pumpeSchalten(bool on) { if (on) { pumpendauer.once((float)settingsservice.getSettings()->maxpumpduration + 1, []() { //erlaube keine einschaltung von mehr als 60 sek - if (millis() - turnontime >= (unsigned)settingsservice.getSettings()->maxpumpduration * 1000 && turnontime != 0) { + if (Timer::getSystemSeconds() - turnontime >= (unsigned)settingsservice.getSettings()->maxpumpduration && turnontime != 0) { //error zu lange Serial.println("\n\npumpe lief mehr als 10 Minuten durchgaengig"); pumpeSchalten(false); @@ -48,11 +49,11 @@ void pumpeSchalten(bool on) { } }); } else { - generalinfo.setPumpDuration(millis() - turnontime); + generalinfo.setPumpDuration(Timer::getSystemSeconds() - turnontime); } // save pump start time - turnontime = millis(); + turnontime = Timer::getSystemSeconds(); digitalWrite(SchuetzPin, on); Serial.println("[Erfolg] pumpe wird geschalten"); @@ -90,7 +91,7 @@ void WasserSensorCheck() { //kein Wasser dh timer auf 10min stellen // refresh wateroutage counter - generalinfo.setlastWaterOutage(millis()); + generalinfo.setlastWaterOutage(Timer::getSystemSeconds()); allow = false; Serial.println("Schalte pumpe aus");