Series
Series Lập Trình ESP32-S3-DevKitC N16R8 CAM
  1. Series: Hướng dẫn lập trình ESP32-S3-DevKitC N16R8 CAM – Từ cơ bản tới ứng dụng thực tế
  2. 1ESP32-S3-DevKitC N16R8 CAM: Bài 1- Nhận diện board
  3. 2ESP32-S3-DevKitC N16R8 CAM: Bài 02 -Checklist kiểm tra board mới mua (USB / Flash / PSRAM / LED)
  4. 3ESP32-S3-DevKitC N16R8 CAM: Bài 2.1 – Phân tích chi tiết pinout theo nhóm chức năng (an toàn vs xung đột)
  5. 4ESP32-S3-DevKitC N16R8 CAM: Bài 03 – COM vs USB (Native/OTG) – Dùng cổng nào, cấu hình nào?
  6. 5ESP32-S3-DevKitC N16R8 CAM: Bài 04 – Setup Arduino IDE v2 “đúng chuẩn” (PSRAM / Partition / USB-CDC)
  7. 6ESP32-S3-DevKitC N16R8 CAM: Bài 05 – Đọc pinout theo nhóm chức năng (an toàn vs xung đột)
  8. 7ESP32-S3-DevKitC N16R8 CAM: Bài 06 – Nhóm chân Boot/Strapping & các lỗi boot hay gặp
  9. 8ESP32-S3-DevKitC N16R8 CAM: Bài 07 – UART / I2C / SPI gợi ý mapping “an toàn” cho dự án
  10. 9ESP32-S3-DevKitC N16R8 CAM: Bài 7.1 – Hướng kết nối với các loại màn hình thông dụng
  11. 10ESP32-S3-DevKitC N16R8 CAM: Bài 08 – MicroSD pinout, test đọc/ghi ổn định
  12. 11ESP32-S3-DevKitC N16R8 CAM: Bài 09 — Camera DVP 24-pin – phân biệt OV2640/OV5640 & cấu hình cơ bản
  13. 12ESP32-S3-DevKitC N16R8 CAM: Bài 10 — Demo camera web server – stream ổn định, tối ưu PSRAM/heap
  14. 13ESP32-S3-DevKitC N16R8 CAM: Bài 11 — Chụp ảnh lưu microSD – đặt tên file, timestamp, chống full thẻ
  15. 14ESP32-S3-DevKitC N16R8 CAM: Bài 12 — Test builtin LED RGB WS2812 (GPIO48) và lưu ý nhiễu/nguồn
  16. 15ESP32-S3-DevKitC N16R8 CAM: Bài 13 – Dự án 1: Camera “Nhật ký” (chụp định kỳ + lưu thẻ + xem qua WiFi)
  17. 16ESP32-S3-DevKitC N16R8 CAM: Bài 14 – Dự án Camera an ninh mini
  18. 17ESP32-S3-DevKitC N16R8 CAM: Bai 15 – Dự án trợ lý AI Xiaozhi
  19. 18ESP32-S3-DevKitC N16R8 CAM: Bài 16 – Tập trung vào mục tiêu chạy lâu – ổn định
Kiến thức

ESP32-S3-DevKitC N16R8 CAM: Bài 14 – Dự án Camera an ninh mini

Th1 2026
ESP32-S3-DevKitC N16R8 CAM: Bài 14 – Dự án Camera an ninh mini

Giới thiệu

Bài 14 trình bày một dự án thực tế với ESP32-S3-DevKitC N16R8 CAM: Camera an ninh mini. Thiết bị sẽ chụp ảnh (snapshot) khi xảy ra sự kiện, lưu vào thẻ microSD và có thể xem lại qua WiFi. Bài này tập trung vào tư duy thiết kế, độ ổn định và khả năng chạy lâu dài.

Mục tiêu bài học

Sau bài này, bạn sẽ:

  • Hiểu mô hình camera an ninh chụp ảnh theo sự kiện
  • Biết cách thiết kế luồng xử lý ít tốn bộ nhớ
  • Xây dựng hệ thống snapshot ổn định, chạy 24/7
  • Biết cách mở rộng thêm cảm biến hoặc AI sau này

