Hệ thống điều khiển đèn thông minh dùng ESP32 (PlatformIO/Arduino) kết hợp:
python server.pyhttp://localhost:5000/ (hoặc URL ngrok in trong terminal)flowchart TD
subgraph USER [Lớp Người Dùng - User Layer]
WebUI([Web UI / Voice Input])
Physical([Nút nhấn vật lý])
Telegram([Telegram Bot])
end
subgraph SERVER [Lớp Máy Chủ & AI - Server Layer]
AIServer["Server & AI Pipeline<br>(Flask, Whisper, Parsing Logic)"]
end
subgraph CLOUD [Lớp Đám Mây - IoT Cloud]
Blynk((Blynk Platform))
end
subgraph HARDWARE [Lớp Phần Cứng - Hardware]
ESP32{ESP32 Microcontroller}
Sensors[Cảm biến: LDR, PIR]
Outputs[Đèn LED]
end
%% Các luồng giao tiếp (Data flows)
WebUI -->|Gửi Audio| AIServer
AIServer -->|Gửi lệnh V-PINS| Blynk
Blynk <-->|Đồng bộ Lệnh & Trạng thái| ESP32
Physical -->|Tín hiệu thủ công| ESP32
Sensors -->|Dữ liệu môi trường| ESP32
ESP32 -->|Điều khiển bật/tắt| Outputs
ESP32 -->|Gửi báo cáo log| Telegram
%% Tùy chỉnh màu sắc cơ bản
style USER fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style SERVER fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
style CLOUD fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
style HARDWARE fill:#fff3e0,stroke:#f57c00,stroke-width:2px
PIR_HOLD_MS (mặc định 10s)Theo src/main.cpp:
| Thiết bị | Chân ESP32 |
|---|---|
| LED1 (Phòng ngủ) | GPIO 26 |
| LED2 (Hành lang) | GPIO 27 |
| LED3 (Sân vườn) | GPIO 14 |
| LDR (ADC) | GPIO 34 |
| PIR (Digital) | GPIO 35 |
| Nút 1 (LED1) | GPIO 18 |
| Nút 2 (LED2) | GPIO 19 |
| Nút 3 (LED3) | GPIO 23 |
Firmware sử dụng các Virtual Pin sau:
V0: điều khiển LED1 (phòng ngủ)V1: đồng bộ trạng thái LED2 (hành lang)V2: đồng bộ trạng thái LED3 (sân vườn)V3: gửi giá trị LDR (để quan sát trên Blynk)V4: lệnh Voice AI cho LED2 (0=Tắt, 1=Bật, 2=Trả về tự động)V5: lệnh Voice AI cho LED3 (0=Tắt, 1=Bật, 2=Trả về tự động)V9: log trạng thái.
├─ src/ # Firmware ESP32 (PlatformIO/Arduino)
│ └─ main.cpp
├─ server.py # Flask server + Whisper ASR + Ngrok
├─ index.html # Web UI (được server.py serve tại /)
├─ requirements.txt # Python dependencies
├─ platformio.ini # Cấu hình PlatformIO + lib Blynk
├─ diagram.json # Mạch Wokwi
└─ wokwi.toml # Trỏ firmware build output cho Wokwi
esp32dev (ESP32 DevKit)Mở project bằng VS Code (PlatformIO), sau đó:
pio runpio run -t uploadpio device monitor -b 115200Thiết bị kết nối WiFi theo cấu hình trong src/main.cpp (mặc định: Wokwi-GUEST).
Tại thư mục project:
python -m venv .venv
# Windows:
.\.venv\Scripts\activate
pip install -r requirements.txt
python server.py
Server sẽ:
http://localhost:5000/http://localhost:5000/ (hoặc URL ngrok)GET / → trả về trang index.htmlPOST /transcribe (multipart form-data, field audio) → nhận dạng giọng nói và gửi lệnh lên BlynkGET /status → thông tin server/model/device/ngrokVí dụ response /transcribe (rút gọn):
{
"text": "bật đèn phòng ngủ",
"action": 1,
"pins": ["V0"],
"success": true,
"message": "✅ Đã BẬT 💡 Đèn phòng ngủ"
}
Server parse lệnh theo từ khóa (tiếng Việt có/không dấu), ví dụ:
Đối tượng:
V0V4V5Repo đã có diagram.json và wokwi.toml để chạy mô phỏng.
Luồng thường dùng:
pio run).pio/build/esp32dev/firmware.elf/.bin theo wokwi.tomlHiện tại các token (Blynk / Telegram / Ngrok) đang được hard-code trong code:
Trước khi public repo, nên:
secrets.* và thêm vào .gitignoreNếu bạn muốn, mình có thể:
.env) và cập nhật .gitignore để an toàn khi public.Hệ thống điều khiển đèn thông minh dùng ESP32 (PlatformIO/Arduino) kết hợp:
python server.pyhttp://localhost:5000/ (hoặc URL ngrok in trong terminal)flowchart TD
subgraph USER [Lớp Người Dùng - User Layer]
WebUI([Web UI / Voice Input])
Physical([Nút nhấn vật lý])
Telegram([Telegram Bot])
end
subgraph SERVER [Lớp Máy Chủ & AI - Server Layer]
AIServer["Server & AI Pipeline<br>(Flask, Whisper, Parsing Logic)"]
end
subgraph CLOUD [Lớp Đám Mây - IoT Cloud]
Blynk((Blynk Platform))
end
subgraph HARDWARE [Lớp Phần Cứng - Hardware]
ESP32{ESP32 Microcontroller}
Sensors[Cảm biến: LDR, PIR]
Outputs[Đèn LED]
end
%% Các luồng giao tiếp (Data flows)
WebUI -->|Gửi Audio| AIServer
AIServer -->|Gửi lệnh V-PINS| Blynk
Blynk <-->|Đồng bộ Lệnh & Trạng thái| ESP32
Physical -->|Tín hiệu thủ công| ESP32
Sensors -->|Dữ liệu môi trường| ESP32
ESP32 -->|Điều khiển bật/tắt| Outputs
ESP32 -->|Gửi báo cáo log| Telegram
%% Tùy chỉnh màu sắc cơ bản
style USER fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
style SERVER fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
style CLOUD fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
style HARDWARE fill:#fff3e0,stroke:#f57c00,stroke-width:2px
PIR_HOLD_MS (mặc định 10s)Theo src/main.cpp:
| Thiết bị | Chân ESP32 |
|---|---|
| LED1 (Phòng ngủ) | GPIO 26 |
| LED2 (Hành lang) | GPIO 27 |
| LED3 (Sân vườn) | GPIO 14 |
| LDR (ADC) | GPIO 34 |
| PIR (Digital) | GPIO 35 |
| Nút 1 (LED1) | GPIO 18 |
| Nút 2 (LED2) | GPIO 19 |
| Nút 3 (LED3) | GPIO 23 |
Firmware sử dụng các Virtual Pin sau:
V0: điều khiển LED1 (phòng ngủ)V1: đồng bộ trạng thái LED2 (hành lang)V2: đồng bộ trạng thái LED3 (sân vườn)V3: gửi giá trị LDR (để quan sát trên Blynk)V4: lệnh Voice AI cho LED2 (0=Tắt, 1=Bật, 2=Trả về tự động)V5: lệnh Voice AI cho LED3 (0=Tắt, 1=Bật, 2=Trả về tự động)V9: log trạng thái.
├─ src/ # Firmware ESP32 (PlatformIO/Arduino)
│ └─ main.cpp
├─ server.py # Flask server + Whisper ASR + Ngrok
├─ index.html # Web UI (được server.py serve tại /)
├─ requirements.txt # Python dependencies
├─ platformio.ini # Cấu hình PlatformIO + lib Blynk
├─ diagram.json # Mạch Wokwi
└─ wokwi.toml # Trỏ firmware build output cho Wokwi
esp32dev (ESP32 DevKit)Mở project bằng VS Code (PlatformIO), sau đó:
pio runpio run -t uploadpio device monitor -b 115200Thiết bị kết nối WiFi theo cấu hình trong src/main.cpp (mặc định: Wokwi-GUEST).
Tại thư mục project:
python -m venv .venv
# Windows:
.\.venv\Scripts\activate
pip install -r requirements.txt
python server.py
Server sẽ:
http://localhost:5000/http://localhost:5000/ (hoặc URL ngrok)GET / → trả về trang index.htmlPOST /transcribe (multipart form-data, field audio) → nhận dạng giọng nói và gửi lệnh lên BlynkGET /status → thông tin server/model/device/ngrokVí dụ response /transcribe (rút gọn):
{
"text": "bật đèn phòng ngủ",
"action": 1,
"pins": ["V0"],
"success": true,
"message": "✅ Đã BẬT 💡 Đèn phòng ngủ"
}
Server parse lệnh theo từ khóa (tiếng Việt có/không dấu), ví dụ:
Đối tượng:
V0V4V5Repo đã có diagram.json và wokwi.toml để chạy mô phỏng.
Luồng thường dùng:
pio run).pio/build/esp32dev/firmware.elf/.bin theo wokwi.tomlHiện tại các token (Blynk / Telegram / Ngrok) đang được hard-code trong code:
Trước khi public repo, nên:
secrets.* và thêm vào .gitignoreNếu bạn muốn, mình có thể:
.env) và cập nhật .gitignore để an toàn khi public.