/** * @file config.h * @brief Global configuration definitions for the GreenHouse Controller. * * This file defines default values for WiFi, MQTT, timing parameters, setpoints, * and per-plant watering configurations. It also declares modifiable global variables, * which are defined in one source file (typically the main sketch). Additionally, * inline functions are provided to dynamically build MQTT topics based on the current * configuration. * * Author: James C. Alexander * Date: 2025-02-03 */ #ifndef CONFIG_H #define CONFIG_H #include #include #include // --------------------------------------------------------------------- // Global Default Values // --------------------------------------------------------------------- #define DEFAULT_SSID "" ///< Default WiFi SSID. #define DEFAULT_WIFI_PASSWORD "" ///< Default WiFi password. #define DEFAULT_MQTT_HOST "000.000.000.000" ///< Default MQTT broker host. #define DEFAULT_MQTT_PORT 1883 ///< Default MQTT broker port. #define DEFAULT_MQTT_USERNAME "" ///< Default MQTT username (empty if not used). #define DEFAULT_MQTT_PASSWORD "" ///< Default MQTT password (empty if not used). #define DEFAULT_MQTT_TOPIC_ROOT "GroPro" ///< Default MQTT topic root. #define DEFAULT_PUBLISH_INTERVAL 2500 ///< Default publish interval in milliseconds. #define DEFAULT_WIFI_RECONNECT_INTERVAL 5000 ///< Default WiFi reconnect interval in milliseconds. #define DEFAULT_MQTT_RECONNECT_INTERVAL 5000 ///< Default MQTT reconnect interval in milliseconds. #define DEFAULT_MIXER_LEVEL_SETPOINT 50.0 ///< Default mixer tank refill setpoint (cm). #define DEFAULT_FEEDER_LEVEL_SETPOINT 10.0 ///< Default feeder tank refill setpoint (cm). #define DEFAULT_MIXER_FULL_LEVEL 80.0 ///< Default mixer tank full level (cm). #define DEFAULT_MIXER_REFILL_LEVEL 40.0 ///< Default mixer tank refill level (cm). #define DEFAULT_PH_SETTLING_TIME 5.0 ///< Default delay after mixing before checking pH (seconds). #define DEFAULT_PH_TARGET_MAX 6.5 ///< Default maximum acceptable pH. #define DEFAULT_PH_PUMP_DURATION 3.0 ///< Default duration to run the pH pump (seconds). #define DEFAULT_MIXING_PUMP_DURATION 10.0 ///< Default duration to run the mixing pump (seconds). // --------------------------------------------------------------------- // Watering Modes and Per-Plant Watering Configuration // --------------------------------------------------------------------- /** * @enum WateringMode * @brief Defines the various watering modes. */ enum WateringMode { SEEDLING_MODE = 0, VEGETATIVE_MODE = 1, FLOWERING_MODE = 2, DRYING_MODE = 3 }; /** * @struct WateringSetpoints * @brief Holds the soil moisture setpoints for a specific watering mode. */ struct WateringSetpoints { float soilMoistureLow; ///< Low threshold for soil moisture. float soilMoistureHigh; ///< High threshold for soil moisture. }; /** * @struct PlantWateringConfig * @brief Holds the complete watering configuration for a single plant. */ struct PlantWateringConfig { WateringSetpoints setpoints[4]; ///< Setpoints for each watering mode. uint8_t currentMode; ///< Active watering mode index (0-3). }; /** * @brief Default watering configurations for three plants. */ const PlantWateringConfig DEFAULT_PLANT_CONFIGS[3] = { { { {60, 80}, {40, 70}, {30, 60}, {20, 40} }, VEGETATIVE_MODE }, { { {60, 80}, {40, 70}, {30, 60}, {20, 40} }, VEGETATIVE_MODE }, { { {60, 80}, {40, 70}, {30, 60}, {20, 40} }, VEGETATIVE_MODE } }; // --------------------------------------------------------------------- // WiFi Configuration // --------------------------------------------------------------------- /** * @brief Modifiable WiFi configuration buffers. */ extern char ssid[32]; ///< WiFi SSID. extern char password[64]; ///< WiFi password. // --------------------------------------------------------------------- // MQTT Configuration // --------------------------------------------------------------------- /** * @brief Modifiable MQTT broker settings. */ extern char mqtt_host[64]; ///< MQTT broker host. extern uint16_t mqtt_port; ///< MQTT broker port. extern char mqtt_username[32]; ///< MQTT username. extern char mqtt_password[32]; ///< MQTT password. extern char mqtt_topic_root[32]; ///< MQTT topic root. // --------------------------------------------------------------------- // Inline Functions for Dynamic Topic Construction // --------------------------------------------------------------------- inline String getMqttConfigTopic() { return String(mqtt_topic_root) + "/config"; } inline String getMqttPublishIntervalTopic() { return String(mqtt_topic_root) + "/config/pubInt"; } inline String getMqttWifiReconnectTopic() { return String(mqtt_topic_root) + "/config/wifInt"; } inline String getMqttMqttReconnectTopic() { return String(mqtt_topic_root) + "/config/mqtInt"; } inline String getMqttMixerLevelSetpointTopic() { return String(mqtt_topic_root) + "/config/mixSet"; } inline String getMqttFeederLevelSetpointTopic() { return String(mqtt_topic_root) + "/config/feeSet"; } inline String getMqttBypassFillInterlockTopic() { return String(mqtt_topic_root) + "/config/bypass"; } inline String getMqttWateringModeTopic(uint8_t plantIndex) { return String(mqtt_topic_root) + "/config/plant" + String(plantIndex + 1) + "/wMode"; } inline String getMqttSoilMoistureLowTopic(uint8_t plantIndex) { return String(mqtt_topic_root) + "/config/plant" + String(plantIndex + 1) + "/sLow"; } inline String getMqttSoilMoistureHighTopic(uint8_t plantIndex) { return String(mqtt_topic_root) + "/config/plant" + String(plantIndex + 1) + "/sHigh"; } inline String getAmbientTempTopic() { return String(mqtt_topic_root) + "/climate/temp"; } inline String getAmbientHumidityTopic() { return String(mqtt_topic_root) + "/climate/hum"; } inline String getPhTopic() { return String(mqtt_topic_root) + "/mixing/ph"; } inline String getTdsTopic() { return String(mqtt_topic_root) + "/mixing/tds"; } inline String getPhotoTopic() { return String(mqtt_topic_root) + "/lighting/photo"; } inline String getFeederLevelTopic() { return String(mqtt_topic_root) + "/tank/feeder"; } inline String getMixerLevelTopic() { return String(mqtt_topic_root) + "/tank/mixer"; } // --------------------------------------------------------------------- // Global Configuration Variables (Stored in EEPROM) // --------------------------------------------------------------------- extern unsigned long publishInterval; extern unsigned long wifiReconnectInterval; extern unsigned long mqttReconnectInterval; extern float mixerLevelSetpoint; extern float feederLevelSetpoint; // --------------------------------------------------------------------- // Additional Global Configuration Variables // --------------------------------------------------------------------- extern float mixerFullLevel; extern float mixerRefillLevel; extern float phSettlingTime; extern float phTargetMax; extern float phPumpDuration; extern float mixingPumpDuration; // --------------------------------------------------------------------- // Auto Mode and Interlock Flags // --------------------------------------------------------------------- extern bool autoMode; extern bool bypassFillInterlock; // --------------------------------------------------------------------- // Tank Level Sensor Readings // --------------------------------------------------------------------- extern float mixerLevel; extern float feederLevel; // --------------------------------------------------------------------- // Per-Plant Watering Configuration Variables // --------------------------------------------------------------------- extern PlantWateringConfig plantConfigs[3]; // --------------------------------------------------------------------- // New Global Variable for Relay Logic // --------------------------------------------------------------------- /** * @brief Relay activation logic flag. * false: relays are active-low (default) * true: relays are active-high. */ extern bool relayActiveHigh; #endif // CONFIG_H