Tổng quan dự án Camera an ninh mini

Khác với camera stream liên tục, camera an ninh mini chỉ chụp ảnh khi cần, ví dụ:

  • Theo thời gian định kỳ (giả lập sự kiện)
  • Theo nút bấm
  • Theo tín hiệu ngoại vi (PIR, công tắc, UART, I2C)

Cách này giúp:

  • Giảm tải PSRAM và heap
  • Tiết kiệm điện
  • Tăng độ ổn định khi chạy lâu

Kiến trúc tổng thể

Luồng hoạt động cơ bản:

  1. ESP32-S3 khởi động
  2. Khởi tạo camera + microSD
  3. Chờ sự kiện xảy ra
  4. Chụp ảnh
  5. Lưu file vào microSD
  6. Ghi log (nếu cần)
  7. Quay về chế độ chờ

Các loại sự kiện có thể áp dụng

Sự kiện giả lập (để test)

  • Chụp ảnh mỗi 30 giây / 1 phút

Sự kiện bằng nút bấm

  • Nhấn nút → chụp ảnh

Sự kiện bằng cảm biến

  • PIR phát hiện chuyển động
  • Công tắc cửa
  • Tín hiệu từ MCU khác qua UART/I2C

Trong bài này, chúng ta dùng sự kiện giả lập bằng timer để dễ theo dõi và debug.


Quy ước đặt tên file và thư mục

Cấu trúc đề xuất:

/snapshots/
  2025-01-01/
    IMG_0001.jpg
    IMG_0002.jpg

Quy ước tên file:

  • Có tiền tố IMG_
  • Tăng dần theo số thứ tự
  • Tránh trùng tên và dễ duyệt

Khởi tạo camera (nhắc lại)

Sử dụng camera_config_t giống Bài 09 và Bài 10, ưu tiên:

  • Frame size: SVGA hoặc VGA
  • jpeg_quality: 12–15
  • fb_count: 2 (nếu có PSRAM)

Code ví dụ hoàn chỉnh: Camera an ninh mini

#include <Arduino.h>
#include "esp_camera.h"
#include "FS.h"
#include "SD_MMC.h"

unsigned long lastShot = 0;
const unsigned long SNAP_INTERVAL = 30000; // 30 giây
int imageIndex = 0;

void setup() {
  Serial.begin(115200);

  // Khởi tạo SD
  if (!SD_MMC.begin()) {
    Serial.println("Không thể khởi tạo SD_MMC");
    return;
  }

  // Khởi tạo camera (giả lập, cần map đúng GPIO thực tế)
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  config.frame_size = FRAMESIZE_SVGA;
  config.jpeg_quality = 12;
  config.fb_count = 2;

  if (esp_camera_init(&config) != ESP_OK) {
    Serial.println("Camera init thất bại");
    return;
  }

  Serial.println("Camera an ninh mini sẵn sàng");
}

void loop() {
  unsigned long now = millis();

  if (now - lastShot >= SNAP_INTERVAL) {
    lastShot = now;
    takeSnapshot();
  }
}

void takeSnapshot() {
  camera_fb_t *fb = esp_camera_fb_get();
  if (!fb) {
    Serial.println("Chụp ảnh thất bại");
    return;
  }

  String path = "/snapshots/IMG_" + String(imageIndex++) + ".jpg";
  File file = SD_MMC.open(path, FILE_WRITE);
  if (!file) {
    Serial.println("Không mở được file");
    esp_camera_fb_return(fb);
    return;
  }

  file.write(fb->buf, fb->len);
  file.close();

  Serial.println("Đã lưu: " + path);
  esp_camera_fb_return(fb);
}

Lưu ý để chạy ổn định lâu dài

  • Không chụp ảnh quá liên tục
  • Giảm frame size nếu thấy reset
  • Đảm bảo nguồn cấp ổn định (dòng đủ)
  • Test camera độc lập trước khi kết hợp WiFi

Hướng mở rộng trong tương lai

  • Kết hợp PIR để chụp theo chuyển động
  • Gửi ảnh qua WiFi / MQTT
  • Thêm AI nhận diện (người, vật thể)
  • Kết hợp Xiaozhi AI