CCCPaste

config online water system

/*
 * ===============================================================================
 * ESP32 SMART FARMING SYSTEM - ONLINE VERSION CONFIGURATION
 * ===============================================================================
 * 
 * This file contains all configuration settings for your IoT-enabled smart farming system.
 * Follow the step-by-step guide below to configure your system properly.
 * 
 * QUICK START GUIDE:
 * 1. Choose your setup type in STEP 1 (Basic/Standard/IoT/Professional)
 * 2. Configure your hardware connections in STEP 2
 * 3. Set up WiFi and IoT services in STEP 3
 * 4. Adjust irrigation settings in STEP 4
 * 5. Upload the code to your ESP32
 * 
 * Author: Azzar Budiyanto
 * Version: 1.8.0
 * Date: 2024
 * ===============================================================================
 */

#ifndef CONFIG_H
#define CONFIG_H

// ===============================================================================
// STEP 1: CHOOSE YOUR SETUP TYPE (Select ONE)
// ===============================================================================

/*
 * Uncomment ONE of the following setup types based on your requirements:
 * 
 * BASIC_ONLINE:       Soil moisture sensor + WiFi + basic web interface
 * STANDARD_ONLINE:    Basic + DHT22 + LCD 1602 display + cloud logging
 * IOT_MONITORING:     Standard + ThingSpeak/Adafruit IO + remote control
 * POTENTIOMETER_IOT:  IoT + potentiometer control + advanced monitoring
 * PROFESSIONAL_IOT:   All sensors + LCD 2004 + rotary encoder + full IoT
 * CUSTOM_ONLINE:      Configure everything manually below
 */

// #define BASIC_ONLINE
// #define STANDARD_ONLINE  
// #define IOT_MONITORING
// #define POTENTIOMETER_IOT
// #define PROFESSIONAL_IOT
#define CUSTOM_ONLINE

// ===============================================================================
// STEP 2: HARDWARE PIN CONFIGURATION
// ===============================================================================

/*
 * ESP32 Pin Connection Diagram for Online Version:
 * 
 *    ESP32 Dev Board
 *    ┌─────────────────┐
 *    │  3.3V  ●    ●   │ VIN
 *    │   GND  ●    ●   │ GND  
 *    │  GPIO2 ●    ●   │ GPIO4  <- Encoder Button (Professional)
 *    │  GPIO5 ●    ●   │ GPIO16 <- Encoder CLK (Professional)
 *    │ GPIO18 ●    ●   │ GPIO17 <- Encoder DT (Professional)
 *    │ GPIO19 ●    ●   │ GPIO21 <- LCD SDA
 *    │ GPIO21 ●    ●   │ GPIO22 <- LCD SCL
 *    │ GPIO22 ●    ●   │ GPIO23 <- LED Red (Pump)
 *    │ GPIO23 ●    ●   │ GPIO34 <- Potentiometer
 *    │ GPIO36 ●    ●   │ GPIO39 <- LDR Sensor
 *    └─────────────────┘
 *    
 * Required Connections:
 * - Soil Moisture Sensor → GPIO36 (always required)
 * - Water Pump Relay     → GPIO19 (always required) 
 * - Green Status LED     → GPIO18 (system status)
 * - Red Pump LED         → GPIO23 (pump active)
 * - Blue WiFi LED        → GPIO2  (WiFi connected)
 * 
 * Optional Connections (based on your setup):
 * - DHT22 Sensor         → GPIO5
 * - LCD Display SDA      → GPIO21
 * - LCD Display SCL      → GPIO22
 * - Potentiometer        → GPIO34
 * - LDR Light Sensor     → GPIO39
 * - Rotary Encoder CLK   → GPIO16
 * - Rotary Encoder DT    → GPIO17
 * - Rotary Encoder SW    → GPIO4
 */

