This project is a secure, Wi-Fi-enabled Smart Home Automation System built using the ESP32 microcontroller. It allows real-time control and monitoring of devices (Relays, NeoPixel RGB LEDs, Stepper Motor, DHT22 sensor) through a dynamic WebSocket interface served from the ESP32’s file system (LittleFS).
Only authenticated users can access the control panel using a challenge-response password hashing mechanism without storing the password in the ESP32 memory — ensuring secure, stateless authentication.
- 🔐 Secure Challenge-Response WebSocket Authentication
- 🌐 Dynamic web interface with WebSocket-based real-time updates
- 🔌 4x Relays: Toggle control via web and physical buttons
- 🌡️ DHT22: Real-time temperature and humidity monitoring
- 🎨 NeoPixel RGB LED: Color control from UI
- 🤀 Stepper Motor: Angular control via slider with auto-reset on boot
- 📲 Works over local Wi-Fi or fallback hotspot
- 💾 Uses LittleFS for HTML, CSS, JS
- 🎯 UUID-based device recognition (up to 5 remembered clients)
- 📉 System info console and log display
SmartHome-ESP32/
│
├── data/ # Web UI files for LittleFS
│ ├── index.html # Login page
│ ├── control.html # Smart control panel (after auth)
│ ├── style.css # Web styling
│ └── script.js # WebSocket + UI logic
│
├── src/
│ └── main.cpp # Core firmware code
│
├── platformio.ini # PlatformIO config
├── README.md # Project documentation (this file)
└── credentials_template.h # Wi-Fi credentials (excluded from repo)
We use challenge-response SHA-256 hashing. Password is never stored or transmitted directly. Here's a highlight from main.cpp:
#include <SHA256.h>
#include <Preferences.h>
Preferences preferences;
SHA256 sha256;
// Example password hash (not plain password)
const char* correctHash = "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd..."; // sha256("password")
bool verifyPassword(String userResponse, String challenge) {
String combined = challenge + "password"; // 'password' is never stored; just shown here for understanding
sha256.reset();
sha256.update(combined.c_str(), combined.length());
uint8_t* result = sha256.result();
String calculatedHash = "";
for (int i = 0; i < 32; i++) {
char hex[3];
sprintf(hex, "%02x", result[i]);
calculatedHash += hex;
}
return userResponse.equals(calculatedHash);
}- Server sends a
challengestring to the browser. - Browser JavaScript hashes
challenge + passwordand sends it back. - ESP32 verifies by recomputing SHA-256 on same.
- ✅ ESP32 Devkit V1
- ✅ 4x Relays on GPIO 16–19
- ✅ 4x Buttons on GPIO 21–25 (optional debounce)
- ✅ DHT22 Sensor on GPIO 4
- ✅ NeoPixel RGB LED on GPIO 5 (WS2812)
- ✅ Stepper Motor (28BYJ-48 + ULN2003) on GPIOs 26–29
- ✅ Power supply: 5V regulated for relays/motor
See screenshots below for better understanding WEB APP 👈 Click Here
Smart Home Web UI
Login Page 👈 Click Here
- User connects to ESP hotspot
SmartHome-ESP32(PW:00000000) or home Wi-Fi. - A random challenge string is shown.
- User enters password → client hashes password + challenge → sends hash.
Controls Page 👈 Click Here Top Console:
- Device info: RAM, CPU freq, uptime, IP
- WebSocket client ID
- Scrollable serial monitor logs
Relay Control:
- Toggle buttons for 4 relays
Example log:{ "Type": "Control", "Key": "Light-1", "Value": "on" }
DHT22 Sensor Display:
- Live temperature and humidity updates every 2s
*Example: *Temp: 29.4°C | Humidity: 62%
NeoPixel Control:
- HTML color picker to choose RGB values
Logs as:{ "Type": "Control", "Key": "Ambience", "Value": "#ff8800" }
Stepper Motor Slider:
- Angular control via slider (0°–180°)
- Resets to 0° on boot
- On successful login, ESP stores
{ username : UUID }in NVS Preferences - Maintains last 5 UUIDs
- If a known UUID connects, skips login and serves
control.htmldirectly
Code snippet:
preferences.begin("uuid-auth", false);
preferences.putString("user1", "UUID-1234");
String uuid = preferences.getString("user1");
preferences.end();- Power on ESP32, connect to hotspot
SmartHome-ESP32(PW:00000000) - Open
192.168.4.1 - Enter password (e.g.
password123) - Control panel opens after successful hash match
- From UI, go to "Update Credentials"
- Enter your home Wi-Fi SSID and password
- Restart ESP32 — now it auto-connects
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
build_flags =
-DCORE_DEBUG_LEVEL=3
lib_deps =
bblanchon/ArduinoJson
me-no-dev/ESP Async WebServer
me-no-dev/AsyncTCP- Add OTA firmware updates
- Role-based access (Admin vs Guest)
- MQTT integration with external broker
- Voice assistant control (Alexa/Google)
Developer: Mayur Borgude
Year: 2025
Project Type: B.E. Final Year Embedded + Web IoT System
This project is open-source and free to use under the MIT License. Please give credit where due.













