Giới thiệu
Bài 16 tập trung vào mục tiêu chạy lâu – ổn định – không reset ngẫu nhiên cho ESP32-S3-DevKitC N16R8 CAM. Đây là bài mang tính production, tổng hợp các vấn đề thực tế đã gặp từ Bài 01 đến Bài 15 và đưa ra checklist, kỹ thuật, cùng giải pháp cụ thể để hệ thống chạy 24/7.
Mục tiêu bài học
Sau bài này, bạn sẽ:
- Hiểu rõ các nguyên nhân gây reset: brownout, watchdog, heap/PSRAM leak
- Biết cách đọc log reset reason trên ESP32-S3
- Có checklist tối ưu nguồn, firmware, task, bộ nhớ
- Áp dụng best practices để camera + WiFi + AI chạy lâu
Các nhóm nguyên nhân gây mất ổn định
Nhóm 1: Brownout (sụt áp)
Brownout xảy ra khi điện áp cấp xuống thấp hơn ngưỡng an toàn, ESP32 sẽ tự reset để bảo vệ.
Dấu hiệu:
- Reset khi bật WiFi
- Reset khi camera chụp ảnh / stream
- Serial log có chữ
Brownout detector was triggered
Nguyên nhân phổ biến:
- Nguồn USB yếu
- Dây USB dài, mỏng
- Tải tăng đột ngột (camera + WiFi + audio)
Nhóm 2: Watchdog reset
Watchdog reset xảy ra khi task bị treo hoặc chạy quá lâu mà không trả quyền điều khiển cho hệ thống.
Dấu hiệu:
- Reset sau vài phút
- Log có
Task watchdog got triggered
Nguyên nhân:
- Vòng lặp blocking
- Stream / xử lý ảnh không yield
- Task ưu tiên cao nhưng không delay
Nhóm 3: Thiếu heap / PSRAM
Thiếu bộ nhớ dẫn tới crash hoặc reset không rõ nguyên nhân.
Dấu hiệu:
- Reset khi buffer lớn
- Chạy được một lúc rồi treo
Nguyên nhân:
- Frame size camera quá lớn
- Không trả
camera_fb_t - Leak bộ nhớ
Cách đọc nguyên nhân reset (reset reason)
Đọc qua Serial
#include "esp_system.h"
void printResetReason() {
esp_reset_reason_t reason = esp_reset_reason();
Serial.printf("Reset reason: %d\n", reason);
}
Một số mã thường gặp:
ESP_RST_BROWNOUTESP_RST_TASK_WDTESP_RST_PANIC
Checklist tối ưu nguồn (ưu tiên số 1)
Khuyến nghị nguồn
- 5V ≥ 2A (tối thiểu)
- Dùng adapter rời thay vì cổng PC
- Dây USB ngắn, lõi to
Mẹo giảm sụt áp
- Giảm độ sáng WS2812
- Giảm frame size camera
- Không bật WiFi + camera + audio cùng lúc khi không cần
Tối ưu camera để chạy lâu
Cấu hình camera an toàn
- Frame size: VGA / SVGA
- JPEG quality: 12–15
fb_count = 1nếu không cần tốc độ cao
Luôn trả frame
camera_fb_t *fb = esp_camera_fb_get();
// ... xử lý
esp_camera_fb_return(fb);
Thiếu dòng này = leak PSRAM.
Tối ưu vòng lặp và watchdog
Tránh vòng lặp blocking
Sai:
while (WiFi.status() != WL_CONNECTED) {}
Đúng:
while (WiFi.status() != WL_CONNECTED) {
delay(100);
}
Chia nhỏ xử lý nặng
- Không xử lý ảnh quá lâu trong
loop() - Dùng timer hoặc task riêng
Quản lý heap & PSRAM
Theo dõi bộ nhớ định kỳ
Serial.printf("Heap: %u | PSRAM: %u\n",
ESP.getFreeHeap(), ESP.getFreePsram());
Nếu giảm dần → có leak.
Chiến lược chạy 24/7 (khuyến nghị)
Chiến lược 1: Reset chủ động
- Reset sau mỗi 12h / 24h
- Phòng ngừa leak hiếm
Chiến lược 2: Giảm tải thông minh
- Camera chỉ bật khi cần
- AI chỉ chạy khi có sự kiện
Checklist ổn định nhanh (in ra dán tường)
- Nguồn ≥ 2A
- PSRAM OK
- Không blocking loop
- Trả frame camera
- Theo dõi heap/PSRAM
- Test chạy liên tục ≥ 24h


