pump refactor round 1

This commit is contained in:
Empire 2021-11-19 18:48:14 +00:00
parent d00517ec1e
commit af618e73f3
4 changed files with 32 additions and 11 deletions

View File

@ -82,12 +82,12 @@
/** \addtogroup Configuration /** \addtogroup Configuration
* @{ * @{
*/ */
#define FIRMWARE_VERSION "sw 2.0 hw 0.10b" #define FIRMWARE_VERSION "sw 2.1 hw 0.10b"
#define TIMED_LIGHT_PIN CUSTOM1_PIN5 #define TIMED_LIGHT_PIN CUSTOM1_PIN5
//#define FLOWMETER_PIN CUSTOM1_PIN1 #define FLOWMETER_PIN CUSTOM1_PIN1
#ifdef FLOWMETER_PIN #ifdef FLOWMETER_PIN
#define FLOWMETER_FLOWFACTOR 22 /** F = 22 * Q;Q = L/min */ #define FLOWMETER_FLOWFACTOR 23 /** F = 22 * Q;Q = L/min */
#endif #endif
#define MOIST_SENSOR_MAX_FRQ 60000 // 60kHz (500Hz margin) #define MOIST_SENSOR_MAX_FRQ 60000 // 60kHz (500Hz margin)

View File

@ -105,9 +105,10 @@ HomieSetting<const char *> ntpServer("ntpServer", "NTP server (pool.ntp.org as d
HomieSetting<long> mPumpAllowedHourRangeEnd##plant = HomieSetting<long>("hourend" strplant, "Plant" strplant " - Range pump allowed hour end (0-23)"); \ HomieSetting<long> mPumpAllowedHourRangeEnd##plant = HomieSetting<long>("hourend" strplant, "Plant" strplant " - Range pump allowed hour end (0-23)"); \
HomieSetting<bool> mPumpOnlyWhenLowLight##plant = HomieSetting<bool>("lowLight" strplant, "Plant" strplant " - Enable the Pump only, when there is no sunlight"); \ HomieSetting<bool> mPumpOnlyWhenLowLight##plant = HomieSetting<bool>("lowLight" strplant, "Plant" strplant " - Enable the Pump only, when there is no sunlight"); \
HomieSetting<long> mPumpCooldownInMinutes##plant = HomieSetting<long>("delay" strplant, "Plant" strplant " - How long to wait until the pump is activated again (minutes)"); \ HomieSetting<long> mPumpCooldownInMinutes##plant = HomieSetting<long>("delay" strplant, "Plant" strplant " - How long to wait until the pump is activated again (minutes)"); \
HomieSetting<long> pPumpDuration##plant = HomieSetting<long>("pumpDuration" strplant, "Plant" strplant " - time seconds or ml (if using flowmeter) to water when pump is active"); \ HomieSetting<long> pPumpDuration##plant = HomieSetting<long>("pumpDuration" strplant, "Plant" strplant " - time seconds to water when pump is active"); \
HomieSetting<long> pPumpMl##plant = HomieSetting<long>("pumpAmount" strplant, "Plant" strplant " - ml (if using flowmeter) to water when pump is active"); \
HomieSetting<long> pPowerLevel##plant = HomieSetting<long>("powerLevel" strplant, "Plant" strplant " - pwm duty cycle in percent"); \ HomieSetting<long> pPowerLevel##plant = HomieSetting<long>("powerLevel" strplant, "Plant" strplant " - pwm duty cycle in percent"); \
PlantSettings_t mSetting##plant = {&mSensorDry##plant, &mPumpAllowedHourRangeStart##plant, &mPumpAllowedHourRangeEnd##plant, &mPumpOnlyWhenLowLight##plant, &mPumpCooldownInMinutes##plant, &pPumpDuration##plant, &pPowerLevel##plant}; \ PlantSettings_t mSetting##plant = {&mSensorDry##plant, &mPumpAllowedHourRangeStart##plant, &mPumpAllowedHourRangeEnd##plant, &mPumpOnlyWhenLowLight##plant, &mPumpCooldownInMinutes##plant, &pPumpDuration##plant, &pPowerLevel##plant, &pPumpMl##plant}; \
/**< Generate all settings for one plant \ /**< Generate all settings for one plant \
* \ * \
* Feature to start pumping only at morning: @link{SOLAR_CHARGE_MIN_VOLTAGE} and @link{SOLAR_CHARGE_MAX_VOLTAGE} \ * Feature to start pumping only at morning: @link{SOLAR_CHARGE_MIN_VOLTAGE} and @link{SOLAR_CHARGE_MAX_VOLTAGE} \

View File

@ -29,6 +29,7 @@ typedef struct PlantSettings_t
HomieSetting<long> *pPumpCooldownInSeconds; HomieSetting<long> *pPumpCooldownInSeconds;
HomieSetting<long> *pPumpDuration; HomieSetting<long> *pPumpDuration;
HomieSetting<long> *pPumpPowerLevel; HomieSetting<long> *pPumpPowerLevel;
HomieSetting<long> *pPumpMl;
} PlantSettings_t; } PlantSettings_t;
#endif #endif

View File

@ -69,7 +69,7 @@ RTC_DATA_ATTR long consecutiveWateringPlant[MAX_PLANTS] = {0};
bool volatile mDownloadMode = false; /**< Controller must not sleep */ bool volatile mDownloadMode = false; /**< Controller must not sleep */
bool volatile mSensorsRead = false; /**< Sensors are read without Wifi or MQTT */ bool volatile mSensorsRead = false; /**< Sensors are read without Wifi or MQTT */
int volatile pumpToRun = -1; /** pump to run at the end of the cycle */ int volatile pumpToRun = -1; /** pump to run at the end of the cycle */
int volatile selfTestPumpRun = -1; /** pump to run at the end of the cycle */ int volatile selfTestPumpRun = -1; /** pump to run at the end of the cycle */
bool mConfigured = false; bool mConfigured = false;
long nextBlink = 0; /**< Time needed in main loop to support expected blink code */ long nextBlink = 0; /**< Time needed in main loop to support expected blink code */
@ -80,6 +80,7 @@ unsigned long setupFinishedTimestamp;
bool pumpStarted = false; bool pumpStarted = false;
long pumpTarget = -1; long pumpTarget = -1;
long lastSendPumpUpdate = 0;
#ifdef FLOWMETER_PIN #ifdef FLOWMETER_PIN
long pumpTargetMl = -1; long pumpTargetMl = -1;
#endif #endif
@ -568,10 +569,10 @@ void initPumpLogic()
pcnt_counter_clear(unit); // Zera o contador PCNT pcnt_counter_clear(unit); // Zera o contador PCNT
pcnt_counter_resume(unit); pcnt_counter_resume(unit);
#else #endif
pumpTarget = millis() + (mPlants[pumpToRun].getPumpDuration() * 1000); pumpTarget = millis() + (mPlants[pumpToRun].getPumpDuration() * 1000);
log(LOG_LEVEL_INFO, "Starting pump " + String(pumpToRun) + " for " + String(mPlants[pumpToRun].getPumpDuration()) + "s", LOG_PUMP_STARTED_CODE); log(LOG_LEVEL_INFO, "Starting pump " + String(pumpToRun) + " for " + String(mPlants[pumpToRun].getPumpDuration()) + "s", LOG_PUMP_STARTED_CODE);
#endif
//enable power //enable power
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
digitalWrite(OUTPUT_ENABLE_PUMP, HIGH); digitalWrite(OUTPUT_ENABLE_PUMP, HIGH);
@ -592,6 +593,13 @@ void pumpActiveLoop()
rtcLastWateringPlant[pumpToRun] = getCurrentTime(); rtcLastWateringPlant[pumpToRun] = getCurrentTime();
} }
bool mqttUpdateTick = false;
if (lastSendPumpUpdate + 1000 < millis())
{
lastSendPumpUpdate = millis();
mqttUpdateTick = true;
}
#ifdef FLOWMETER_PIN #ifdef FLOWMETER_PIN
int16_t pulses; int16_t pulses;
pcnt_unit_t unit = (pcnt_unit_t)(PCNT_UNIT_7); pcnt_unit_t unit = (pcnt_unit_t)(PCNT_UNIT_7);
@ -612,14 +620,25 @@ void pumpActiveLoop()
{ {
targetReached = true; targetReached = true;
pcnt_counter_pause(unit); pcnt_counter_pause(unit);
mPlants[pumpToRun].setProperty("waterusage").send(String(pumped));
}
else if (mqttUpdateTick)
{
mPlants[pumpToRun].setProperty("waterusage").send(String(pumped));
} }
mPlants[pumpToRun].setProperty("waterusage").send(String(pumped));
} }
#else
long duration = pumpTarget - millis();
if (millis() > pumpTarget) if (millis() > pumpTarget)
{ {
mPlants[pumpToRun].setProperty("watertime").send(String(duration));
targetReached = true; targetReached = true;
} }
else if (mqttUpdateTick)
{
mPlants[pumpToRun].setProperty("watertime").send(String(duration));
}
#endif #endif
if (targetReached) if (targetReached)
@ -831,7 +850,7 @@ void setup()
void selfTest() void selfTest()
{ {
if (selfTestPumpRun >= 0 && selfTestPumpRun < MAX_PLANTS) if (selfTestPumpRun >= 0 && selfTestPumpRun < MAX_PLANTS)
{ {
Serial << "self test mode pump deactivate " << pumpToRun << endl; Serial << "self test mode pump deactivate " << pumpToRun << endl;