added pump specific power level (requires controller that supports this or dc motor)

This commit is contained in:
Your Name 2021-10-26 21:50:55 +02:00
parent dba39869d1
commit 2c8645121e
5 changed files with 19 additions and 6 deletions

View File

@ -98,7 +98,7 @@
#define BATTSENSOR_INDEX_BATTERY 1 #define BATTSENSOR_INDEX_BATTERY 1
#define MQTT_TIMEOUT (1000 * 60) /**< After 10 seconds, MQTT is expected to be connected */ #define MQTT_TIMEOUT (1000 * 60) /**< After 10 seconds, MQTT is expected to be connected */
#define ESP_STALE_TIMEOUT (MQTT_TIMEOUT+(120*1000)) #define ESP_STALE_TIMEOUT (MQTT_TIMEOUT+(700*1000))
#define MAX_PLANTS 7 #define MAX_PLANTS 7
#define SOLAR_CHARGE_MIN_VOLTAGE 7 /**< Sun is rising (morning detected) */ #define SOLAR_CHARGE_MIN_VOLTAGE 7 /**< Sun is rising (morning detected) */

View File

@ -106,7 +106,8 @@ HomieSetting<const char *> ntpServer("ntpServer", "NTP server (pool.ntp.org as d
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 or ml (if using flowmeter) to water when pump is active"); \
PlantSettings_t mSetting##plant = {&mSensorDry##plant, &mPumpAllowedHourRangeStart##plant, &mPumpAllowedHourRangeEnd##plant, &mPumpOnlyWhenLowLight##plant, &mPumpCooldownInMinutes##plant, &pPumpDuration##plant}; \ 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}; \
/**< 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

@ -28,6 +28,7 @@ typedef struct PlantSettings_t
HomieSetting<bool> *pPumpOnlyWhenLowLight; HomieSetting<bool> *pPumpOnlyWhenLowLight;
HomieSetting<long> *pPumpCooldownInMinutes; HomieSetting<long> *pPumpCooldownInMinutes;
HomieSetting<long> *pPumpDuration; HomieSetting<long> *pPumpDuration;
HomieSetting<long> *pPumpPowerLevel;
} PlantSettings_t; } PlantSettings_t;
#endif #endif

View File

@ -19,6 +19,8 @@
#include "MathUtils.h" #include "MathUtils.h"
#define MOISTURE_MEASUREMENT_DURATION 400 /** ms */ #define MOISTURE_MEASUREMENT_DURATION 400 /** ms */
#define PWM_FREQ 50000
#define PWM_BITS 8
class Plant class Plant

View File

@ -55,12 +55,19 @@ void Plant::init(void)
this->mSetting->pPumpDuration->setValidator([](long candidate) { this->mSetting->pPumpDuration->setValidator([](long candidate) {
return ((candidate >= 0) && (candidate <= 1000)); return ((candidate >= 0) && (candidate <= 1000));
}); });
this->mSetting->pPumpPowerLevel->setDefaultValue(100);
this->mSetting->pPumpPowerLevel->setValidator([](long candidate) {
return ((candidate >= 0) && (candidate <= 100));
});
/* Initialize Hardware */ /* Initialize Hardware */
Serial.println("Set GPIO mode " + String(mPinPump) + "=" + String(OUTPUT)); Serial.println("Init PWM controller for pump " + String(mPinPump) + "=" + String(OUTPUT));
Serial.flush(); Serial.flush();
pinMode(this->mPinPump, OUTPUT); ledcSetup(this->mPlantId, PWM_FREQ, PWM_BITS);
ledcAttachPin(mPinPump, this->mPlantId);
ledcWrite(this->mPlantId, 0);
Serial.println("Set GPIO mode " + String(mPinSensor) + "=" + String(ANALOG)); Serial.println("Set GPIO mode " + String(mPinSensor) + "=" + String(ANALOG));
Serial.flush(); Serial.flush();
pinMode(this->mPinSensor, INPUT); pinMode(this->mPinSensor, INPUT);
@ -140,7 +147,7 @@ void Plant::deactivatePump(void)
{ {
int plantId = this->mPlantId; int plantId = this->mPlantId;
Serial << "deactivating pump " << plantId << endl; Serial << "deactivating pump " << plantId << endl;
digitalWrite(this->mPinPump, LOW); ledcWrite(this->mPlantId, 0);
if (this->mConnected) if (this->mConnected)
{ {
const String OFF = String("OFF"); const String OFF = String("OFF");
@ -158,8 +165,10 @@ void Plant::publishState(String state) {
void Plant::activatePump(void) void Plant::activatePump(void)
{ {
int plantId = this->mPlantId; int plantId = this->mPlantId;
Serial << "activating pump " << plantId << endl; Serial << "activating pump " << plantId << endl;
digitalWrite(this->mPinPump, HIGH); long desiredPowerLevelPercent = this->mSetting->pPumpPowerLevel->get();
ledcWrite(this->mPlantId, desiredPowerLevelPercent*PWM_BITS);
if (this->mConnected) if (this->mConnected)
{ {
const String OFF = String("ON"); const String OFF = String("ON");