Automatic Plant Watering Project Using ESP32 Web Server
Automatic Plant Watering Project Using ESP32 Web Server
In modern agriculture and home gardening, automation is vital in ensuring plants receive the right amount of water without
human intervention. This automatic plant watering project using ESP32 web server is designed to monitor soil moisture,
temperature, and humidity while providing an automated watering mechanism. With an OLED display for real-time data
visualization and a web interface for remote control, this project makes plant care efficient and hassle-free.
So if you follow all the steps, you can easily make this automatic plant monitoring system using ESP32 and soil moisture
sensor.
Table of Contents
Required Components for Plant Watering Project
Circuit of ESP32 Plant Watering project
Tutorial video on Automatic Plant Watering System
Features
Working Principle
1. Automatic Mode
2. Manual Mode
PCB Layout for ESP32 Plant Monitoring System
Homemade PCB for DIY Plant Watering system
PCB for the Plant watering project
About PCBWay and their services
https://iotcircuithub.com/automatic-plant-watering-project-esp32-webserver/ 1/12
5/20/25, 5:28 PM Automatic Plant Watering Project using ESP32 Web Server
Source Codes for ESP32 Plant Monitoring System
Program ESP32 with Arduino IDE
Get Sensor reading for the DRY & WET soil
Here’s a line-by-line explanation of the code:
1. Importing Required Libraries
2. Defining Constants and Initializing Components
3. Setting Up WiFi (ESP32 as Access Point)
4. Moisture Sensor Calibration
5. Variables for System State
6. Web Page Handling
7. Moisture and Weather Data Collection
8. Automatic Pump Control
9. Loop Execution
Connect the Pump & Sensors with the PCB
Testing the DIY Plant Watering circuit
Applications
In the circuit, you have to give a stable 12V DC supply. The amps rating of the power supply will depend on the pump or
solenoid valve current rating.
A 7805 voltage regulator is used to provide the 5V supply to ESP32, and the 3.3V supply is given to the OLED and
capacitive moisture sensor from the ESP32 3.3V pin.
To control the pump we have used a TIP122 NPN transistor which is connected with the GPIO D25.
Please refer to the following table for the ESP32 GPIO used in this circuit.
ESP32 GPIOs Connected Sensors/Components
D34 Capacitive moisture sensor AOUT pin
D32 Push-Button to turn ON/OFF pump
D33 Push-Button for changing MODE.
D25 TIP122 base pin (controlling pump)
D26 BC547 base pin (controlling Buzzer)
D14 DHT11 sensor O/P pin
D15 LED indicator for MODE
D2 LED indicator for WiFi
D21 SDA of OLED
D22 SCL of OLED
If you want to use a 12V solenoid valve to control the water, then refer to the following circuit.
https://iotcircuithub.com/automatic-plant-watering-project-esp32-webserver/ 3/12
5/20/25, 5:28 PM Automatic Plant Watering Project using ESP32 Web Server
Features
Real-time Soil Moisture Monitoring: Ensures plants receive the right amount of water.
Temperature & Humidity Monitoring: Displays environmental data using a DHT11 sensor.
OLED Display: Provides a compact and clear visualization of sensor readings.
Web-Based Control Panel: Allows users to monitor and control the system remotely.
Buzzer Alerts: Notifies when soil moisture is critically low.
https://iotcircuithub.com/automatic-plant-watering-project-esp32-webserver/ 4/12
5/20/25, 5:28 PM Automatic Plant Watering Project using ESP32 Web Server
Automatic & Manual Modes: Users can choose between hands-free operation or manual control
Working Principle
This smart watering system works in two modes:
1. Automatic Mode
The soil moisture sensor continuously monitors soil conditions.
If the moisture level drops below the preset low threshold (e.g., 20%), the pump turns ON to supply water.
Once moisture reaches the high threshold (e.g., 80%), the pump turns OFF.
Temperature and humidity readings from the DHT11 sensor are displayed on the OLED screen.
Users can access real-time sensor data via a WiFi-enabled web interface.
2. Manual Mode
The user can manually turn the water pump ON or OFF using the web interface or a physical button.
The system provides buzzer alerts when soil moisture is too low.
The mode can be switched between automatic and manual via a button or web interface.
PCB Layout for ESP32 Plant Monitoring System
https://iotcircuithub.com/automatic-plant-watering-project-esp32-webserver/ 5/12
5/20/25, 5:28 PM Automatic Plant Watering Project using ESP32 Web Server
In the tutorial video, I have explained, how you can easily make the complete circuit on zero PCB using the PCB Layout.
PCB for the Plant watering project
You can also download the PCB Gerber file and order the PCB from PCBWay.
Download PCB Gerber
https://iotcircuithub.com/automatic-plant-watering-project-esp32-webserver/ 6/12
5/20/25, 5:28 PM Automatic Plant Watering Project using ESP32 Web Server
PCBWay not only produces FR-4 and Aluminum boards but also advanced PCBs like Rogers,
HDI, and Flexible and Rigid-Flex boards, at very affordable prices.
For the online instant quote page please visit – pcbway.com/orderonline
You can also explore different PCB projects from their Open-source community pcbway.com/project/.
https://iotcircuithub.com/automatic-plant-watering-project-esp32-webserver/ 7/12
5/20/25, 5:28 PM Automatic Plant Watering Project using ESP32 Web Server
Note the MAX value when the sensor is dry, then dip the sensor into water and note the MIN value.
Save these two values.
Now open the main sketch in Arduino IDE and update the following values.
Update the MAX value when the sensor is dry, and the MIN value for the wet soil.
int wetSoilVal = 1050 ; //min value when soil is wet
int drySoilVal = 3050 ; //max value when soil is dry
With these two readings, we will calculate the moisture percentage.
After making these changes, please upload the code to ESP32.
Here’s a line-by-line explanation of the code:
1. Importing Required Libraries
cppCopyEdit#include <WiFi.h>
#include <WebServer.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#include <AceButton.h>
using namespace ace_button;
WiFi.h → Enables ESP32 to act as an Access Point (AP).
WebServer.h → Helps in setting up a web server to control and monitor the system remotely.
Adafruit_SSD1306.h → Controls the 0.96″ OLED display.
DHT.h → Reads temperature and humidity from the DHT11 sensor.
AceButton.h → Handles button press events efficiently.
2. Defining Constants and Initializing Components
cppCopyEdit#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Defines the width and height of the OLED screen.
Initializes the SSD1306 OLED display.
cppCopyEdit#define SensorPin 34
#define DHTPin 14
#define RelayPin 25
https://iotcircuithub.com/automatic-plant-watering-project-esp32-webserver/ 8/12
5/20/25, 5:28 PM Automatic Plant Watering Project using ESP32 Web Server
#define wifiLed 2
#define RelayButtonPin 32
#define ModeSwitchPin 33
#define BuzzerPin 26
#define ModeLed 15
Defines GPIO pins used for moisture sensor, DHT11, relay (pump), buzzer, mode LED, and buttons.
cppCopyEdit#define DHTTYPE DHT11
DHT dht(DHTPin, DHTTYPE);
Defines the DHT11 sensor type and initializes the sensor.
cppCopyEditButtonConfig config1;
AceButton button1(&config1);
ButtonConfig config2;
AceButton button2(&config2);
Configures two buttons using the AceButton library.
3. Setting Up WiFi (ESP32 as Access Point)
cppCopyEditconst char *ssid = "ESP32_Plant_System";
const char *password = "12345678";
WebServer server(80);
Sets up the ESP32 as an Access Point with a default SSID and password.
The ESP32 runs a web server on port 80.
4. Moisture Sensor Calibration
cppCopyEditint wetSoilVal = 1050;
int drySoilVal = 3050;
Defines sensor readings for wet and dry soil.
1050 → Sensor value when soil is wet.
3050 → Sensor value when soil is dry.
cppCopyEditint moistPerLow = 20;
int moistPerHigh = 80;
Sets ideal moisture range (in percentage):
Below 20% → Soil is too dry, pump should turn on.
Above 80% → Soil is too wet, the pump should turn off.
5. Variables for System State
cppCopyEditint sensorVal;
int moisturePercentage;
bool toggleRelay = LOW;
bool prevMode = true;
int temperature1 = 0;
int humidity1 = 0;
String currMode = "A";
Stores sensor values and system state:
sensorVal → Raw moisture sensor reading.
moisturePercentage → Calculated soil moisture percentage.
toggleRelay → Tracks relay (pump) state (ON/OFF).
prevMode → Stores Auto (true) / Manual (false) mode.
temperature1 , humidity1 → Store DHT11 temperature & humidity values.
6. Web Page Handling
Creating Web Page
cppCopyEditvoid handleRoot() {
String html = "<!DOCTYPE html><html><head><title>Plant Monitor</title>";
html += "<style>body { text-align:center; font-family:Arial; background:#1e1e2e;
color:white; }";
html += "h1 { color:#00c853; } .container { margin:auto; width:80%; } .box {
padding:20px; border-radius:10px; margin:10px; background:#3b4252; }";
https://iotcircuithub.com/automatic-plant-watering-project-esp32-webserver/ 9/12
5/20/25, 5:28 PM Automatic Plant Watering Project using ESP32 Web Server
html += ".button { padding:15px 30px; margin:10px; border:none; border-radius:5px;
font-size:20px; cursor:pointer; display:inline-block; width:45%; }";
html += "#pumpBtn { background:#ff5722; color:white; } #modeBtn {
background:#2196F3; color:white; } #refreshBtn { background:#4CAF50; color:white;
width:100%; }";
html += "</style></head><body>";
html += "<div class='container'><h1>Plant Watering System</h1>";
html += "<div class='box'><h2>Temperature: " + String(temperature1) + " °C</h2>
</div>";
html += "<div class='box'><h2>Humidity: " + String(humidity1) + " %</h2></div>";
html += "<div class='box'><h2><b>Soil Moisture: " + String(moisturePercentage) + " %
</b></h2></div>";
html += "<div class='box'><h2>Mode: " + String(prevMode ? "Auto" : "Manual") + "
</h2></div>";
html += "<div class='box'><h2>Pump: " + String(toggleRelay ? "ON" : "OFF") + "</h2>
</div>";
html += "<button id='pumpBtn' class='button' onclick='togglePump()'>Toggle
Pump</button>";
html += "<button id='modeBtn' class='button' onclick='toggleMode()'>Toggle
Mode</button>";
html += "<br><button id='refreshBtn' class='button'
onclick='refreshPage()'>Refresh</button>";
html += "<script>function togglePump(){ fetch('/toggle'); } function toggleMode(){
fetch('/mode'); } function refreshPage(){ location.reload(); }</script>";
html += "</div></body></html>";
https://iotcircuithub.com/automatic-plant-watering-project-esp32-webserver/ 10/12
5/20/25, 5:28 PM Automatic Plant Watering Project using ESP32 Web Server
toggleRelay = LOW;
}
}
}
In Auto Mode, turns the pump ON when soil is dry and OFF when soil is wet.
9. Loop Execution
cppCopyEditvoid loop() {
server.handleClient();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
getMoisture();
getWeather();
updateOLED();
}
handleBuzzer();
controlPump();
button1.check();
button2.check();
}
Handles Web Requests.
Updates Sensor Data & OLED every 2 seconds.
Controls Buzzer & Pump based on conditions.
Connect the Pump & Sensors with the PCB
Now connect the sensors, OLED, Pump, and 5V Buzzeras per the above diagram.
Here I have a 12V 2A DC supply, you have to use the power supply as per the pump amps rating.
Testing the DIY Plant Watering circuit
https://iotcircuithub.com/automatic-plant-watering-project-esp32-webserver/ 11/12
5/20/25, 5:28 PM Automatic Plant Watering Project using ESP32 Web Server
Before connecting the solenoid valve with the pipeline, I will recommend you to test the circuit for Dry and Wet soil
scenarios.
If everything works fine, connect the solenoid valve with the main water pipeline of the drip irrigation system.
Now your plants will get water automatically whenever needed.
Applications
Home Gardening: Helps automate watering for indoor/outdoor plants.
Greenhouses: Maintains optimal soil moisture and climate conditions.
Agriculture: Reduces manual labor and ensures efficient water use.
Smart Irrigation Systems: Can be integrated with larger irrigation networks.
This ESP32-based smart plant watering system provides an efficient, automated solution to plant care. With real-time
monitoring, WiFi-enabled remote access, and intelligent control mechanisms, this project helps conserve water, minimize
plant stress, and ensure healthy growth. Whether for home gardens or commercial farms, this system is a step towards
smart and sustainable agriculture.
I hope you like this smart plant monitoring system using the ESP32 Web Server.
Click Here for more such ESP32 projects.
Please do share your feedback.
https://iotcircuithub.com/automatic-plant-watering-project-esp32-webserver/ 12/12