// Essential Hardware Pins (DO NOT CHANGE unless you know what you're doing)
#define SOIL_MOISTURE_PIN 36        // Soil moisture sensor (ADC1_CH0)
#define RELAY_PIN 19               // Water pump relay control
#define LED_GREEN_PIN 18           // System status LED (green = OK)
#define LED_RED_PIN 23             // Pump status LED (red = pumping)
#define LED_BLUE_PIN 2             // WiFi status LED (blue = connected)

// Sensor Pins (change if needed)
#define DHT_PIN 5                  // DHT22/DHT11 temperature/humidity sensor
#define LDR_PIN 39                 // LDR light sensor (ADC1_CH3)

// Display Pins (I2C LCD)
#define LCD_SDA_PIN 21             // LCD data line
#define LCD_SCL_PIN 22             // LCD clock line
#define LCD_ADDRESS 0x27           // LCD I2C address (try 0x3F if 0x27 doesn't work)

// Control Pins
#define POTENTIOMETER_PIN 34       // Potentiometer for threshold control (ADC1_CH6)
#define ENCODER_CLK_PIN 16         // Rotary encoder clock
#define ENCODER_DT_PIN 17          // Rotary encoder data
#define ENCODER_SW_PIN 4           // Rotary encoder switch/button

// ===============================================================================
// STEP 3: WIFI AND IOT SETUP (IMPORTANT!)
// ===============================================================================

/*
 * WIFI CONFIGURATION:
 * Replace "YOUR_WIFI_SSID" and "YOUR_WIFI_PASSWORD" with your actual WiFi credentials
 */
#define WIFI_SSID "YOUR_WIFI_SSID"
#define WIFI_PASSWORD "YOUR_WIFI_PASSWORD"

/*
 * IOT PLATFORM SETUP:
 * Choose your preferred IoT platform(s) for remote monitoring:
 * 
 * THINGSPEAK (Free):
 * 1. Create account at https://thingspeak.com
 * 2. Create a new channel with fields: Temperature, Humidity, Soil Moisture, Light Level, Pump Status
 * 3. Copy your Channel ID and Write API Key below
 * 
 * ADAFRUIT IO (Free tier available):
 * 1. Create account at https://io.adafruit.com
 * 2. Get your username and AIO Key from account settings
 * 3. Create feeds: temperature, humidity, soil-moisture, light-level, pump-status
 */

// ThingSpeak Configuration (replace with your actual values)
#define THINGSPEAK_API_KEY "YOUR_THINGSPEAK_API_KEY"        // Your Write API Key
#define THINGSPEAK_CHANNEL_ID "YOUR_CHANNEL_ID"             // Your Channel ID

// Adafruit IO Configuration (replace with your actual values)
#define ADAFRUIT_IO_USERNAME "YOUR_ADAFRUIT_IO_USERNAME"    // Your Adafruit IO username
#define ADAFRUIT_IO_KEY "YOUR_ADAFRUIT_IO_KEY"              // Your AIO Key

// Web Interface Credentials (change these for security!)
#define WEB_USERNAME "admin"
#define WEB_PASSWORD "smartfarm123"

// OTA Update Settings (for wireless firmware updates)
#define OTA_HOSTNAME "smart-farming-esp32"
#define OTA_PASSWORD "your_ota_password"

// ===============================================================================
// STEP 4: IRRIGATION SETTINGS (IMPORTANT!)
// ===============================================================================

/*
 * SOIL MOISTURE THRESHOLD:
 * - Lower value = drier soil before watering (5-15% for succulents)
 * - Higher value = moister soil before watering (30-50% for vegetables)
 * 
 * Common Values:
 * - Succulents/Cacti:     10-15%
 * - Herbs:                20-25%
 * - Vegetables:           30-40%
 * - Tropical Plants:      40-50%
 */
#define SOIL_MOISTURE_THRESHOLD 30    // When to start watering (0-100%)

