//#include "esp_sleep.h" // Comment this line for testing without deep sleep
#define MOISTURE_SENSOR_PIN 34 // Pin for soil moisture sensor
#define TRIG_PIN 26 // Pin for ultrasonic sensor trigger
#define ECHO_PIN 27 // Pin for ultrasonic sensor echo
#define RELAY_PIN 25 // Pin for relay controlling the water pump
#define LED_MOISTURE_PIN 32 // Pin for low soil moisture LED
#define LED_WATER_PIN 33 // Pin for low water level LED
#define WATER_LEVEL_THRESHOLD 20 // cm (threshold for minimum water level, below 7L)
#define MOISTURE_THRESHOLD_LOW 400 // Soil moisture threshold (below this, it's considered low moisture)
#define MOISTURE_THRESHOLD_HIGH 600 // Soil moisture threshold (above this, it's considered high moisture)
// Define the time for deep sleep in microseconds (10 minutes = 600,000,000 microseconds)
// #define DEEP_SLEEP_TIME 600000000 // 10 minutes (Comment out for testing without deep sleep)
void setup() {
// Initialize Serial communication
Serial.begin(115200); // Set baud rate to 115200
// Print a message to indicate the device is starting
Serial.println("Starting up...");
// Set pin modes as INPUT/OUTPUT
pinMode(MOISTURE_SENSOR_PIN, INPUT); // Pin for soil moisture sensor
pinMode(TRIG_PIN, OUTPUT); // Pin for ultrasonic sensor trigger
pinMode(ECHO_PIN, INPUT); // Pin for ultrasonic sensor echo
pinMode(RELAY_PIN, OUTPUT); // Pin for relay
pinMode(LED_MOISTURE_PIN, OUTPUT); // Pin for low soil moisture LED
pinMode(LED_WATER_PIN, OUTPUT); // Pin for low water level LED
// Reading values from sensors
int moistureValue = analogRead(MOISTURE_SENSOR_PIN); // Soil moisture reading (analog value)
// Read value from ultrasonic sensor (measuring distance)
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
int distance = (duration * 0.0343) / 2; // Distance in cm
// Display values from soil moisture sensor and water level (distance) on Serial Monitor
Serial.print("Soil Moisture: ");
Serial.print(moistureValue);
Serial.println(" (analog value)");
Serial.print("Water Surface Distance: ");
Serial.print(distance);
Serial.println(" cm");
// LED and Pump Control for Soil Moisture
if (moistureValue < MOISTURE_THRESHOLD_LOW) {
// Soil is too dry (below 40%)
Serial.println("Low soil moisture! Pump will be turned on.");
digitalWrite(RELAY_PIN, HIGH); // Turn on the water pump
digitalWrite(LED_MOISTURE_PIN, HIGH); // Turn on low moisture LED
} else if (moistureValue > MOISTURE_THRESHOLD_HIGH) {
// Soil is too wet (above 60%)
Serial.println("Soil moisture is too high. Pump is off.");
digitalWrite(RELAY_PIN, LOW); // Turn off the water pump
digitalWrite(LED_MOISTURE_PIN, LOW); // Turn off low moisture LED
} else {
// Soil moisture is in optimal range (between 40% and 60%)
digitalWrite(RELAY_PIN, LOW); // Turn off the water pump
digitalWrite(LED_MOISTURE_PIN, LOW); // Turn off low moisture LED
}
// LED and Pump Control for Water Level
if (distance <= WATER_LEVEL_THRESHOLD) {
// Water level too low
Serial.println("Water level too low! Pump will be turned on.");
digitalWrite(RELAY_PIN, HIGH); // Turn on the water pump
digitalWrite(LED_WATER_PIN, HIGH); // Turn on low water level LED
} else {
digitalWrite(RELAY_PIN, LOW); // Turn off the water pump
digitalWrite(LED_WATER_PIN, LOW); // Turn off low water level LED
}
// Now enter deep sleep for 10 minutes (comment out this line for testing)
// Serial.println("Entering deep sleep mode for 10 minutes...");
// esp_deep_sleep(DEEP_SLEEP_TIME); // Sleep time in microseconds
}
void loop() {
// The loop is empty as we are using deep sleep.
// The ESP32 will restart when it wakes up after deep sleep.
}