零知派——ESP32‑S3 基于 ESP32-CAM 驱动 OV3660 摄像头模块开发
✔零知开源(零知派)是一个专为电子初学者/电子兴趣爱好者设计的开源软硬件平台,在硬件上提供超高性价比STM32系列开发板、物联网控制板。取消了Bootloader程序烧录,让开发重心从 “配置环境” 转移到 “创意实现”,极大降低了技术门槛。零知IDE编程软件,内置上千个覆盖多场景的示例代码,支持项目源码一键下载,项目文章在线浏览。零知开源(零知IDE)平台通过软硬件协同创新,让你的创意快速转化为实物,来动手试试吧!✔访问零知实验室,获取更多实战项目和教程资源吧!
www.lingzhilab.com
项目概述
本文是一个基于 ESP32-S3 微控制器与 OV3660 摄像头模组构建的无线视频监控方案。设备通过 WiFi 连接局域网,内置 HTTP Web 服务器,用户可通过浏览器或手机实时访问视频流。代码针对 OV3660 传感器进行了特定的图像校正与优化,以确保画面方向正确且色彩表现良好。
项目难点及解决方案
问题描述:摄像头帧缓冲非常占用内存
解决方案:软件默认开启 PSRAM 支持
一、硬件准备与电路连接1.1核心硬件清单
组件 型号/规格 数量 备注
主控板 零知ESP32-S3 1 核心控制器,自带WiFi和蓝牙
OV3660模块 零知ESP32-S3扩展板 1 集成OV3660等模块,配套主板,直插即用
1.2 接线方案表 OV3660 支持 10 位数据输出,但 ESP32 通常配置为 8 位模式。这里定义了 8 个引脚 (Y2-Y9),对应 8 位数据宽度。
ESP32-S3引脚 连接模块 功能描述 代码定义
9
XCLK
摄像头主时钟输入 XCLK_GPIO_NUM
17
SIOD
配置数据线 (I2C SDA) SIOD_GPIO_NUM
18
SIOC
配置时钟线 (I2C SCL) SIOC_GPIO_NUM
20
D7 并行数据输入引脚 Y9_GPIO_NUM
10
D6 并行数据输入引脚 Y8_GPIO_NUM
11
D5 并行数据输入引脚 Y7_GPIO_NUM
1
D4 并行数据输入引脚 Y6_GPIO_NUM
39
D3 并行数据输入引脚 Y5_GPIO_NUM
13
D2 并行数据输入引脚 Y4_GPIO_NUM
38
D1 并行数据输入引脚 Y3_GPIO_NUM
2
D0 并行数据输入引脚 Y2_GPIO_NUM
8
VSYNC
帧同步信号 VSYNC_GPIO_NUM
19
HREF
行有效信号 HREF_GPIO_NUM
12
PCLK
像素数据输出时钟 PCLK_GPIO_NUM
1.3 具体接线图 主板和扩展板连接时注意方向,可以根据上下排针的颜色对应连接;
二、安装与使用部分2.1 开源平台-输入"智能小车控制系统"并搜索-代码下载自动打开
2.2 连接-验证-上传
2.3 调试-串口监视器
三、系统代码讲解3.1 初始化OV3660模块
<span style="font-weight: normal;"><font size="2">camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
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_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
config.frame_size = FRAMESIZE_HVGA; // 分辨率:640x480
config.jpeg_quality = 12; // 质量 10~12 较好
config.fb_count = 2; // 使用双帧缓冲节省内存
esp_err_t err = esp_camera_init(&config);</font></span>设置图像格式为 JPEG 格式,它是压缩图片,比原始 RGB 数据小得多,传输速度快;采用 双帧缓冲,可以在摄像头采集下一帧的同时,发送上一帧数据,能让视频流更流畅;
3.2 图像传感器调整 根据实际效果调整摄像头参数
sensor_t *s = esp_camera_sensor_get();
// initial sensors are flipped vertically and colors are a bit saturated
if (s->id.PID == OV3660_PID) {
s->set_vflip(s, 1); // flip it back
s->set_brightness(s, 1); // up the brightness just a bit
s->set_saturation(s, -2);// lower the saturation
}
// drop down frame size for higher initial frame rate
if (config.pixel_format == PIXFORMAT_JPEG) {
s->set_framesize(s, FRAMESIZE_QVGA);
}
#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)
s->set_vflip(s, 1);
s->set_hmirror(s, 1);
#endif
#if defined(CAMERA_MODEL_ESP32S3_EYE)
s->set_vflip(s, 1);
#endif很多摄像头模组安装时是倒置的,所以需要 set_vflip (垂直翻转) 或 set_hmirror (水平镜像);如果摄像头是 OV3660 模块,代码会自动应用一套优化参数;初始化使用 HVGA (480x320),启动后自动切换至 QVGA (320x240) 以提升帧率;
3.3 Wi-Fi 连接与服务器启动 WIFI采用 STA模式,连接相同的网络共享局域网;
WiFi.begin(ssid, password);
WiFi.setSleep(false);
Serial.print("WiFi connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
startCameraServer();
Serial.print("Camera Ready! Use 'http://");
Serial.print(WiFi.localIP());
Serial.println("' to connect");
四、演示视频
效果演示
五、常见问题解答(FAQ)Q1: WIFI连接失败或者访问串口打印地址无效?
A:文章中的WIFI信息需要自己的WIFI修改,且访问IP地址的设备(电脑、手机)需要跟代码中的WIFI一致,这样才能通过局域网访问IP地址;若无WIFI或者WIFI信号较差,可以将模块设置为 AP 模式,如:WiFi.softAP(ssid, password);
Q2: 摄像头初始化失败?
A:这里摄像头的引脚定义是根据零知派ESP32-S3扩展板原理图设定的,如果是外接其他模块,按其原理图修改 camera_config_t 中的引脚定义即可
Q3: 访问页面显示方向错误?
A:扩展板上有可以粘贴摄像头位置,即作为前置摄像头,方向显示正确;若作为后置摄像头或者OV3660出厂设置异常 导致的方向相反,可以设置s->set_vflip(s, 1); s->set_hmirror(s, 1); 这两个来调整方向
页:
[1]