/*
 * IRRIGATION TIMING:
 * - IRRIGATION_DURATION: How long to run the pump (milliseconds)
 * - IRRIGATION_COOLDOWN: Minimum time between waterings (milliseconds)
 * 
 * Recommended Values:
 * - Small plants: 3-5 seconds (3000-5000 ms)
 * - Large plants: 10-15 seconds (10000-15000 ms)
 * - Cooldown: 5-30 minutes (300000-1800000 ms)
 */
#define IRRIGATION_DURATION 5000      // Pump runtime per irrigation (5 seconds)
#define IRRIGATION_COOLDOWN 300000    // Wait time between irrigations (5 minutes)
#define MAX_DAILY_IRRIGATIONS 10     // Maximum waterings per day (safety limit)

// ===============================================================================
// AUTOMATIC CONFIGURATION BASED ON SETUP TYPE
// ===============================================================================

#ifdef BASIC_ONLINE
  // Basic online: Soil sensor + WiFi + basic web interface
  #define DHT_SENSOR_TYPE DHT_NONE
  #define LDR_SENSOR_TYPE LDR_NONE
  #define DISPLAY_TYPE DISPLAY_NONE
  #define CONTROL_TYPE CONTROL_NONE
  #define IOT_SERVICES_ENABLED false
  #define THINGSPEAK_ENABLED false
  #define ADAFRUIT_IO_ENABLED false
  #define WEB_UI_ONLY_MODE true
  #define SERIAL_OUTPUT_ENABLED true
  #define DEBUG_MODE false
  
#elif defined(STANDARD_ONLINE)
  // Standard online: Basic + DHT22 + LCD 1602 + cloud logging
  #define DHT_SENSOR_TYPE DHT_TYPE_22
  #define LDR_SENSOR_TYPE LDR_NONE
  #define DISPLAY_TYPE DISPLAY_LCD_1602
  #define CONTROL_TYPE CONTROL_NONE
  #define IOT_SERVICES_ENABLED true
  #define THINGSPEAK_ENABLED true
  #define ADAFRUIT_IO_ENABLED false
  #define WEB_UI_ONLY_MODE false
  #define SERIAL_OUTPUT_ENABLED true
  #define DEBUG_MODE false
  
#elif defined(IOT_MONITORING)
  // IoT monitoring: Standard + ThingSpeak + Adafruit IO + remote control
  #define DHT_SENSOR_TYPE DHT_TYPE_22
  #define LDR_SENSOR_TYPE LDR_TYPE_ENABLED
  #define DISPLAY_TYPE DISPLAY_LCD_1602
  #define CONTROL_TYPE CONTROL_NONE
  #define IOT_SERVICES_ENABLED true
  #define THINGSPEAK_ENABLED true
  #define ADAFRUIT_IO_ENABLED true
  #define WEB_UI_ONLY_MODE false
  #define SERIAL_OUTPUT_ENABLED true
  #define DEBUG_MODE false
  
#elif defined(POTENTIOMETER_IOT)
  // Potentiometer IoT: IoT monitoring + potentiometer control
  #define DHT_SENSOR_TYPE DHT_TYPE_22
  #define LDR_SENSOR_TYPE LDR_NONE
  #define DISPLAY_TYPE DISPLAY_LCD_1602
  #define CONTROL_TYPE CONTROL_POTENTIOMETER
  #define IOT_SERVICES_ENABLED true
  #define THINGSPEAK_ENABLED true
  #define ADAFRUIT_IO_ENABLED false
  #define WEB_UI_ONLY_MODE false
  #define SERIAL_OUTPUT_ENABLED true
  #define DEBUG_MODE true
  
