ESP32 Wi‑Fi CSI radar for human presence & movement detection. Privacy‑first — no cameras, no sensors, just Wi-Fi signal jitter. Real‑time WEB UI dashboard with live RSSI/jitter charts, auto‑calibration, GPIO/LED outputs.
- Features
- Prerequisites
- Getting Started
- Web Dashboard Overview
- Configuration
- Button Functions
- RGB LED indicator
- Auto Calibration
- Troubleshooting
- Misc
- Wi‑Fi CSI‑based human detection – uses channel state information jitter, no cameras or additional sensors.
- Presence detection – determines if someone is in the room (configurable timeout).
- Movement detection – real‑time motion sensing with moving‑window filtering.
- Auto‑calibration – learns the empty‑room threshold automatically; takes ~60s.
- GPIO output – dedicated pins for
someoneandmovestatus to trigger external devices.
- WEB UI – modern WEB UI interface.
- Live charts – rolling RSSI and Jitter graphs with live numeric values.
- Status tiles – someone presence, movement, RSSI, calibration state.
- Full settings control – Wi‑Fi connection, radar parameters, pin config, LED toggle.
- Responsive design – works on desktop, tablet, and mobile.
- Session‑based login – secure with password (default
admin/admin). - All endpoints protected – denying unauthorised access.
- STA mode – connect to your home router with stored credentials.
- Wi‑Fi scan – scan and select networks from the dashboard.
- Auto‑reconnect – background reconnection loop with configurable interval.
- SoftAP fallback – automatically starts a configuration hotspot when no credentials are saved.
- Button‑triggered SoftAP – short button press toggles config mode.
- WS2812 RGB LED – visual feedback for different states:
- Breathing blue – SoftAP/config mode.
- Breathing purple – no config.
- Breathing red – disconnected / trying to reconnect.
- Yellow blink – calibration in progress.
- Green – movement detected.
- White – someone present.
- LED on/off control – enable/disable LED.
- Reboot – from web UI.
- Factory reset – clears all settings (also accessible via long button press).
- Wi‑Fi reset – clears stored credentials only (medium‑long button press).
- Pin configuration – change WS2812, someone, and move GPIOs via UI.
-
ESP32 or ESP32‑S2 or ESP32‑S3 or ESP32‑C3 board (tested on ESP32‑S3‑DevKitC‑1)
-
Wi‑Fi router (2.4 GHz) – the radar monitors the connection to your access point
-
WS2812 (NeoPixel) RGB LED (optional, for status feedback)
❗ Notice: Many ESP32 dev boards have a built‑in WS2812 RGB LED.
you can configure WS2812 on ESP-IDF withidf.py menuconfigcommand, Component config -> WS2812 RGB LED.or edit sdkconfig file with notepad and change WS2812 LED pin
CONFIG_WS2812_LED_GPIO= -
Two jumper wire for GPIO outputs (optional, for
someone/moveexternal triggers)
- ESP‑IDF v5.4.4 (recommended) or later
- Python 3.8+ (used by ESP‑IDF build system)
- Install python 3.8+ and ESP‑IDF v5.4.4
- Open ESP‑IDF PowerShell or Command Prompt
git clone https://github.com/ErfanDL/WaveSight.git- CD to cloned git
cd WaveSightSet the chip target – pick the command that matches your board:
| Your Board | Command |
|---|---|
| ESP32 | idf.py set-target esp32 |
| ESP32‑S3 | idf.py set-target esp32s3 |
| ESP32‑C3 | idf.py set-target esp32c3 |
| ESP32‑S2 | idf.py set-target esp32s2 |
- Connect the ESP32 board to the PC using the USB cable then enter the below command:
idf.py build flashthe device will start a SoftAP hotspot:
- SSID:
WaveSight - Password:
configureme
- Connect your phone or PC to this Wi‑Fi network.
- Open a browser and go to
http://192.168.4.1. - Log in with:
- Username:
admin - Password:
admin
- Username:
📶 Connect to Your Home Router
- Still in Settings, click on Scan and select your Wi-Fi router and enter Password.
- Click Connect to Wi‑Fi.
- The device will save the credentials, reboot, and connect to your router.
- After the reboot, find the device’s new IP (from the serial monitor or your router’s client list), open it in a browser, and log in again – you’re all set 🎉
- Use the Scan button to see nearby networks.
- select your Wi-Fi Network, enter its password, and click Connect to Wi‑Fi.
- The device reboots and joins the selected network.
- Someone Timeout (seconds) – how long after the last movement the system considers the room empty.
- Move Threshold – jitter value above which movement is detected.
- Filter Window & Filter Count – moving‑window parameters for noise reduction.
- Click Save Radar Settings to apply immediately.
- The room must be empty.
- Click Start Calibration – the system samples for the set duration (default 60 s) and learns the background threshold.
- The LED blinks yellow during calibration.
- Change the GPIO pins for the WS2812 LED, someone output, and movement output.
- Click Save Pins – changes take effect after a reboot.
The physical button (GPIO 0 on most boards, GPIO 8 on ESP32‑C3) works as follows:
Press duration Action
- Short press (< 3 s) Toggle SoftAP configuration mode
- Long press (3‑5 s) Clear Wi‑Fi credentials and reboot
- Very long press (> 5 s) Factory reset (erase all settings) and reboot
- WS2812 RGB LED – visual feedback for different states:
- Breathing blue – SoftAP/config mode.
- Breathing purple – no config.
- Breathing red – disconnected / trying to reconnect.
- Yellow blink – calibration in progress.
- Green – movement detected.
- White – someone present.
- Make sure the room is completely empty – no people or large moving objects.
- Go to the Dashboard (or Settings → Calibration).
- Click “Start Calibration”.
- The LED will start blinking yellow.
- A countdown timer appears showing the remaining time (60 seconds).
- Wait until the timer reaches zero. The device automatically:
- Stops sampling,
- Calculates the optimal Someone threshold and Move threshold from the background noise,
- Saves the new values permanently.
- Once finished, the LED stops blinking and the status returns to “Idle”.
⚠️ Important:
- During calibration, no one should move in the direct line‑of‑sight between the router and the ESP32. Even walking nearby can skew the background measurement.
- For the most accurate results, place the router and the ESP32 at roughly the same height (e.g., on the same desk or shelf). Large height differences may reduce detection sensitivity after calibration.
🔄 Always run calibration after the device has been placed in its final location and connected to the same Wi‑Fi network it will monitor. Moving the router or the ESP32 may require recalibration.
Radar charts show no data?
- Ensure the ESP32 is connected to your Wi‑Fi router (not just the SoftAP). The radar analyses the connection to the access point.
RGB LED not working?
-
Verify the WS2812 pin in Settings → Pin Configuration matches your hardware. For the ESP32‑S3‑DevKitC‑1, it should be 48.
❗ Notice: Many ESP32 dev boards have a built‑in WS2812 RGB LED.
you can configure WS2812 on ESP-IDF withidf.py menuconfigcommand, Component config -> WS2812 RGB LED.or edit sdkconfig file with notepad and change WS2812 LED pin
CONFIG_WS2812_LED_GPIO=
Can’t access the dashboard after connecting to home Wi‑Fi?
- Check the serial monitor for the assigned IP address, or look at your router’s client list.
Stuck in SoftAP mode?
- A short button press toggles SoftAP on/off. If the device was in SoftAP, pressing the button will exit it and reboot into station mode.
If you like my work and want to support me, you can send me a donation via crypto:
Ethereum: 0x283D333C14500dDB93aEE219D2AC1ab3a95ADd5E
Tether USDT (TRC20): TPTeQGyVVjK7yk3jXCqXeDZto38jWVU4v8



