若该文为原创文章,转载请注明原文出处。
摘要
本文详细介绍了一款基于STM32F103微控制器、OV2640图像传感器和ESP8266 Wi-Fi模块的无线图像采集系统。系统通过OV2640摄像头采集JPEG格式图像数据,经由ESP8266模块以TCP透传方式上传至远端服务器,实现了嵌入式平台的无线图像传输功能。文章从硬件架构、软件设计、通信协议和调试技巧等维度进行全面解析,并提供了完整的代码实现思路,适用于物联网监控、智能家居等应用场景。
关键词:STM32;OV2640;ESP8266;JPEG;无线图传;透传模式
一、引言
在物联网快速发展的背景下,嵌入式图像采集与无线传输需求日益增长。从智能家居监控到工业设备巡检,从农业环境监测到教育科研实验,无线图传技术正在各个领域发挥着重要作用。
OV2640是一款高性价比的200万像素CMOS图像传感器,支持JPEG格式硬件压缩输出,能够有效减少数据传输量。ESP8266作为一款功能完备的Wi-Fi SoC芯片,广泛应用于各类物联网场景。将两者与STM32微控制器相结合,可以构建一套低成本、高效率的无线图像采集解决方案。
本文基于正点原子STM32F103开发板和OV2640摄像头模块,设计并实现了一套完整的无线图传系统。系统通过ESP8266的透传模式,将摄像头采集的JPEG图像数据通过TCP协议上传至远端服务器,实现了"采集-压缩-传输"的全链路功能。
二、系统硬件架构
2.1 核心组件选型
| 组件 | 型号 | 功能说明 |
|---|---|---|
| 主控芯片 | STM32F103 | 图像采集控制、数据处理、外设管理 |
| 图像传感器 | OV2640 | 200万像素CMOS,支持JPEG硬件压缩输出 |
| Wi-Fi模块 | ESP8266 | TCP透传通信,STA模式连接网络 |
| 帧缓存 | SRAM(52KB) | 存储单帧JPEG图像数据 |
2.2 硬件连接
OV2640与STM32之间通过DVP(Digital Video Port)并行接口连接,主要包括:
-
数据总线:PC0~PC7(8位并行数据D0-D7)
-
控制信号:PCLK(PB4)、VSYNC(PD6)、HREF(PC8)
-
配置总线:SCCB(兼容I2C协议),通过PB13(SDA)和PD3(SCL)进行寄存器读写
-
控制引脚:PWDN(PB3)、RST(PB15)
ESP8266与STM32通过USART1(PA9-TX,PA10-RX)进行串口通信,波特率配置为115200。需注意ESP8266的供电为3.3V,不可接入5V电源。
2.3 系统框图

