📡25 ESP32 Project Ideas for Students (Beginner to Advanced, with Parts & Diagrams)
Twenty-five ESP32 project ideas for students, grouped beginner to advanced with parts and skills, plus expanded India-focused builds: monsoon rain alert with code, soil monitor, RFID attendance, air quality and energy monitor.

In this article (19)
- Why the ESP32 is a good board for student projects
- Pin rules to know before you start
- Beginner ESP32 project ideas (1–8)
- Intermediate ESP32 project ideas (9–17)
- Advanced ESP32 project ideas (18–25)
- Five India-focused ESP32 projects, expanded
- Monsoon rain alert (idea 5)
- Plant soil monitor (idea 6)
- RFID attendance system (idea 12)
- Air-quality monitor (idea 10)
- Home energy monitor (idea 18)
- Hands-on: build the monsoon rain alert
- Which ESP32 project should you build first?
- Frequently asked questions
- What is the easiest ESP32 project for a beginner?
- Can I use 5 V sensors with an ESP32?
- Why does analogRead return 0 when Wi-Fi is on?
- Which ESP32 projects are good for a science exhibition?
- Do I need the internet for ESP32 projects?
These ESP32 project ideas for students run from beginner to advanced, each with its key parts and the skill it teaches. Several tackle everyday Indian problems: the first monsoon rain, a thirsty balcony plant, the electricity bill, classroom attendance and winter smog.
The best first ESP32 projects are a Wi-Fi LED switch, a DHT22 weather web page and a monsoon rain alert: each needs an ESP32 board and only a few parts, and teaches Wi-Fi from day one. Then add one new skill per project: a dashboard, a display, a motor or a battery.
Start in the left column and move right one skill at a time
Why the ESP32 is a good board for student projects
The ESP32 is a low-cost Espressif microcontroller with Wi-Fi and Bluetooth built in. The common ESP32-WROOM-32 module has a dual-core Xtensa LX6 processor at up to 240 MHz, 520 KB of SRAM, 2.4 GHz Wi-Fi (802.11 b/g/n) and Bluetooth v4.2 (Classic and BLE), according to the ESP32 datasheet. You program it in the Arduino IDE with the Arduino-ESP32 core.
Still choosing a board? Read best ESP32 board for beginners in India and ESP32 vs ESP8266.
Pin rules to know before you start
| Rule | Why it matters |
|---|---|
| All GPIOs are 3.3 V | A 5 V sensor output needs a voltage divider or level shifter |
| GPIO34–39 are input-only, with no internal pull-ups | Fine for sensors; cannot drive an LED or use INPUT_PULLUP |
ADC2 pins stop working for analogRead when Wi-Fi is on | Put analog sensors on ADC1: GPIO32–39 |
| GPIO6–11 connect to the on-module flash | Never use them |
| GPIO0, 2, 5, 12 and 15 are strapping pins | Avoid parts that pull them high or low at reset; GPIO12 is the riskiest |
| 10 GPIOs support capacitive touch | Make touch buttons with just a wire or foil |
Upload problems? See ESP32 not detected on COM port. Rebooting when Wi-Fi starts? See ESP32 brownout detector triggered.
Beginner ESP32 project ideas (1–8)
| # | Project | One-line description | Key parts | Skills learned |
|---|---|---|---|---|
| 1 | Wi-Fi LED web switch | Switch an LED from your phone's browser | ESP32, LED, 220 Ω | Wi-Fi, web server, GPIO |
| 2 | Wi-Fi network scanner | List nearby networks and signal strength | ESP32 only | Wi-Fi scanning, RSSI, Serial Monitor |
| 3 | Touch-sensor lamp | Touch foil to toggle a light | ESP32, foil, LED | Capacitive touch, thresholds |
| 4 | DHT22 weather web page | Room temperature and humidity on your phone | ESP32, DHT22 | Sensor libraries, HTML |
| 5 | Monsoon rain alert | Beep and update a web page when rain starts | ESP32, rain sensor module, buzzer, BC547 | Digital input, alerts |
| 6 | Plant soil monitor | Soil moisture in %, with a dry-pot warning | ESP32, capacitive soil sensor | Analog input, calibration |
| 7 | Internet clock on OLED | Exact IST time from the internet | ESP32, 0.96" I2C OLED | NTP, I2C displays |
| 8 | Bluetooth phone lights | Switch LEDs from a Bluetooth serial app | ESP32 (original), LEDs | Bluetooth Classic |
Intermediate ESP32 project ideas (9–17)
| # | Project | One-line description | Key parts | Skills learned |
|---|---|---|---|---|
| 9 | PIR intruder alert | Phone alert when someone enters a room | ESP32, HC-SR501 PIR | Interrupts, notifications |
| 10 | Air-quality monitor | PM2.5, PM10, temperature and humidity | ESP32, PMS5003, BME280 | UART, I2C, data averaging |
| 11 | Water tank level monitor | Overhead tank level on your phone | ESP32, JSN-SR04T or HC-SR04 | Ultrasonic distance, maths |
| 12 | RFID attendance system | Tap a card; name and time are logged | ESP32, RC522, OLED | SPI, NTP time, logging |
| 13 | Automatic plant waterer | Run a 5 V pump when the soil is dry | ESP32, soil sensor, MOSFET module, pump | Driving loads, flyback diodes |
| 14 | Data logger | Save readings to microSD or a Google Sheet | ESP32, microSD module, any sensor | Files, CSV, HTTP requests |
| 15 | MQTT home dashboard | Several sensors on one dashboard | ESP32, sensors, free MQTT broker | MQTT publish/subscribe |
| 16 | ESP-NOW wireless remote | One ESP32 controls another, no router | 2 × ESP32, buttons, LEDs | ESP-NOW, MAC addresses |
| 17 | Gas leak alarm | Alarm when smoke or LPG is detected | ESP32, MQ-2 module, buzzer | Sensor warm-up, dividers |
For project 11, our HC-SR04 guide shows how to divide its 5 V echo down for an ESP32. The MQ-2 in project 17 needs 5 V for its heater, so its analog output also needs a divider (check it with the ADC voltage calculator). Test it only with smoke from a blown-out incense stick, never with an LPG cylinder.
Advanced ESP32 project ideas (18–25)
| # | Project | One-line description | Key parts | Skills learned |
|---|---|---|---|---|
| 18 | Home energy monitor | Safely estimate an appliance's power | ESP32, SCT-013-030 clamp, resistors, capacitor | RMS maths, AC signals |
| 19 | ESP32-CAM security camera | Stream video, save photos on motion | ESP32-CAM (OV2640), USB-serial adapter, PIR | Camera, streaming, microSD |
| 20 | Wi-Fi robot car | Drive a robot from a phone browser | ESP32, 2 gear motors, TB6612FNG or L298N, battery | PWM, motor drivers, power |
| 21 | Self-balancing robot | A two-wheel robot that stays upright | ESP32, MPU6050, motors, driver | PID control, IMU sensors |
| 22 | Solar weather station | Battery station that sleeps between readings | ESP32, BME280, solar panel, Li-ion charger | Deep sleep, power budgets |
| 23 | LoRa farm sensor node | Soil readings sent far without Wi-Fi | ESP32, LoRa module, soil sensor | LoRa radio, low power |
| 24 | OTA LED-strip controller | Animate LEDs, update code over Wi-Fi | ESP32, WS2812B strip, 5 V supply | OTA updates, addressable LEDs |
| 25 | TinyML gesture detector | Recognise gestures on the board itself | ESP32 or ESP32-S3, MPU6050 | Data collection, on-device ML |
For motor projects, compare drivers in L298N vs TB6612FNG vs DRV8833 and pick a battery with the robot battery guide. For project 22, the datasheet lists about 10 µA in deep sleep (RTC timer and memory on), but development boards draw far more through their regulator and USB chip — estimate run time with the battery life calculator. For project 23, use a module for India's LoRaWAN band, IN865 (865–867 MHz). Project 25 builds on our edge machine learning guide.
Five India-focused ESP32 projects, expanded
Monsoon rain alert (idea 5)
DO goes LOW when rain bridges the plate; the ESP32 beeps and updates a web page
Water bridges the plate's two interleaved tracks and the module's LM393 comparator pulls DO LOW. The buzzer runs from 5 V through a BC547 rather than straight from an ESP32 pin. The full build is below.
Plant soil monitor (idea 6)
A capacitive soil sensor lasts much longer than the two-pronged resistive type, which corrodes in wet soil. Connect its output to GPIO34 (ADC1) and read it with analogRead(), which returns 0–4095 on the ESP32. Calibrate it: note the reading in air (dry) and in water (wet), then map between them to 0–100 %. Some clone boards need 5 V; if so, first confirm the output never exceeds 3.3 V.
RFID attendance system (idea 12)
Tap, read the card's UID, match the student, add the time, then log it
The RC522 reads 13.56 MHz cards over SPI using the ESP32's default VSPI pins, and it runs on 3.3 V — never 5 V. Get the time from the internet with configTime(19800, 0, "pool.ntp.org"); 19,800 seconds is the 5 h 30 min offset for IST. Log each tap to microSD or a Google Sheet. Card numbers can be copied, so use this for attendance, not door locks, and store only the student data you need.
Air-quality monitor (idea 10)
A PMS5003 laser particle sensor runs on 5 V but talks 3.3 V serial data at 9600 baud, so it connects safely to the ESP32's second UART (for example GPIO16 RX, GPIO17 TX). It reports PM1.0, PM2.5 and PM10 in µg/m³. Add a BME280 on I2C (GPIO21 SDA, GPIO22 SCL) for temperature, humidity and pressure. Low-cost sensors are not reference instruments, so present readings as indicative and compare trends with the nearest official monitoring station. An MQ-135 gas sensor cannot measure particles.
Home energy monitor (idea 18)
The clamp is magnetically coupled, so the ESP32 never touches mains voltage
A clip-on current transformer measures current in one wire without electrical contact. The SCT-013-030 gives 1 V at 30 A. Two 10 kΩ resistors centre this AC signal at 1.65 V so the ADC can read both halves of the 50 Hz wave; the ESP32 then calculates the RMS value.
Hands-on: build the monsoon rain alert
Parts: ESP32 DevKit, rain sensor plate with LM393 module, 5 V active buzzer, BC547 transistor, 1 kΩ resistor, breadboard and jumper wires.
- Wire the module: VCC → 3V3, GND → GND, DO → GPIO27. Leave AO unconnected.
- Wire the buzzer switch: GPIO26 → 1 kΩ → BC547 base, emitter → GND, collector → buzzer (−), buzzer (+) → 5V/VIN.
- Install the ESP32 board package, add your Wi-Fi name and password to the sketch below, and upload it.
- Open the IP address printed in the Serial Monitor (115200 baud) on a phone on the same Wi-Fi network.
- Sprinkle water on the plate. The buzzer beeps three times and the page changes to "It is raining!". Turn the module's sensitivity screw if it triggers too easily.
#include <WiFi.h>
#include <WebServer.h>
const char* WIFI_SSID = "YOUR_WIFI_NAME";
const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";
const int RAIN_PIN = 27; // LM393 DO: LOW when water is detected
const int BUZZER_PIN = 26; // drives the buzzer through a BC547
const unsigned long DRY_AFTER_MS = 10UL * 60UL * 1000UL; // 10 minutes without water
WebServer server(80);
bool raining = false;
unsigned long lastWet = 0;
void beep(int times) {
for (int i = 0; i < times; i++) {
digitalWrite(BUZZER_PIN, HIGH);
delay(300);
digitalWrite(BUZZER_PIN, LOW);
delay(200);
}
}
void handleRoot() {
String page = "<!DOCTYPE html><html><head>";
page += "<meta name='viewport' content='width=device-width'>";
page += "<meta http-equiv='refresh' content='10'><title>Rain alert</title></head><body>";
page += raining ? "<h1>It is raining!</h1>" : "<h1>Dry</h1>";
page += "</body></html>";
server.send(200, "text/html", page);
}
void setup() {
Serial.begin(115200);
pinMode(RAIN_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Open http://");
Serial.println(WiFi.localIP());
server.on("/", handleRoot);
server.begin();
}
void loop() {
server.handleClient();
if (digitalRead(RAIN_PIN) == LOW) { // water on the plate
lastWet = millis();
if (!raining) {
raining = true;
beep(3); // alert once per shower
}
} else if (raining && millis() - lastWet > DRY_AFTER_MS) {
raining = false; // dry for 10 minutes: re-arm
}
}
The 10-minute wait stops repeat beeps as the plate dries. Next, add a phone notification through a messaging bot or MQTT (idea 15).
Which ESP32 project should you build first?
| If you are… | Start with | Then try |
|---|---|---|
| New to electronics | 1 Wi-Fi LED switch | 4 DHT22 weather page |
| Preparing a school exhibition | 5 Monsoon rain alert | 13 Automatic plant waterer |
| Interested in the environment | 6 Plant soil monitor | 10 Air-quality monitor |
| Building for your school or club | 12 RFID attendance | 15 MQTT dashboard |
| Into robots | 20 Wi-Fi robot car | 21 Self-balancing robot |
| An engineering student | 18 Energy monitor | 23 LoRa node or 25 TinyML |
Get parts at ESP32 boards, sensors and motor drivers, or as a complete kit. Brand new to microcontrollers? Start with Arduino projects for beginners or compare boards in Arduino vs ESP32 vs Raspberry Pi Pico.
Frequently asked questions
What is the easiest ESP32 project for a beginner?
A Wi-Fi LED web switch (idea 1). It needs only an LED and a 220 Ω resistor, and teaches what sets the ESP32 apart from an Arduino Uno: Wi-Fi and a web server.
Can I use 5 V sensors with an ESP32?
Yes, if you reduce the module's output to 3.3 V with a voltage divider or level shifter. Power it from 5 V (VIN) and divide only the signal; check values with the voltage divider calculator.
Why does analogRead return 0 when Wi-Fi is on?
Your sensor is probably on an ADC2 pin, which the Wi-Fi driver uses. Move it to an ADC1 pin: GPIO32, 33, 34, 35, 36 or 39 on a typical ESP32 DevKit.
Which ESP32 projects are good for a science exhibition?
The rain alert, soil monitor, tank level monitor and air-quality monitor solve visible problems and show live data. See also school science exhibition project ideas.
Do I need the internet for ESP32 projects?
No. Most ideas work on a local Wi-Fi network. Only NTP time, cloud notifications and online logging need internet, and ESP-NOW and LoRa need no router at all.
Thinking Robot Team
Thinking Robot is a team of engineers and educators in Pune who design electronics and robotics kits and run hands-on workshops for students and schools. Spotted a mistake or have a question? Get in touch.