#elif defined(PROFESSIONAL_IOT)
  // Professional IoT: All sensors + LCD 2004 + rotary encoder + full IoT
  #define DHT_SENSOR_TYPE DHT_TYPE_22
  #define LDR_SENSOR_TYPE LDR_TYPE_ENABLED
  #define DISPLAY_TYPE DISPLAY_LCD_2004
  #define CONTROL_TYPE CONTROL_ROTARY_ENCODER
  #define IOT_SERVICES_ENABLED true
  #define THINGSPEAK_ENABLED true
  #define ADAFRUIT_IO_ENABLED true
  #define WEB_UI_ONLY_MODE false
  #define SERIAL_OUTPUT_ENABLED true
  #define DEBUG_MODE true
  
#elif defined(CUSTOM_ONLINE)
  // Custom online: Configure everything manually below
  #define DHT_SENSOR_TYPE DHT_TYPE_11        // DHT_NONE, DHT_TYPE_11, DHT_TYPE_22
  #define LDR_SENSOR_TYPE LDR_NONE           // LDR_NONE, LDR_TYPE_ENABLED
  #define DISPLAY_TYPE DISPLAY_LCD_1602      // DISPLAY_NONE, DISPLAY_LCD_1602, DISPLAY_LCD_2004
  #define CONTROL_TYPE CONTROL_POTENTIOMETER // CONTROL_NONE, CONTROL_POTENTIOMETER, CONTROL_ROTARY_ENCODER
  #define IOT_SERVICES_ENABLED true          // true = enable IoT services, false = web UI only
  #define THINGSPEAK_ENABLED false            // true = enable ThingSpeak, false = disable
  #define ADAFRUIT_IO_ENABLED true          // true = enable Adafruit IO, false = disable
  #define WEB_UI_ONLY_MODE false             // true = web UI only, false = full IoT
  #define SERIAL_OUTPUT_ENABLED true         // true = enable serial output, false = disable
  #define DEBUG_MODE false                   // true = detailed debug info, false = basic info
  
#else
  #error "Please select a setup type in STEP 1 above!"
#endif

// ===============================================================================
// SENSOR TYPE DEFINITIONS (DO NOT MODIFY)
// ===============================================================================

// DHT Sensor Types
#define DHT_NONE 0
#define DHT_TYPE_11 1
#define DHT_TYPE_22 2

// LDR Sensor Types  
#define LDR_NONE 0
#define LDR_TYPE_ENABLED 1

// Display Types
#define DISPLAY_NONE 0
#define DISPLAY_LCD_1602 1
#define DISPLAY_LCD_2004 2

// Control Types
#define CONTROL_NONE 0
#define CONTROL_POTENTIOMETER 1
#define CONTROL_ROTARY_ENCODER 2

// ===============================================================================
// SENSOR CONFIGURATION (AUTOMATIC)
// ===============================================================================

// DHT Sensor Configuration
#if DHT_SENSOR_TYPE == DHT_TYPE_11
  #define DHT_TYPE DHT11
#elif DHT_SENSOR_TYPE == DHT_TYPE_22
  #define DHT_TYPE DHT22
#else
  #define DHT_TYPE 0  // Not used
#endif

// Sensor Feature Flags
#define DHT_ENABLED (DHT_SENSOR_TYPE != DHT_NONE)
#define LDR_ENABLED (LDR_SENSOR_TYPE != LDR_NONE)
#define TEMPERATURE_MONITORING_ENABLED DHT_ENABLED
#define HUMIDITY_MONITORING_ENABLED DHT_ENABLED
#define LIGHT_MONITORING_ENABLED LDR_ENABLED

// ===============================================================================
// DISPLAY CONFIGURATION (AUTOMATIC)
// ===============================================================================

// Display-specific Configuration
#if DISPLAY_TYPE == DISPLAY_LCD_1602
  #define LCD_COLS 16
  #define LCD_ROWS 2
  #define DISPLAY_SCREEN_COUNT 3        // Number of screens to cycle through
#elif DISPLAY_TYPE == DISPLAY_LCD_2004
  #define LCD_COLS 20
  #define LCD_ROWS 4
  #define DISPLAY_SCREEN_COUNT 1        // Single screen with all info