三、系统软件设计
3.1 软件架构
系统软件采用分层模块化设计,主要包括以下层次:
-
硬件驱动层:OV2640驱动(SCCB读写、寄存器配置)、ESP8266驱动(AT指令封装)
-
数据处理层:JPEG图像采集、帧头帧尾检测、数据打包
-
通信层:串口通信、TCP透传、数据发送
-
应用层:主控逻辑、拍照循环控制
3.2 OV2640驱动设计
OV2640的驱动核心是SCCB总线协议,用于读写传感器内部寄存器。主要函数包括:
-
SCCB_WR_Reg():写寄存器 -
SCCB_RD_Reg():读寄存器 -
OV2640_Init():初始化传感器,读取并验证设备ID(MID=0x7FA2,PID=0x2642) -
OV2640_JPEG_Mode():切换至JPEG输出模式 -
OV2640_OutSize_Set():设置输出图像尺寸
初始化流程首先通过SCCB读取OV2640的厂家ID和产品ID进行验证,随后写入预定义的寄存器配置表,完成传感器工作模式的设定。
3.3 JPEG图像采集
JPEG图像采集的核心逻辑如下:
-
将OV2640切换至JPEG模式
-
设置输出尺寸(如320×240)
-
丢弃前10帧,等待自动曝光和白平衡稳定
-
等待VSYNC信号,开始采集一帧数据
-
在PCLK上升沿同步读取8位数据,存入帧缓存
-
在数据中查找JPEG起始标志
0xFF 0xD8和结束标志0xFF 0xD9 -
提取有效JPEG数据
// 核心采集代码示意
while(OV2640_VSYNC==1) // 等待帧开始
{
while(OV2640_HREF) // 行数据有效
{
while(OV2640_PCLK==0);
ov2640_framebuf[jpeglen++] = OV2640_DATA; // 读取数据
while(OV2640_PCLK==1);
}
}
3.4 ESP8266配置与透传
ESP8266的配置通过AT指令完成,主要步骤包括:
-
复位模块 :
AT+RST -
设置STA模式 :
AT+CWMODE=1 -
连接WiFi :
AT+CWJAP="SSID","Password" -
建立TCP连接 :
AT+CIPSTART="TCP","服务器IP",端口 -
开启透传模式 :
AT+CIPMODE=1 -
开始发送 :
AT+CIPSEND
透传模式(透明传输)是指模块不对传输内容做任何改变,仅负责数据的转发。进入透传模式后,所有写入串口的数据都会被直接发送至TCP连接的对端。
退出透传模式需发送+++,且三个+之间需要间隔大于串口组帧时间(约10ms)。
3.5 通信协议设计
系统采用"长度前缀+数据"的通信协议
4字节长度(大端序)\] + \[JPEG图像数据
发送端先通过串口发送4字节的图像长度,再发送完整的JPEG数据。接收端(服务器)根据长度字段解析完整图像。这种设计便于接收端进行数据包的完整性和边界识别。
四、关键代码实现
4.1 主程序流程
int main(void)
{
delay_init(); // 延时初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(9600); // 串口初始化
my_mem_init(SRAMIN); // 内存池初始化
ov2640_framebuf = mymalloc(SRAMIN, 52*1024); // 申请帧缓存
ov2640_speed_ctrl(); // OV2640速度控制
atk_8266_wifista_test(); // ESP8266配置为透传模式
atk_8266_send_cmd(CIPSEND, "OK", 200); // 开始发送命令
while(1)
{
while(OV2640_Init()) // 初始化OV2640,失败则重试
{
printf("OV2640 错误!\r\n");
delay_ms(200);
}
delay_ms(1500);
OV2640_OutSize_Set(320, 240);
ov2640_speed_ctrl();
while(1)
{
while(OV2640_VSYNC) // 等待帧信号
{
ov2640_jpg_photo(); // JPEG拍照并发送
}
}
}
}
4.2 JPEG拍照与发送
u8 ov2640_jpg_photo()
{
// 切换JPEG模式,设置输出尺寸
OV2640_JPEG_Mode();
OV2640_OutSize_Set(OV2640_JPEG_WIDTH, OV2640_JPEG_HEIGHT);
// 丢弃10帧,等待自动调节稳定
for(i=0; i<10; i++)
{
while(OV2640_VSYNC==1);
while(OV2640_VSYNC==0);
}
// 采集JPEG数据
while(OV2640_VSYNC==1)
{
while(OV2640_HREF)
{
while(OV2640_PCLK==0);
ov2640_framebuf[jpeglen++] = OV2640_DATA;
while(OV2640_PCLK==1);
}
}
// 查找JPEG起始和结束标志
// 发送4字节长度 + JPEG数据
// ...
}
4.3 AT指令封装
u8 atk_8266_send_cmd(u8 *cmd, u8 *ack, u16 waittime)
{
USART_RX_STA = 0;
printf("%s\r\n", cmd); // 发送命令
if(ack && waittime) // 需要等待应答
{
while(--waittime)
{
delay_ms(10);
if(USART_RX_STA & 0X8000)
{
if(atk_8266_check_cmd(ack))
break; // 收到期待应答
USART_RX_STA = 0;
}
}
if(waittime == 0) return 1; // 超时
}
return 0;
}
五、调试要点与常见问题
5.1 OV2640初始化失败
现象:读取设备ID为0或异常值
排查方向:
-
检查硬件连接,确认SCCB的SDA和SCL引脚是否正确
-
确认OV2640供电为3.3V,不可接入5V
-
检查PCLK、HREF、VSYNC等时钟信号是否正确
-
尝试断开电源后重新上电,彻底重置硬件状态
5.2 JPEG数据不完整或无法解析
现象:接收端无法正确显示图像
排查方向:
-
确认是否正确找到
0xFF 0xD8(起始)和0xFF 0xD9(结束)标志 -
检查长度字段的发送顺序(大端序)
-
验证帧缓存大小是否足够存储单帧JPEG数据
5.3 ESP8266透传数据丢失
现象:接收端偶尔丢失部分数据
可能原因:
-
ESP8266的串口缓冲区被新数据覆盖
-
波特率过高导致传输不稳定
-
发送速度超过模块处理能力
解决方法:
-
适当降低发送速率或增加帧间隔
-
使用DMA方式进行串口发送,减少CPU干预
-
增加数据校验机制
5.4 JTAG引脚冲突
STM32的PB3、PB4等引脚同时用于JTAG调试和OV2640控制。需在代码中禁用JTAG功能,仅保留SWD调试
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
六、性能与优化
6.1 传输速率
受限于ESP8266串口波特率(典型值115200),系统的图像传输帧率约为12帧/秒。对于320×240的JPEG图像(通常1030KB),单帧传输时间约为1~3秒。
6.2 优化方向
-
提高串口波特率:ESP8266支持更高波特率(如921600),可显著提升传输速度
-
使用DMA传输:减少CPU阻塞,提高数据搬运效率
-
降低图像分辨率:减小单帧数据量,提高帧率
-
升级主控芯片:STM32F4/F7系列具有DCMI硬件接口和更大的处理能力
七、应用场景与扩展
7.1 典型应用场景
-
智能家居监控:实现家庭环境的远程可视化监控
-
工业设备巡检:实时监控设备运行状态
-
农业环境监测:通过图像传输监控作物生长
-
教育科研实验:嵌入式视觉系统的教学与实践平台
7.2 功能扩展建议
-
增加按键触发拍照功能
-
集成MQTT协议,对接主流物联网云平台
-
增加图像质量调节(JPEG压缩比控制)
-
支持远程拍照指令响应
-
添加AirKiss一键配网功能
八、总结
本文基于STM32F103、OV2640和ESP8266设计并实现了一套完整的无线图像采集系统。系统充分利用了OV2640的JPEG硬件压缩能力和ESP8266的TCP透传功能,实现了从图像采集到无线传输的全链路解决方案。
通过模块化的软件设计和清晰的通信协议,该系统具有较好的可移植性和扩展性。开发者可以根据实际需求进行定制化开发,将其应用于各类物联网视觉场景中。
项目的完整代码基于正点原子开发平台,开发者可在其基础上进行二次开发和功能扩展。
附代码:【亲测免费】 STM32f103 物联网OV2640摄像头WIFI传送 - AtomGit | GitCode博客
如有侵权,或需要完整代码,请及时联系博主。