// // Created by lukas on 10.11.20. // #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; switch (mode) { case TIME: { this->handleTimeHeater(); break; } case HUMIDITY: mHeatingStatus = false; sensor.setPin(TempSensorPin); sensor.onData([this, settings](float hum, float temp) { schedule_function([hum, temp, settings, this]() { Serial.printf("Temp: %gdegC\n", temp); Serial.printf("Humid: %g%%\n", hum); this->lasttemp = temp; this->lasthum = hum; this->handleHeatingEvents(); }); }); sensor.onError([this](uint8_t e) { 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); }); }); mHeizungTicker.attach(10, [this]() { sensor.read(); }); break; default: break; } } float *Heating::getLastTemp() { return &lasttemp; } float *Heating::getLastHum() { return &lasthum; } 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); }