#else
  #define LCD_COLS 0
  #define LCD_ROWS 0
  #define DISPLAY_SCREEN_COUNT 0
#endif

// Display Feature Flags
#define DISPLAY_ENABLED (DISPLAY_TYPE != DISPLAY_NONE)
#define DISPLAY_CYCLING_ENABLED (DISPLAY_TYPE == DISPLAY_LCD_1602)

// Display Timing
#define DISPLAY_UPDATE_INTERVAL 1000    // How often to update display (ms)
#define DISPLAY_SCROLL_DELAY 2000       // Time between screens on LCD 1602 (ms)

// ===============================================================================
// CONTROL SYSTEM CONFIGURATION (AUTOMATIC)
// ===============================================================================

// Control Feature Flags
#define CONTROL_ENABLED (CONTROL_TYPE != CONTROL_NONE)
#define MENU_SYSTEM_ENABLED (CONTROL_TYPE == CONTROL_ROTARY_ENCODER)
#define REAL_TIME_CONTROL_ENABLED (CONTROL_TYPE == CONTROL_POTENTIOMETER)

// Potentiometer Settings (when CONTROL_POTENTIOMETER is selected)
#if CONTROL_TYPE == CONTROL_POTENTIOMETER
  #define POTENTIOMETER_UPDATE_INTERVAL 100    // How often to read potentiometer (ms)
  #define POTENTIOMETER_SMOOTHING_SAMPLES 5    // Number of readings to average
  #define POTENTIOMETER_HYSTERESIS 2           // Prevent jittery switching (%)
  #define POTENTIOMETER_DEADBAND 50            // Ignore small ADC fluctuations
  #define POTENTIOMETER_MIN_THRESHOLD 5        // Minimum threshold setting (%)
  #define POTENTIOMETER_MAX_THRESHOLD 50       // Maximum threshold setting (%)
#endif

// Rotary Encoder Settings (when CONTROL_ROTARY_ENCODER is selected)
#if CONTROL_TYPE == CONTROL_ROTARY_ENCODER
  #define ENCODER_DEBOUNCE_TIME 50      // Button debounce time (ms)
  #define ENCODER_STEP_SIZE 1           // Threshold adjustment step size
  #define MENU_TIMEOUT 30000            // Menu timeout (ms)
  #define MENU_ITEMS 5                  // Number of menu items
#endif

// ===============================================================================
// WIFI AND CONNECTIVITY CONFIGURATION
// ===============================================================================

// WiFi Connection Settings
#define WIFI_TIMEOUT 10000              // WiFi connection timeout (ms)
#define WIFI_RECONNECT_INTERVAL 30000   // WiFi reconnection interval (ms)
#define WIFI_MAX_RETRIES 3              // Maximum WiFi connection retries

// Web Server Configuration
#define WEB_SERVER_PORT 80              // Web server port (80 = standard HTTP)
#define WEB_SERVER_TIMEOUT 5000         // Web server request timeout (ms)
#define ENABLE_WEB_AUTH true            // Enable web interface authentication

// IoT Services Override (when WEB_UI_ONLY_MODE is true)
#if WEB_UI_ONLY_MODE
  #undef IOT_SERVICES_ENABLED
  #undef THINGSPEAK_ENABLED
  #undef ADAFRUIT_IO_ENABLED
  #define IOT_SERVICES_ENABLED false
  #define THINGSPEAK_ENABLED false
  #define ADAFRUIT_IO_ENABLED false
#endif

// ===============================================================================
// IOT PLATFORM CONFIGURATION
// ===============================================================================

// ThingSpeak Settings
#if THINGSPEAK_ENABLED
  #define THINGSPEAK_UPDATE_INTERVAL 60000  // Data upload interval (1 minute)
  #define THINGSPEAK_MAX_RETRIES 3          // Maximum upload retries
  #define THINGSPEAK_TIMEOUT 10000          // Upload timeout (ms)
