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.













