01 · Lý thuyết ngắn gọn
Một hệ AI phần cứng cần "phanh an toàn"
ESP32-S3 ghi âm qua I²S, gửi WebSocket tới máy chủ VatLi365. Máy chủ nhận dạng lời nói, gọi DeepSeek để hiểu ý định và phát câu trả lời qua loa.
Lệnh đọc trạng thái (đèn đang bật/tắt) thực hiện ngay. Lệnh làm thay đổi phần cứng (bật/tắt đèn) phải đi qua 3 trạng thái pending → confirmed → consumed — AI chỉ được hỏi lại, không được tự bật; người dùng phải xác nhận rõ ràng ở lượt thoại kế tiếp; token dùng một lần, hết hạn sau 30 giây.
02 · Kết nối
Linh kiện & sơ đồ GPIO
| Linh kiện | Thông số / ghi chú | SL |
|---|---|---|
| ESP32-S3 DevKit | N16R8: 16 MB Flash, 8 MB PSRAM Octal | 1 |
| INMP441 | Micro I²S, chân L/R nối GND | 1 |
| MAX98357A | DAC + khuếch đại Class D I²S | 1 |
| Loa mini | 4 Ω, 3 W, đường kính 30–40 mm | 1 |
| OLED SSD1306 | 0,96 inch, I²C, 128 × 64 | 1 |
| Relay 5 V | 1 kênh, ưu tiên có cách ly quang | 1 |
| Nguồn & dây nối | USB-C 5 V 2–3 A, breadboard, jumper | 1 bộ |
| Khối | Chân module → ESP32-S3 | Nguồn |
|---|---|---|
| Micro INMP441 | SCK → GPIO41 · WS → GPIO42 · SD → GPIO2 · L/R → GND · GND → GND | VDD 3,3 V |
| Loa MAX98357A | BCLK → GPIO15 · LRC → GPIO16 · DIN → GPIO7 | VIN 5 V |
| OLED SSD1306 | SDA → GPIO8 · SCL → GPIO9 | VCC 3,3 V |
| Relay | IN → GPIO4 | VCC 5 V |
Chung GND. Relay mặc định kích mức thấp (RELAY_ACTIVE_LEVEL = 0), OFF khi khởi động — nếu module của bạn kích mức cao, đổi thành 1 trong config.h trước khi build.
03 · Nạp code
Online hoặc offline
⚠️ Board đang chạy MicroPython (bài Lab khác) sẽ bị xoá hoàn toàn khi nạp — dùng riêng một board N16R8 cho dự án này.
04 · Kiểm thử
Sau khi nạp — đúng thứ tự
- Wi-Fi: lần đầu boot mở hotspot cấu hình — kết nối bằng điện thoại, nhập Wi-Fi thật.
- OLED hiển thị trạng thái kết nối.
- OTA + WSS: log serial kết nối được tới ebook.vatli365.vn, không lỗi.
- Micro & loa: nói được, nghe được câu trả lời.
- Relay: đèn LED gắn relay phải OFF ngay khi board vừa khởi động.
05 · Chạy
Kiểm thử luồng xác nhận đầy đủ
Chỉ làm sau khi mục Kiểm thử đạt hết. Relay phải giữ nguyên ở mọi tình huống trừ tình huống 1:
| Tình huống | Cách thử & kết quả mong đợi |
|---|---|
| 1 · Luồng thuận | "Bật đèn giúp tôi" → AI hỏi lại → lượt kế tiếp "Đồng ý, bật đi" → relay đổi trạng thái. |
| 2 · Từ chối | Lượt kế tiếp nói "Không, đừng bật" → relay giữ nguyên. |
| 3 · Hết hạn 30s | Im lặng quá 30 giây rồi mới "đồng ý" → bị từ chối vì token hết hạn. |
| 4 · Cùng lượt | Nói liền "bật đèn, đồng ý luôn" → phải bị từ chối (chốt an toàn cố ý). |
| 5 · Mất mạng | Rút Wi-Fi 5 giây sau khi AI hỏi xác nhận → relay không đổi trạng thái. |