MiBeeCam v0.2.0 发布 —— 单芯片智能摄像头固件的进化

1 阅读5分钟

标签: ESP32-S3 OV2640 ESP-IDF 嵌入式 智能摄像头 开源硬件


引言

从 v0.1.0 到 v0.2.0,MiBeeCam 完成了从"能用"到"可靠"的蜕变。

在过去的一个多月里,我们对固件进行了 17 个文件的修改、980 行新增、369 行删除,解决了 13 个已知可靠性问题,覆盖 WiFi 连接、MJPEG 视频流、运动检测、配置管理和系统稳定性五个核心领域。

这篇文章将带您了解 v0.2.0 的核心改进、背后的工程技术决策,以及 MiBeeCam 项目的定位与愿景。


项目概览

MiBeeCam 是一个基于 ESP-IDF v5.4.3 开发的纯 C 固件,运行在 ESP32-S3-A10 开发板上,配备 OV2640 (8225N) 图像传感器。

它不依赖任何云服务,不需要订阅,不涉及复杂的服务器部署。一个芯片,一个固件,就是一个完整的智能摄像头系统:

功能说明
📷 实时监控MJPEG 视频流,最高 15 FPS,支持 2 路并发
🚨 运动检测帧差算法,可配置灵敏度与冷却时间
☁️ 自动上传检测到运动自动上传 JPEG 到远程服务器
🌐 Web 管理内置 Web UI + REST API 全套管理接口
⚙️ 配置持久化NVS 存储,浏览器一键修改,v1→v2 自动迁移
📊 健康监控Prometheus 兼容的 /metrics 端点
💡 状态指示GPIO 10 LED 提供视觉状态反馈

v0.2.0 核心改进

1. WiFi 连接可靠性重构

问题: 在 v0.1.0 中,如果 WiFi 连接失败(密码错误、信号弱、路由器重启),固件会停止重试,导致设备永久离线。

解决:

旧行为: STA connect → fail → 停止
新行为: STA connect → fail → 等待 5s → 重试(无限)
  • 支持 WPA2-PSK / WPA3-SAE / WPA2/WPA3 混合 所有认证模式
  • 引入 wifi_state_cb 回调机制,WiFi 依赖服务按状态启动/停止
  • 连接超时从 10s 延长到 15s,应对慢速路由器
  • 启动时主动扫描目标 SSID,避免盲目连接

关键代码变更: main/wifi_manager.c (+65 行), main/main.c (+26 行)

2. MJPEG 视频流冻结修复

问题: 由于 fb_count=1(PSRAM 禁用限制),当运动检测模块持有 framebuffer 时,MJPEG 流线程会超时等待,导致预览页面卡死。

解决:

旧: streamer lock fb → motion lock fb → 死等
新: motion 使用回调复制 JPEG 数据 → 立即释放 fb → streamer 顺畅运行
  • 帧缓冲最长等待时间从 500ms 降到 200ms
  • 引入 mjpeg_streamer_capture_and_feed 原子操作

关键代码变更: main/mjpeg_streamer.c (+28 行), main/motion_detect.c (+174/–重构)

3. 运动检测算法优化

问题: 原始帧差算法将整帧写入文件系统再读取比较,I/O 开销巨大,且偶发误报。

解决:

  • 采样-释放模式: 拍摄 → 处理 → 立即释放 framebuffer,不持有
  • 像素点下采样 (SAMPLE_STEP=4),大幅减少计算量
  • 可配置阈值和冷却时间,通过 Web UI 实时调整
  • 远程上传失败重试机制(3 次重试,2 秒间隔)

4. Web 配置热应用

问题: 以前修改配置必须重启设备才能生效。

解决: v0.2.0 支持运行时热应用配置——WiFi 凭据、分辨率、帧率、JPEG 质量等参数修改后即时生效,无需重启。

关键代码变更: main/web_server.c (+63 行)

5. 状态 LED 改进

