IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

ESP32-S3-DevKitC N16R8 CAM: Bài 16 – Tập trung vào mục tiêu chạy lâu – ổn định

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_BROWNOUT
  • ESP_RST_TASK_WDT
  • ESP_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 = 1 nế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