#endif

// Adafruit IO Settings
#if ADAFRUIT_IO_ENABLED
  #define ADAFRUIT_IO_UPDATE_INTERVAL 60000 // Data upload interval (1 minute)
  #define ADAFRUIT_IO_MAX_RETRIES 3         // Maximum upload retries
  #define ADAFRUIT_IO_TIMEOUT 10000         // Upload timeout (ms)
  
  // Adafruit IO Feed Names (customize if needed)
  #define ADAFRUIT_IO_TEMPERATURE_FEED "temperature"
  #define ADAFRUIT_IO_HUMIDITY_FEED "humidity"
  #define ADAFRUIT_IO_SOIL_MOISTURE_FEED "soil-moisture"
  #define ADAFRUIT_IO_LIGHT_LEVEL_FEED "light-level"
  #define ADAFRUIT_IO_PUMP_STATUS_FEED "pump-status"
  #define ADAFRUIT_IO_IRRIGATION_COUNT_FEED "irrigation-count"
#endif

// ===============================================================================
// SENSOR CALIBRATION AND VALIDATION
// ===============================================================================

/*
 * SOIL MOISTURE SENSOR CALIBRATION:
 * 
 * To calibrate your soil moisture sensor:
 * 1. Put sensor in dry air → note the value → set as SOIL_MOISTURE_DRY_VALUE
 * 2. Put sensor in water → note the value → set as SOIL_MOISTURE_WET_VALUE
 * 
 * Default values work for most capacitive sensors:
 * - Dry (in air): 4095 (maximum ADC value)
 * - Wet (in water): 0-500 (very low ADC value)
 */
#define SOIL_MOISTURE_DRY_VALUE 4095    // Sensor reading when completely dry
#define SOIL_MOISTURE_WET_VALUE 0       // Sensor reading when completely wet

// DHT Sensor Settings
#define DHT_READ_INTERVAL 2000          // Minimum time between DHT readings (ms)

// LDR Sensor Calibration (if enabled)
#define LDR_DARK_VALUE 4095             // Sensor reading in complete darkness
#define LDR_BRIGHT_VALUE 0              // Sensor reading in bright light
#define LDR_READ_INTERVAL 1000          // Time between LDR readings (ms)
#define LDR_LOW_LIGHT_THRESHOLD 20      // Percentage threshold for low light detection (0-100%)
#define LDR_HIGH_LIGHT_THRESHOLD 80     // Percentage threshold for high light detection (0-100%)

// Sensor Validation Ranges (for error detection)
#define MIN_TEMPERATURE -10.0           // Minimum valid temperature (°C)
#define MAX_TEMPERATURE 60.0            // Maximum valid temperature (°C)
#define MIN_HUMIDITY 0.0                // Minimum valid humidity (%)
#define MAX_HUMIDITY 100.0              // Maximum valid humidity (%)
#define MIN_SOIL_MOISTURE 0             // Minimum valid soil moisture (%)
#define MAX_SOIL_MOISTURE 100           // Maximum valid soil moisture (%)
#define MIN_LIGHT_LEVEL 0               // Minimum valid light level (%)
#define MAX_LIGHT_LEVEL 100             // Maximum valid light level (%)

// Sensor Validation Settings
#define TEMPERATURE_VALIDATION true     // Enable temperature range checking
#define HUMIDITY_VALIDATION true        // Enable humidity range checking
#define SOIL_MOISTURE_VALIDATION true   // Enable soil moisture range checking
#define LIGHT_VALIDATION true           // Enable light level range checking
#define MAX_SOIL_MOISTURE_CHANGE 20     // Maximum change between readings (%)
#define MAX_LIGHT_CHANGE 30             // Maximum light change between readings (%)

// Sensor Consistency Checking
#define SENSOR_CONSISTENCY_CHECKS 3     // Number of readings to compare
#define SENSOR_CONSISTENCY_THRESHOLD 5  // Maximum deviation for consistency
#define CONSISTENCY_VALIDATION true     // Enable consistency checking