新增 LED 指示模式:

模式闪烁方式含义
启动快速闪烁 (100ms)系统初始化中
AP 模式慢速闪烁 (500ms)等待用户配置
连接中双闪模式WiFi 正在连接
正常运行常亮一切正常
错误SOS 模式 (···---···)系统异常

技术亮点

为什么不用 LuatOS?

尽管仓库名包含 "luatos",该项目实际上是 纯 ESP-IDF C 固件。原因:

  1. 性能: ESP-IDF 提供更底层、更精细的硬件控制
  2. 内存: 禁用 PSRAM 后 DRAM 仅 512KB,需要极致优化
  3. 相机驱动: esp32-camera 组件天然与 ESP-IDF 深度集成
  4. 调试: ESP-IDF 的日志、错误处理、WiFi 诊断工具更完善

禁用 PSRAM 的代价

这块板子有 8MB Octal PSRAM,但所有 14 种时序配置都导致启动崩溃。禁用后:

影响应对
fb_count=1采样-释放模式,回调上传而非持有帧
无 OTA 双分区factory 分区 3.5MB,固件 1.05MB,余量 69%
无 HTTPSLAN 环境,HTTP 足够
无高分辨率VGA 默认,UXGA 可用但帧率受限

启动时序

14 步精密启动序列——顺序至关重要:

 NVS Init → Config Load → LED Init → SPIFFS Mount → Camera Init
     ↓
 WiFi Init → Health Monitor → Mode Selection
     ↓
 [STA] WiFi Connect → Streamer → Web Server → NTP → Motion → Button
 [AP]  Web Server Only

相机必须在 WiFi 之前初始化,否则 I2C 总线冲突。


REST API 速览

# 获取系统状态
curl http://192.168.1.100/api/status

# 获取当前配置
curl http://192.168.1.100/api/config

# 修改 WiFi 配置(热应用)
curl -X POST http://192.168.1.100/api/config \
  -H "Content-Type: application/json" \
  -d '{"wifi_ssid":"MyNetwork","wifi_pass":"MyPassword"}'

# 抓拍单帧 JPEG
curl http://192.168.1.100/capture -o snapshot.jpg

# 查看 MJPEG 视频流(在浏览器中)
# http://192.168.1.100/stream

# Prometheus 指标
curl http://192.168.1.100/metrics

# 重启设备
curl -X POST http://192.168.1.100/api/reboot

如何上手

所需硬件

  • LuatOS ESP32-S3-A10 开发板 × 1
  • USB-C 数据线 × 1
  • 5V/2A 电源适配器 × 1

刷机步骤

1. 构建固件

idf.py set-target esp32s3
idf.py build

2. 刷写固件 + 文件系统

idf.py -p COMx flash
python $IDF_PATH/components/spiffs/spiffsgen.py 0x3CE000 main/web_ui build/spiffs.bin
python -m esptool --chip esp32s3 -p COMx write_flash 0x392000 build/spiffs.bin

3. 首次配置

设备启动后进入 AP 模式:

  1. 连接 WiFi MiBeeCam(密码 12345678
  2. 浏览器打开 http://192.168.4.1
  3. 配置 WiFi → 保存 → 设备自动重启连接

详情请参考 项目 README


路线图展望

正在规划中的功能(欢迎 PR):

  • WebRTC 低延迟视频流(替代 MJPEG 轮询)
  • ONVIF 兼容(NAS/NVR 集成)
  • 运动检测区域遮挡(只监控画面部分区域)
  • 夜间模式自动切换(红外灯 + 夜视 ISP 配置)
  • MQTT 事件通知(与 Home Assistant 集成)

关于项目

MiBeeCam 是 Mi&Bee Studio 的开源项目,基于 MIT 许可证 发布。


从 v0.1.0 到 v0.2.0,我们修复了 13 个已知问题。下一个里程碑,我们瞄准实时视频和智能家居集成。

欢迎 Star、Fork、PR。