You learn embedded electronics by finishing things, not by reading datasheets. Each project here is small enough to complete in an evening and teaches exactly one new idea: a radio, a sensor, a display, low-power sleep or over-the-air updates. Do them in order and by the end you can build most hobby gadgets from scratch.
01What you need before you start
Very little. An ESP32 board, a USB-C cable and the free Arduino IDE with the Arduino-ESP32 core installed (board manager URL from Espressif). The examples here use core version 3.x, the current generation. A few projects add a cheap sensor or display; the rest run on a bare board.
- Board: any ESP32 or ESP32-S3 development board. A board with an onboard LED and native USB saves you wiring.
- Optional parts: a DHT22 temperature sensor, a small I2C OLED (SSD1306), a micro servo (SG90) and an electret or I2S microphone. None cost much.
- No soldering for most of the list. A breadboard and jumper wires help for the sensor builds.
LED = 2, check your board's pinout and change it to match. Some ESP32-S3 boards use an addressable RGB LED instead of a plain one.02The 10 projects at a glance
Here is the whole path. Difficulty is relative to the one before it, not an absolute scale.
| # | Project | What you learn | Difficulty |
|---|---|---|---|
| 1 | Blink / RGB fade | Toolchain, GPIO, timing | Easy |
| 2 | Wi-Fi web server for an LED | Join Wi-Fi, serve a page, handle a click | Easy |
| 3 | DHT22 temperature dashboard | Read a digital sensor, auto-refresh a page | Easy |
| 4 | BLE beacon scanner | Bluetooth LE advertising, RSSI | Medium |
| 5 | Deep-sleep battery sensor | Low power, wake timers, battery life | Medium |
| 6 | OLED clock over NTP | I2C display, network time, time zones | Medium |
| 7 | Web-controlled servo | PWM, driving a motor from a browser | Medium |
| 8 | Sound-level meter | Analog or I2S audio, simple DSP | Medium |
| 9 | Captive-portal config page | Access point, DNS trick, saving settings | Harder |
| 10 | OTA firmware update | Flashing over Wi-Fi, versioning | Harder |
03Projects 1–2: lights and a web page
1. Blink or RGB fade. The classic first step. Toggle the onboard LED once a second, then fade an RGB LED through colors. You learn the build-and-flash cycle, how a GPIO pin drives a load, and how delay() and millis() handle timing. On an ESP32-S3 with an addressable LED, the Adafruit_NeoPixel library drives it in a few lines. Parts: board only.
2. Wi-Fi web server to control an LED. This is the project that makes the ESP32 click for most people. The board joins your Wi-Fi, serves a tiny web page, and a link on that page turns the LED on and off. Now your gadget has a user interface that any phone on the network can open, with no app to install. Parts: board only.
#include <WiFi.h> #include <WebServer.h> const char* SSID = "your-wifi"; const char* PASS = "your-password"; const int LED = 2; // change to your board's LED pin WebServer server(80); void sendPage() { bool on = digitalRead(LED); String html = "<h1>ESP32 LED</h1><p>LED is "; html += on ? "ON" : "OFF"; html += "</p><a href='/toggle'>Toggle</a>"; server.send(200, "text/html", html); } void setup() { Serial.begin(115200); pinMode(LED, OUTPUT); WiFi.begin(SSID, PASS); while (WiFi.status() != WL_CONNECTED) delay(300); Serial.println(WiFi.localIP()); // open this address in a browser server.on("/", sendPage); server.on("/toggle", []() { digitalWrite(LED, !digitalRead(LED)); server.sendHeader("Location", "/"); server.send(303); // redirect back to the page }); server.begin(); } void loop() { server.handleClient(); }
Flash it, open the Serial Monitor at 115200 baud, note the IP address it prints, and type that address into a browser on the same network. Every time you learn a new sensor later, you can show its value on a page like this one.
04Projects 3, 4 & 8: read the world
3. DHT22 temperature and humidity dashboard. Wire a DHT22 to one GPIO and 3.3 V, read it with the DHT library, and show temperature and humidity on a web page that refreshes itself every few seconds. You learn how a one-wire digital sensor works and how to turn live data into a simple dashboard. Parts: DHT22, one pull-up resistor. Difficulty: easy.
4. BLE beacon scanner. Switch from Wi-Fi to the other radio. The ESP32 listens for Bluetooth Low Energy advertisements from nearby phones, fitness bands and beacons, and prints each device's address and signal strength (RSSI). You learn how BLE advertising works and how RSSI drops with distance — the same idea behind phone "nearby device" features. Keep it defensive: scan only your own devices, and never try to connect to or interfere with hardware that is not yours. Parts: board only. Difficulty: medium.
8. Sound-level meter. Feed a microphone into the ESP32, either an analog electret module on an ADC pin or a digital I2S mic, sample it fast, and compute a rolling loudness level that you show as a bar. You learn basic sampling and that a "sound level" is a short-term average, not a single reading. It is a gentle on-ramp to real signal processing. Parts: electret or I2S microphone. Difficulty: medium.
05Projects 6 & 7: a display and some motion
6. OLED clock synced over NTP. Connect a small SSD1306 OLED over I2C (two wires plus power), join Wi-Fi, ask a public NTP server for the time, set the ESP32's clock and draw the time on the screen. You learn I2C, network time and why time zones and daylight saving need a little care. The result is a genuinely useful desk clock that never drifts. Parts: SSD1306 OLED. Difficulty: medium.
7. Web-controlled servo. Combine the web server from project 2 with a hobby servo. A slider on the page sets the angle; the ESP32 generates the PWM signal that moves the horn. You learn pulse-width modulation and the habit of powering a motor from its own supply rather than the board's 3.3 V rail. Parts: SG90 servo, separate 5 V supply. Difficulty: medium.
06Projects 5, 9 & 10: deploy like a product
The last three turn a desk experiment into something you can actually install and leave running.
5. Deep-sleep battery sensor. A sensor that reports once a minute does not need to stay awake. Read the value, send it, then call esp_deep_sleep with a wake timer. The board wakes, works for a second and sleeps again. A bare ESP32 module drops to tens of microamps asleep, so the battery lasts far longer. You learn the single most important idea in battery electronics: do the work, then sleep. Parts: any sensor, a battery. Difficulty: medium.
9. Captive-portal config page. Hard-coding your Wi-Fi password into every sketch is painful. Instead, make the ESP32 start its own access point and a small web page where you type the network name and password, which it saves to flash. A DNS redirect pops that page up automatically when you join, the way hotel and airport Wi-Fi logins appear. You learn access-point mode, non-volatile storage and a realistic setup flow. Parts: board only. Difficulty: harder.
10. OTA firmware update. Walking a USB cable to a board hidden behind a wall gets old fast. With the ArduinoOTA library the ESP32 accepts new firmware over Wi-Fi, so it shows up as a network target in the IDE. You learn how over-the-air updates work and why version numbers and a safe fallback matter once a device is out of reach. Parts: board only. Difficulty: harder.
07Which board should you buy?
Any ESP32 or ESP32-S3 dev board runs all ten projects. For a first board, two things genuinely help: native USB (so you do not fight driver issues) and an onboard LED and button (so projects 1, 2 and 9 need no wiring at all). ESP32-S3 boards add more memory and USB features, which make the OTA and captive-portal builds smoother.
If you would rather not breadboard anything, a finished pocket board gets you to the Wi-Fi, BLE, deep-sleep, captive-portal and OTA projects with zero wiring.
08FAQ
Do I need to know C++ to start with the ESP32?
No. The Arduino-ESP32 core lets you start with short sketches and copy-paste examples. You pick up the C++ you need as you go, and you can also use MicroPython if you prefer Python.
What is the difference between an ESP32 and an Arduino Uno?
The ESP32 is far faster, has much more memory, and includes Wi-Fi and Bluetooth built in. An Arduino Uno has none of those radios. For any project that talks to a phone, a browser or the internet, the ESP32 is the better starting point.
How much power does an ESP32 use on a battery?
With Wi-Fi active it can draw well over 100 mA in bursts, which drains a small battery in hours. In deep sleep a bare module drops to tens of microamps, so a sensor that wakes briefly every few minutes can run for months on the right battery.
Can I run these projects without a breadboard?
Yes. Any of the lights, Wi-Fi, BLE, deep-sleep, captive-portal and OTA projects need no wiring at all on a board that already has an LED and USB-C, such as the SGP Card Mini. You only need to wire parts for the sensor, display and servo builds.