Macbook M1芯片通过单片机实现实时监控:Arduino——esp32-CAM(OV2640)——Frigate实时监控

实战派 ESP32-S3,双模无线开发板

ESP32-S3 原生支持 ESP-IDF,WiFi + 蓝牙一次搞定

🧱 总体思路

ESP32-CAM 是一个可以独立运行的微型摄像头模块。我们要做的:

  1. Mac + Arduino IDE 烧录一个 视频流服务器程序 到 ESP32-CAM;
  2. 让 ESP32-CAM 连上 Wi-Fi,并能通过浏览器访问视频;
  3. Frigate(Docker) 中配置这个 IP 视频流作为摄像头输入。

✅ 你需要准备的硬件和软件

硬件:

  • ESP32-CAM 开发板(推荐 AI Thinker)
  • 带 USB 转串口芯片的底座(ESP32-CAM-MB)
  • micro USB 数据线
  • Wi-Fi 热点(可以用手机热点测试,最好是 2.4GHz)【校园网No我的热点有问题使用的随身wifi】

软件:

  • Mac 上安装好的 Arduino IDE(含 ESP32 开发板支持包)
  • 安装好的 Frigate(Docker 版)-【见上篇】

🔌 第一步:连接 ESP32-CAM 与 Mac 电脑

  1. 把 ESP32-CAM 插到 ESP32-CAM-MB 底座上(注意摄像头排线要插紧);
  2. 用 micro USB 数据线连接到底座,再连接到 Mac;
  3. 在开发板上没有按钮操作的情况下,自动进入烧录模式,你不需要手动接线(ESP32-CAM-MB 会自动处理)。
    注意 摄像头安法(小白)
    📦 一、摄像头接口结构简图
    ESP32-CAM 摄像头座(FPC 接口)长这样:

┌─────────────────────────────┐
│ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ ▒ │ ← 白色卡扣(可抬起)
├─────────────────────────────┤
│ 金属触点朝下的排线插入口 │
└─────────────────────────────┘
摄像头模块排线:

棕色软排线

一面有金属触点(金手指),一面是塑料面

✅ 正确方向是:金属触点朝下插入接口

🧠 第二步:Mac 上用 Arduino 烧录视频流服务器程序

1. 配置 Arduino IDE

打开 Arduino IDE:

  • 菜单栏 > Arduino → Preferences → 追加开发板网址:

    https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
    
  • 菜单栏 > Tools → Board → Board Manager → 搜索 ESP32 → 安装Espressif Systems (📌 建议选择版本 3.0.0 或 3.1.1,避免 3.2.0 的 Bug)

  • 验证安装是否成功
    完成安装后,打开终端执行:
    ls ~/Library/Arduino15/packages/esp32/tools/xtensa-esp32-elf/
    你应该看到一个类似:
    esp-2021r2-patch3-8.4.0

2. 选择开发板和端口

  • Tools → Board: AI Thinker ESP32-CAM
  • Tools → Port: 选择 /dev/cu.usbserial-xxxxx(你的串口设备)

3. 打开例程:CameraWebServer

  • 文件 → 示例 → Examples for AI Thinker ESP32-CAM → Camera > CameraWebServer

如果没找到该示例,运行下面的代码:

#include "esp_camera.h"
#include <WiFi.h>

// 替换为你自己的 Wi-Fi 信息
const char* ssid = "YourWiFiName";
const char* password = "YourWiFiPassword";

// AI Thinker 摄像头配置
#define PWDN_GPIO_NUM     -1
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27
#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22

void startCameraServer();

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println(WiFi.localIP());

  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer   = LEDC_TIMER_0;
  config.pin_d0       = Y2_GPIO_NUM;
  config.pin_d1       = Y3_GPIO_NUM;
  config.pin_d2       = Y4_GPIO_NUM;
  config.pin_d3       = Y5_GPIO_NUM;
  config.pin_d4       = Y6_GPIO_NUM;
  config.pin_d5       = Y7_GPIO_NUM;
  config.pin_d6       = Y8_GPIO_NUM;
  config.pin_d7       = Y9_GPIO_NUM;
  config.pin_xclk     = XCLK_GPIO_NUM;
  config.pin_pclk     = PCLK_GPIO_NUM;
  config.pin_vsync    = VSYNC_GPIO_NUM;
  config.pin_href     = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn     = PWDN_GPIO_NUM;
  config.pin_reset    = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;

  config.frame_size = FRAMESIZE_QVGA;
  config.jpeg_quality = 10;
  config.fb_count = 1;

  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  startCameraServer();
}

#include <WebServer.h>
WebServer server(80);

void handle_jpg_stream(void) {
  WiFiClient client = server.client();
  String response = "HTTP/1.1 200 OK\r\n";
  response += "Content-Type: multipart/x-mixed-replace; boundary=frame\r\n\r\n";
  server.sendContent(response);

  while (1) {
    camera_fb_t * fb = esp_camera_fb_get();
    if (!fb) break;

    response = "--frame\r\n";
    response += "Content-Type: image/jpeg\r\n\r\n";
    server.sendContent(response);
    server.sendContent((const char*)fb->buf, fb->len);
    server.sendContent("\r\n");

    esp_camera_fb_return(fb);
    if (!client.connected()) break;
  }
}

void startCameraServer() {
  server.on("/stream", HTTP_GET, handle_jpg_stream);
  server.begin();
}

void loop() {
  server.handleClient();
}

4. 烧录代码

  • 点击顶部左箭头上传按钮;

  • 若失败,按一下 ESP32-CAM-MB 上的 RST(EN)按钮,再上传;

  • 上传完成后,点击串口监视器(波特率 115200),你会看到:

    WiFi connected
    192.168.1.88
    

📱 第三步:在浏览器查看视频流

在任意设备(Windows 或手机)浏览器中访问:

http://192.168.X.X/stream

可以看到摄像头画面了!确认正常后再进入 Frigate 设置。


🧩 第四步:Windows 上 Frigate 配置 ESP32-CAM 流

假设你已经在 Windows 上安装好 Frigate(Docker),编辑 config.yml,添加一个摄像头配置:

cameras:
  esp32cam:
    ffmpeg:
      inputs:
        - path: http://192.168.X.X/stream
          roles:
            - detect
    detect:
      width: 320
      height: 240
      fps: 5

然后重启 Frigate 容器,看到摄像头显示在线即可。


✅ 总结流程简图

[ESP32-CAM + MB板 + 摄像头] 
       ↓ USB连接
[Mac电脑烧录程序 + 配Wi-Fi]
       ↓ 
[ESP32连上Wi-Fi,输出视频流地址]
       ↓
[Windows浏览器测试视频]
       ↓
[Windows上Frigate配置视频源接入]

实战派 ESP32-S3,双模无线开发板

ESP32-S3 原生支持 ESP-IDF,WiFi + 蓝牙一次搞定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值