// ===============================================================================
// SYSTEM BEHAVIOR AND TIMING
// ===============================================================================

// Main System Timing
#define SENSOR_READ_INTERVAL 5000       // How often to read all sensors (ms)
#define STATUS_CHECK_INTERVAL 1000      // How often to check system status (ms)
#define HEARTBEAT_INTERVAL 60000        // System heartbeat message interval (ms)

// Error Handling
#define MAX_SENSOR_ERRORS 5             // Max consecutive sensor errors before alert
#define SENSOR_ERROR_TIMEOUT 10000      // Timeout for sensor error recovery (ms)

// Serial Communication
#define SERIAL_BAUD_RATE 115200         // Serial monitor baud rate

// ===============================================================================
// DATA LOGGING AND TRANSMISSION
// ===============================================================================

// Local Data Logging
#define LOG_BUFFER_SIZE 50              // Number of readings to store in memory
#define LOG_INTERVAL 300000             // Data logging interval (5 minutes)

// Data Transmission
#define DATA_TRANSMISSION_INTERVAL 300000  // Data transmission interval (5 minutes)
#define MAX_TRANSMISSION_RETRIES 3       // Maximum retries for data transmission

// Memory Management
#define MEMORY_CHECK_INTERVAL 300000    // Memory usage check interval (ms)
#define SYSTEM_STARTUP_DELAY 2000       // Startup delay for sensor stabilization (ms)

// ===============================================================================
// SAFETY AND PROTECTION FEATURES
// ===============================================================================

/*
 * SAFETY FEATURES:
 * These features protect your system and plants from damage.
 * It's recommended to keep these enabled unless you have a specific reason.
 */

// Watchdog Timer (prevents system freezing)
#define WATCHDOG_ENABLED true           // Enable automatic system restart if frozen
#define WATCHDOG_TIMEOUT 30             // Watchdog timeout in seconds

// Pump Protection (prevents pump damage)
#define PUMP_RUNTIME_PROTECTION true    // Enable maximum pump runtime protection
#define MAX_PUMP_RUNTIME 300000         // Maximum continuous pump runtime (5 minutes)

// Emergency Stop (manual system shutdown)
#define EMERGENCY_STOP_ENABLED true     // Enable emergency stop functionality
#define EMERGENCY_STOP_PIN 0            // GPIO pin for emergency stop button (optional)

// Automatic Recovery (self-healing system)
#define AUTO_RECOVERY_ENABLED true      // Enable automatic error recovery
#define RECOVERY_ATTEMPTS 3             // Maximum recovery attempts
#define RECOVERY_DELAY 5000             // Delay between recovery attempts (ms)

// Sensor Disconnection Detection
#define DISCONNECT_DETECTION true       // Enable sensor disconnection detection
#define SENSOR_DISCONNECT_THRESHOLD 10  // Readings before marking sensor disconnected

// Network Safety
#define WIFI_WATCHDOG_ENABLED true      // Enable WiFi connection monitoring
#define WIFI_RECOVERY_ENABLED true      // Enable automatic WiFi reconnection
#define IOT_ERROR_RECOVERY true         // Enable IoT service error recovery

// ===============================================================================
// ADVANCED SETTINGS (FOR EXPERIENCED USERS ONLY)
// ===============================================================================

/*
 * WARNING: Only modify these settings if you understand their impact!
 * Incorrect values may cause system instability or poor performance.
 */

// Power Management (experimental)
#define SLEEP_MODE_ENABLED false        // Enable deep sleep mode (saves power but disables WiFi)
#define SLEEP_DURATION 300000           // Sleep duration in milliseconds

// Manual Irrigation (for testing)
#define MANUAL_IRRIGATION_DURATION 10000  // Duration for manual irrigation (10 seconds)

