From 9f2e21d94c66503b75aa0b99171d4f49797b531d Mon Sep 17 00:00:00 2001 From: Ollo Date: Sat, 25 Mar 2023 14:21:33 +0100 Subject: [PATCH] Sleep 3 times longer, if the battery voltage is low --- esp32/include/ControllerConfiguration.h | 8 +++++--- esp32/include/LogDefines.h | 1 + esp32/include/PlantCtrl.h | 2 +- esp32/src/main.cpp | 16 +++++++++++----- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/esp32/include/ControllerConfiguration.h b/esp32/include/ControllerConfiguration.h index bd9e24f..f6e300f 100644 --- a/esp32/include/ControllerConfiguration.h +++ b/esp32/include/ControllerConfiguration.h @@ -102,10 +102,12 @@ #define ESP_STALE_TIMEOUT (MQTT_TIMEOUT+(700*1000)) #define MAX_PLANTS 7 -#define SOLAR_CHARGE_MIN_VOLTAGE 7 /**< Sun is rising (morning detected) */ -#define SOLAR_CHARGE_MAX_VOLTAGE 9 /**< Sun is shining (noon) */ -#define SOLAR_MAX_VOLTAGE_POSSIBLE 100 /**< higher values are treated as not connected sensor */ +#define SOLAR_CHARGE_MIN_VOLTAGE 7 /**< Sun is rising (morning detected) */ +#define SOLAR_CHARGE_MAX_VOLTAGE 9 /**< Sun is shining (noon) */ +#define SOLAR_MAX_VOLTAGE_POSSIBLE 100 /**< higher values are treated as not connected sensor */ #define VOLT_MAX_BATT 4.2f +#define VOLT_MIN_BATT 3.0f /**< Minimum battery voltage for normal operation */ +#define LOWVOLT_SLEEP_FACTOR 3 /**< Factor for nightsleep delay, if the battery drops below minimum (@see VOLT_MIN_BATT) */ #define MAX_CONFIG_SETTING_ITEMS 100 /**< Parameter, that can be configured in Homie */ #define MAX_JSON_CONFIG_FILE_SIZE_CUSTOM 2500 diff --git a/esp32/include/LogDefines.h b/esp32/include/LogDefines.h index c400a6b..78285f5 100644 --- a/esp32/include/LogDefines.h +++ b/esp32/include/LogDefines.h @@ -39,6 +39,7 @@ #define LOG_DEBUG_CODE 1001 #define LOG_SLEEP_NIGHT 100 #define LOG_SLEEP_DAY 101 +#define LOG_SLEEP_LOWVOLTAGE 502 #define LOG_SLEEP_CYCLE 102 #define LOG_MISSING_PUMP -4 #define LOG_BOOT_ERROR_DETECTION 10000 diff --git a/esp32/include/PlantCtrl.h b/esp32/include/PlantCtrl.h index cae0ccf..1067308 100644 --- a/esp32/include/PlantCtrl.h +++ b/esp32/include/PlantCtrl.h @@ -148,7 +148,7 @@ public: { return MISSING_SENSOR; } - if (mMoisture_raw.getMedian() > MOIST_SENSOR_MAX_FRQ) + else if (mMoisture_raw.getMedian() > MOIST_SENSOR_MAX_FRQ) { return SHORT_CIRCUIT_MODE; } diff --git a/esp32/src/main.cpp b/esp32/src/main.cpp index 6a3a4b1..db64b10 100644 --- a/esp32/src/main.cpp +++ b/esp32/src/main.cpp @@ -80,6 +80,7 @@ long nextBlink = 0; /**< Time needed in main loop to support expected blink code RunningMedian waterRawSensor = RunningMedian(5); float mSolarVoltage = 0.0f; /**< Voltage from solar panels */ +float mBatteryVoltage = 0.0f; /**< Voltage from lipo */ unsigned long setupFinishedTimestamp; bool pumpStarted = false; @@ -189,7 +190,12 @@ void espDeepSleep(bool afterPump = false) } else { - if (mSolarVoltage < SOLAR_CHARGE_MIN_VOLTAGE) + if (mBatteryVoltage < VOLT_MIN_BATT) + { + log(LOG_LEVEL_INFO, String(String(mBatteryVoltage) + "V! Almost empty -> deepSleepNight times " + String(LOWVOLT_SLEEP_FACTOR)), LOG_SLEEP_LOWVOLTAGE); + secondsToSleep = (deepSleepNightTime.get() * LOWVOLT_SLEEP_FACTOR); + } + else if (mSolarVoltage < SOLAR_CHARGE_MIN_VOLTAGE) { log(LOG_LEVEL_INFO, String(String(mSolarVoltage) + "V! Low light -> deepSleepNight"), LOG_SLEEP_NIGHT); secondsToSleep = deepSleepNightTime.get(); @@ -1042,7 +1048,7 @@ void plantcontrol() Serial << "W : " << waterRawSensor.getAverage() << " mm (" << String(waterLevelMax.get() - waterRawSensor.getAverage()) << " mm left)" << endl; - float batteryVoltage = battery.getVoltage(BATTSENSOR_INDEX_BATTERY); + mBatteryVoltage = battery.getVoltage(BATTSENSOR_INDEX_BATTERY); float chipTemp = battery.getTemperature(); Serial << "Chip Temperatur " << chipTemp << " °C " << endl; @@ -1062,8 +1068,8 @@ void plantcontrol() sensorWater.setProperty("distance").send(String(waterRawSensor.getAverage())); } } - sensorLipo.setProperty("percent").send(String(100 * batteryVoltage / VOLT_MAX_BATT)); - sensorLipo.setProperty("volt").send(String(batteryVoltage)); + sensorLipo.setProperty("percent").send(String(100 * mBatteryVoltage / VOLT_MAX_BATT)); + sensorLipo.setProperty("volt").send(String(mBatteryVoltage)); sensorLipo.setProperty("current").send(String(battery.getCurrent())); sensorLipo.setProperty("Ah").send(String(battery.getAh())); sensorLipo.setProperty("ICA").send(String(battery.getICA())); @@ -1082,7 +1088,7 @@ void plantcontrol() Serial.flush(); } -bool isLowLight = mSolarVoltage <= 9; +bool isLowLight = (mSolarVoltage <= SOLAR_CHARGE_MAX_VOLTAGE); #if defined(TIMED_LIGHT_PIN) bool shouldLight = determineTimedLightState(isLowLight);