/*
* ===============================================================================
* 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