// Parameter Adjustment (for rotary encoder)
#define PARAMETER_MIN_STEP 1            // Minimum parameter adjustment step
#define PARAMETER_MAX_STEP 10           // Maximum parameter adjustment step

// Network Performance
#define HTTP_TIMEOUT 10000              // HTTP request timeout (ms)
#define DNS_TIMEOUT 5000                // DNS resolution timeout (ms)
#define TCP_KEEPALIVE 60                // TCP keepalive interval (seconds)

// ===============================================================================
// CALCULATED VALUES (DO NOT MODIFY)
// ===============================================================================

// These values are automatically calculated based on your settings above
#define SOIL_MOISTURE_RANGE (SOIL_MOISTURE_DRY_VALUE - SOIL_MOISTURE_WET_VALUE)

// ===============================================================================
// VERSION INFORMATION
// ===============================================================================

#define FIRMWARE_VERSION "1.0.0"
#define HARDWARE_VERSION "1.0"
#define BUILD_DATE __DATE__
#define BUILD_TIME __TIME__

// ===============================================================================
// CONFIGURATION VALIDATION
// ===============================================================================

// Validate essential settings
#if !defined(SOIL_MOISTURE_THRESHOLD) || SOIL_MOISTURE_THRESHOLD < 0 || SOIL_MOISTURE_THRESHOLD > 100
  #error "SOIL_MOISTURE_THRESHOLD must be between 0 and 100!"
#endif

#if !defined(IRRIGATION_DURATION) || IRRIGATION_DURATION < 1000
  #error "IRRIGATION_DURATION must be at least 1000ms (1 second)!"
#endif

#if !defined(IRRIGATION_COOLDOWN) || IRRIGATION_COOLDOWN < 60000
  #warning "IRRIGATION_COOLDOWN is less than 1 minute. This may cause overwatering!"
#endif

// Validate WiFi settings
#if !defined(WIFI_SSID) || !defined(WIFI_PASSWORD)
  #error "Please configure WIFI_SSID and WIFI_PASSWORD!"
#endif

// ===============================================================================
// SETUP COMPLETE
// ===============================================================================

/*
 * CONGRATULATIONS! Your IoT smart farming system is now configured.
 * 
 * NEXT STEPS:
 * 1. Double-check your hardware connections match the pin assignments above
 * 2. Install required libraries (see LIBRARY_SETUP.md)
 * 3. Configure your WiFi credentials and IoT platform settings
 * 4. Upload this code to your ESP32
 * 5. Open Serial Monitor (115200 baud) to see system status
 * 6. Access web interface at http://[ESP32_IP_ADDRESS]
 * 7. Test your system with a small amount of water first!
 * 
 * WEB INTERFACE ACCESS:
 * - The ESP32 will display its IP address in the Serial Monitor
 * - Open a web browser and navigate to that IP address
 * - Use the configured username/password to log in
 * - Monitor your system and control irrigation remotely!
 * 
 * IOT PLATFORM ACCESS:
 * - ThingSpeak: https://thingspeak.com/channels/[YOUR_CHANNEL_ID]
 * - Adafruit IO: https://io.adafruit.com/[YOUR_USERNAME]/dashboards
 * 
 * TROUBLESHOOTING:
 * - If WiFi doesn't connect, check your SSID and password
 * - If sensors show invalid readings, check your wiring
 * - If pump doesn't activate, verify relay connections and power supply
 * - If LCD doesn't work, try changing LCD_ADDRESS from 0x27 to 0x3F
 * - If IoT uploads fail, verify your API keys and internet connection
 * - For more help, see the documentation or enable DEBUG_MODE
 * 
 * SAFETY REMINDER:
 * - Always test with small amounts of water first
 * - Monitor your system for the first few days
 * - Ensure proper drainage to prevent overwatering
 * - Use appropriate power supplies for your pump
 * - Keep your IoT credentials secure and change default passwords
 */

#endif // CONFIG_H