标签:
ESP32-S3OV2640ESP-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 固件。原因:
- 性能: ESP-IDF 提供更底层、更精细的硬件控制
- 内存: 禁用 PSRAM 后 DRAM 仅 512KB,需要极致优化
- 相机驱动:
esp32-camera组件天然与 ESP-IDF 深度集成 - 调试: ESP-IDF 的日志、错误处理、WiFi 诊断工具更完善
禁用 PSRAM 的代价
这块板子有 8MB Octal PSRAM,但所有 14 种时序配置都导致启动崩溃。禁用后:
| 影响 | 应对 |
|---|---|
| fb_count=1 | 采样-释放模式,回调上传而非持有帧 |
| 无 OTA 双分区 | factory 分区 3.5MB,固件 1.05MB,余量 69% |
| 无 HTTPS | LAN 环境,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 模式:
- 连接 WiFi
MiBeeCam(密码12345678) - 浏览器打开
http://192.168.4.1 - 配置 WiFi → 保存 → 设备自动重启连接
详情请参考 项目 README。
路线图展望
正在规划中的功能(欢迎 PR):
- WebRTC 低延迟视频流(替代 MJPEG 轮询)
- ONVIF 兼容(NAS/NVR 集成)
- 运动检测区域遮挡(只监控画面部分区域)
- 夜间模式自动切换(红外灯 + 夜视 ISP 配置)
- MQTT 事件通知(与 Home Assistant 集成)
关于项目
MiBeeCam 是 Mi&Bee Studio 的开源项目,基于 MIT 许可证 发布。
- GitHub: github.com/Mi-Bee-Stud…
- 问题反馈: Issues
- 协议: MIT License
从 v0.1.0 到 v0.2.0,我们修复了 13 个已知问题。下一个里程碑,我们瞄准实时视频和智能家居集成。
欢迎 Star、Fork、PR。