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
challenge
string to the browser. - Browser JavaScript hashes
challenge + password
and 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.html
directly
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.