eefocus_4087784 发表于 2026-4-2 10:11:36

零知派——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]
查看完整版本: 零知派——ESP32‑S3 基于 ESP32-CAM 驱动 OV3660 摄像头模块开发