made deep sleep modes work and behave somewhat correctly, gave mqqt time to publish, gave ntp time to sync
This commit is contained in:
parent
83c26cc07c
commit
f8658b78fd
@ -26,6 +26,7 @@ const unsigned long TEMPREADCYCLE = 30000; /**< Check temperature all half minut
|
|||||||
#define SOLAR4SENSORS 6.0f
|
#define SOLAR4SENSORS 6.0f
|
||||||
#define TEMP_INIT_VALUE -999.0f
|
#define TEMP_INIT_VALUE -999.0f
|
||||||
#define TEMP_MAX_VALUE 85.0f
|
#define TEMP_MAX_VALUE 85.0f
|
||||||
|
#define HalfHour 60
|
||||||
|
|
||||||
/********************* non volatile enable after deepsleep *******************************/
|
/********************* non volatile enable after deepsleep *******************************/
|
||||||
|
|
||||||
@ -93,6 +94,30 @@ float getSolarVoltage(){
|
|||||||
return SOLAR_VOLT(solarRawSensor.getAverage());
|
return SOLAR_VOLT(solarRawSensor.getAverage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setMoistureTrigger(int plantId, long value){
|
||||||
|
if(plantId == 0){
|
||||||
|
rtcMoistureTrigger0 = value;
|
||||||
|
}
|
||||||
|
if(plantId == 1){
|
||||||
|
rtcMoistureTrigger1 = value;
|
||||||
|
}
|
||||||
|
if(plantId == 2){
|
||||||
|
rtcMoistureTrigger2 = value;
|
||||||
|
}
|
||||||
|
if(plantId == 3){
|
||||||
|
rtcMoistureTrigger3 = value;
|
||||||
|
}
|
||||||
|
if(plantId == 4){
|
||||||
|
rtcMoistureTrigger4 = value;
|
||||||
|
}
|
||||||
|
if(plantId == 5){
|
||||||
|
rtcMoistureTrigger5 = value;
|
||||||
|
}
|
||||||
|
if(plantId == 6){
|
||||||
|
rtcMoistureTrigger6 = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void readSystemSensors() {
|
void readSystemSensors() {
|
||||||
lipoRawSensor.add(analogRead(SENSOR_LIPO));
|
lipoRawSensor.add(analogRead(SENSOR_LIPO));
|
||||||
solarRawSensor.add(analogRead(SENSOR_SOLAR));
|
solarRawSensor.add(analogRead(SENSOR_SOLAR));
|
||||||
@ -108,32 +133,30 @@ long getCurrentTime(){
|
|||||||
return tv_now.tv_sec;
|
return tv_now.tv_sec;
|
||||||
}
|
}
|
||||||
|
|
||||||
//wait till homie flushed mqtt ect.
|
|
||||||
bool prepareSleep(void *) {
|
|
||||||
//FIXME wait till pending mqtt is done, then start sleep via event or whatever
|
|
||||||
//Homie.disableResetTrigger();
|
|
||||||
|
|
||||||
bool queueIsEmpty = true;
|
|
||||||
if(queueIsEmpty){
|
|
||||||
mDeepsleep = true;
|
|
||||||
}
|
|
||||||
return false; // repeat? true there is something in the queue to be done
|
|
||||||
}
|
|
||||||
|
|
||||||
void espDeepSleepFor(long seconds, bool activatePump = false){
|
void espDeepSleepFor(long seconds, bool activatePump = false){
|
||||||
if(mode3Active){
|
if(mode3Active){
|
||||||
|
Serial << "abort deepsleep, mode3Active" << endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
for(int i = 0;i<10;i++){
|
||||||
|
long cTime = getCurrentTime();
|
||||||
|
if(cTime < 100000){
|
||||||
|
Serial << "Wait for ntp" << endl;
|
||||||
|
delay(100);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
|
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
|
||||||
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF);
|
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF);
|
||||||
esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL,ESP_PD_OPTION_ON);
|
esp_sleep_pd_config(ESP_PD_DOMAIN_XTAL,ESP_PD_OPTION_ON);
|
||||||
if (activatePump) {
|
|
||||||
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON);
|
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON);
|
||||||
|
if (activatePump) {
|
||||||
gpio_deep_sleep_hold_en();
|
gpio_deep_sleep_hold_en();
|
||||||
gpio_hold_en(GPIO_NUM_13); //pump pwr
|
gpio_hold_en(GPIO_NUM_13); //pump pwr
|
||||||
} else {
|
} else {
|
||||||
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_OFF);
|
|
||||||
gpio_hold_dis(GPIO_NUM_13); //pump pwr
|
gpio_hold_dis(GPIO_NUM_13); //pump pwr
|
||||||
gpio_deep_sleep_hold_dis();
|
gpio_deep_sleep_hold_dis();
|
||||||
digitalWrite(OUTPUT_PUMP, LOW);
|
digitalWrite(OUTPUT_PUMP, LOW);
|
||||||
@ -145,11 +168,10 @@ void espDeepSleepFor(long seconds, bool activatePump = false){
|
|||||||
//FIXME fix for outher outputs
|
//FIXME fix for outher outputs
|
||||||
|
|
||||||
|
|
||||||
Serial.print("Going to sleep for ");
|
Serial.print("Trying to sleep for ");
|
||||||
Serial.print(seconds);
|
Serial.print(seconds);
|
||||||
Serial.println(" seconds");
|
Serial.println(" seconds");
|
||||||
esp_sleep_enable_timer_wakeup( (seconds * 1000U * 1000U) );
|
esp_sleep_enable_timer_wakeup( (seconds * 1000U * 1000U) );
|
||||||
//wait4sleep.in(500, prepareSleep);
|
|
||||||
mDeepsleep=true;
|
mDeepsleep=true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,7 +188,7 @@ void mode2MQTT(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (deepSleepTime.get()) {
|
if (deepSleepTime.get()) {
|
||||||
Serial << "sleeping for " << deepSleepTime.get() << endl;
|
Serial << "deepsleep time is configured to " << deepSleepTime.get() << endl;
|
||||||
}
|
}
|
||||||
/* Publish default values */
|
/* Publish default values */
|
||||||
|
|
||||||
@ -191,6 +213,9 @@ void mode2MQTT(){
|
|||||||
sensorTemp.setProperty("control").send( String(t1));
|
sensorTemp.setProperty("control").send( String(t1));
|
||||||
sensorTemp.setProperty("temp").send( String(t2));
|
sensorTemp.setProperty("temp").send( String(t2));
|
||||||
|
|
||||||
|
//give mqtt time, use via publish callback instead?
|
||||||
|
delay(100);
|
||||||
|
|
||||||
bool lipoTempWarning = t1!=85 && t2!=85 && abs(t1 - t2) > 10;
|
bool lipoTempWarning = t1!=85 && t2!=85 && abs(t1 - t2) > 10;
|
||||||
if(lipoTempWarning){
|
if(lipoTempWarning){
|
||||||
Serial.println("Lipo temp incorrect, panic mode deepsleep TODO");
|
Serial.println("Lipo temp incorrect, panic mode deepsleep TODO");
|
||||||
@ -198,6 +223,11 @@ void mode2MQTT(){
|
|||||||
//return;
|
//return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(int i=0; i < MAX_PLANTS; i++) {
|
||||||
|
setMoistureTrigger(i, mPlants[i].mSetting->pSensorDry->get());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool hasWater = true;//FIXMEmWaterGone > waterLevelMin.get();
|
bool hasWater = true;//FIXMEmWaterGone > waterLevelMin.get();
|
||||||
//FIXME no water warning message
|
//FIXME no water warning message
|
||||||
lastPumpRunning = determineNextPump();
|
lastPumpRunning = determineNextPump();
|
||||||
@ -214,10 +244,12 @@ void mode2MQTT(){
|
|||||||
gotoMode2AfterThisTimestamp = getCurrentTime()+deepSleepNightTime.get();
|
gotoMode2AfterThisTimestamp = getCurrentTime()+deepSleepNightTime.get();
|
||||||
Serial.println("No pumps to activate and low light, deepSleepNight");
|
Serial.println("No pumps to activate and low light, deepSleepNight");
|
||||||
espDeepSleepFor(deepSleepNightTime.get());
|
espDeepSleepFor(deepSleepNightTime.get());
|
||||||
|
rtcDeepSleepTime = deepSleepNightTime.get();
|
||||||
}else {
|
}else {
|
||||||
gotoMode2AfterThisTimestamp = getCurrentTime()+deepSleepTime.get();
|
gotoMode2AfterThisTimestamp = getCurrentTime()+deepSleepTime.get();
|
||||||
Serial.println("No pumps to activate, deepSleep");
|
Serial.println("No pumps to activate, deepSleep");
|
||||||
espDeepSleepFor(deepSleepTime.get());
|
espDeepSleepFor(deepSleepTime.get());
|
||||||
|
rtcDeepSleepTime = deepSleepTime.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
}else {
|
}else {
|
||||||
@ -228,30 +260,33 @@ void mode2MQTT(){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setMoistureTrigger(int plantId, long value){
|
long getMoistureTrigger(int plantId){
|
||||||
if(plantId == 0){
|
if(plantId == 0){
|
||||||
rtcMoistureTrigger0 = value;
|
return rtcMoistureTrigger0;
|
||||||
}
|
}
|
||||||
if(plantId == 1){
|
if(plantId == 1){
|
||||||
rtcMoistureTrigger1 = value;
|
return rtcMoistureTrigger1;
|
||||||
}
|
}
|
||||||
if(plantId == 2){
|
if(plantId == 2){
|
||||||
rtcMoistureTrigger2 = value;
|
return rtcMoistureTrigger2;
|
||||||
}
|
}
|
||||||
if(plantId == 3){
|
if(plantId == 3){
|
||||||
rtcMoistureTrigger3 = value;
|
return rtcMoistureTrigger3;
|
||||||
}
|
}
|
||||||
if(plantId == 4){
|
if(plantId == 4){
|
||||||
rtcMoistureTrigger4 = value;
|
return rtcMoistureTrigger4;
|
||||||
}
|
}
|
||||||
if(plantId == 5){
|
if(plantId == 5){
|
||||||
rtcMoistureTrigger5 = value;
|
return rtcMoistureTrigger5;
|
||||||
}
|
}
|
||||||
if(plantId == 6){
|
if(plantId == 6){
|
||||||
rtcMoistureTrigger6 = value;
|
return rtcMoistureTrigger6;
|
||||||
}
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void setLastActivationForPump(int plantId, long value){
|
void setLastActivationForPump(int plantId, long value){
|
||||||
if(plantId == 0){
|
if(plantId == 0){
|
||||||
rtcLastActive0 = value;
|
rtcLastActive0 = value;
|
||||||
@ -361,7 +396,7 @@ void onHomieEvent(const HomieEvent& event) {
|
|||||||
case HomieEventType::MQTT_READY:
|
case HomieEventType::MQTT_READY:
|
||||||
//wait for rtc sync?
|
//wait for rtc sync?
|
||||||
rtcDeepSleepTime = deepSleepTime.get();
|
rtcDeepSleepTime = deepSleepTime.get();
|
||||||
Serial << "MQTT ready " << rtcDeepSleepTime << " ms ds" << endl;
|
Serial << "MQTT ready " << endl;
|
||||||
for(int i=0; i < MAX_PLANTS; i++) {
|
for(int i=0; i < MAX_PLANTS; i++) {
|
||||||
mPlants[i].postMQTTconnection();
|
mPlants[i].postMQTTconnection();
|
||||||
}
|
}
|
||||||
@ -464,6 +499,7 @@ void systemInit(){
|
|||||||
|
|
||||||
Homie.setLoopFunction(homieLoop);
|
Homie.setLoopFunction(homieLoop);
|
||||||
Homie.onEvent(onHomieEvent);
|
Homie.onEvent(onHomieEvent);
|
||||||
|
//Homie.disableLogging();
|
||||||
Homie.setup();
|
Homie.setup();
|
||||||
|
|
||||||
mConfigured = Homie.isConfigured();
|
mConfigured = Homie.isConfigured();
|
||||||
@ -513,48 +549,25 @@ bool mode1(){
|
|||||||
readSensors();
|
readSensors();
|
||||||
//queue sensor values for
|
//queue sensor values for
|
||||||
|
|
||||||
if ((rtcDeepSleepTime == 0) ||
|
if (rtcDeepSleepTime == 0){
|
||||||
(rtcMoistureTrigger0 == 0) ||
|
Serial.println("1 missing rtc value, going to mode2");
|
||||||
(rtcMoistureTrigger1 == 0) ||
|
|
||||||
(rtcMoistureTrigger2 == 0) ||
|
|
||||||
(rtcMoistureTrigger3 == 0) ||
|
|
||||||
(rtcMoistureTrigger4 == 0) ||
|
|
||||||
(rtcMoistureTrigger5 == 0) ||
|
|
||||||
(rtcMoistureTrigger6 == 0)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
Serial.println("RTCm2");
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
for(int i = 0;i<6;i++){
|
||||||
|
long trigger =getMoistureTrigger(i);
|
||||||
|
if(trigger == 0){
|
||||||
|
Serial << "Missing rtc trigger " << i << endl;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if(trigger == DEACTIVATED_PLANT){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(mPlants[0].getSensorValue() <= trigger){
|
||||||
|
Serial << "plant dry starting mode 2" << i << endl;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((rtcMoistureTrigger0 != DEACTIVATED_PLANT) && (mPlants[0].getSensorValue() < rtcMoistureTrigger0) ) {
|
|
||||||
Serial.println("mt0");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if ((rtcMoistureTrigger1 != DEACTIVATED_PLANT) && (mPlants[1].getSensorValue() < rtcMoistureTrigger1) ) {
|
|
||||||
Serial.println("mt1");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if ((rtcMoistureTrigger2 != DEACTIVATED_PLANT) && (mPlants[2].getSensorValue() < rtcMoistureTrigger2) ) {
|
|
||||||
Serial.println("mt2");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if ((rtcMoistureTrigger3 != DEACTIVATED_PLANT) && (mPlants[3].getSensorValue() < rtcMoistureTrigger3) ) {
|
|
||||||
Serial.println("mt3");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if ((rtcMoistureTrigger4 != DEACTIVATED_PLANT) && (mPlants[4].getSensorValue() < rtcMoistureTrigger4) ) {
|
|
||||||
Serial.println("mt4");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if ((rtcMoistureTrigger5 != DEACTIVATED_PLANT) && (mPlants[5].getSensorValue() < rtcMoistureTrigger5) ) {
|
|
||||||
Serial.println("mt5");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if ((rtcMoistureTrigger6 != DEACTIVATED_PLANT) && (mPlants[6].getSensorValue() < rtcMoistureTrigger6) ) {
|
|
||||||
Serial.println("mt6");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
//check how long it was already in mode1 if to long goto mode2
|
//check how long it was already in mode1 if to long goto mode2
|
||||||
|
|
||||||
long cTime = getCurrentTime();
|
long cTime = getCurrentTime();
|
||||||
@ -566,6 +579,8 @@ bool mode1(){
|
|||||||
if(gotoMode2AfterThisTimestamp < cTime){
|
if(gotoMode2AfterThisTimestamp < cTime){
|
||||||
Serial.println("Starting mode 2 after specified mode1 time");
|
Serial.println("Starting mode 2 after specified mode1 time");
|
||||||
return true;
|
return true;
|
||||||
|
} else {
|
||||||
|
Serial << "Mode2 Timer " << gotoMode2AfterThisTimestamp << " curtime " << cTime << endl;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -629,8 +644,7 @@ void setup() {
|
|||||||
mode2();
|
mode2();
|
||||||
} else {
|
} else {
|
||||||
Serial.println("nop");
|
Serial.println("nop");
|
||||||
Serial.flush();
|
espDeepSleepFor(rtcDeepSleepTime);
|
||||||
esp_deep_sleep_start();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -640,15 +654,17 @@ void setup() {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
if (!mDeepsleep) {
|
if (!mDeepsleep || mode3Active) {
|
||||||
Homie.loop();
|
Homie.loop();
|
||||||
} else {
|
} else {
|
||||||
|
Serial << "Bye" << endl;
|
||||||
|
Serial.flush();
|
||||||
esp_deep_sleep_start();
|
esp_deep_sleep_start();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(millis() > 30000 && !mode3Active){
|
if(millis() > 30000 && !mode3Active){
|
||||||
Serial << (millis()/ 1000) << "s alive" << endl;
|
Serial << (millis()/ 1000) << "not terminated watchdog putting to sleep" << endl;
|
||||||
Serial.flush();
|
Serial.flush();
|
||||||
esp_deep_sleep_start();
|
espDeepSleepFor(rtcDeepSleepTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user