前言
一直以来,STM32 搭配 OLED 显示屏的**都很常见,但大多数人只是用它来显示文字、波形或者静态图片。有没有想过让 STM32 播放视频?
本篇博客分享一个利用 Python 进行视频数据处理,并通过串口高速传输到 STM32,在 OLED 上进行视频播放的有趣项目。整个过程丝滑流畅,带你感受一下“小屏幕大世界”的魅力。
项目原理
视频帧处理:PC 上用 Python(OpenCV + NumPy)将视频逐帧读取、灰度化、二值化,并转换为 OLED 的显存格式。
高速串口传输:通过串口(921600 波特率)将帧数据传输到 STM32。
STM32 显示驱动:STM32 接收数据后直接写入 OLED 的显存数组,实时刷新显示。
硬件准备
STM32F103C8T6 开发板
0.96 寸 128×64 I2C OLED 显示屏
USB 转 TTL 模块(或开发板自带的串口功能)
杜邦线若干

使用方法
1.硬件连接
按照接线图连接好 OLED 与 STM32。
2.下载固件
将 Keil 工程代码烧录到 STM32。
3.运行 Python 脚本
安装依赖:
pip install numpy
pip install opencv-python
pip install pyserial
修改 serial.Serial('COM3', 921600) 中的串口号为自己的。
修改 cv2.VideoCapture('打篮球.mp4') 为自己的视频文件路径。
4.播放视频
运行 Python 脚本后,STM32 OLED 屏会显示实时视频。按 q 键退出播放。
5.注意事项
串口收发无帧同步机制,建议每次中断后重启 STM32 防止帧错位。
视频过长可适当裁剪,减少传输延迟。
核心代码解析
1.STM32 主程序
int main(void)
{
OLED_Init(); // 初始化 OLED
Serial_Init(); // 初始化串口
OLED_Clear();
OLED_ShowString(40, 24, "START", OLED_8X16);
OLED_Update();
while (1)
{
OLED_Update(); // 刷新 OLED 显存到屏幕
}
}
2.串口中断接收
void USART1_IRQHandler(void)
{
static uint8_t p0 = 0, p1 = 0;
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
uint8_t RxData = USART_ReceiveData(USART1);
OLED_DisplayBuf[p0][p1] = RxData; // 写入显存
p1++;
if (p1 >= 128) { p1 = 0; p0++; if (p0 >= 8) p0 = 0; }
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}
3.Python 视频处理与发送
def img2array(frame):
array = np.zeros((8, 128), dtype='uint8')
for j in range(64):
for i in range(128):
if frame[j] > 0:
array[j // 8] |= (0x01 << (j % 8))
return array
cap = cv2.VideoCapture('打篮球.mp4')
serial_port = serial.Serial('COM3', 921600)
while cap.isOpened():
ret, img = cap.read()
if not ret: break
img = cv2.resize(img, (128, 64))
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.threshold(img, 170, 255, cv2.THRESH_BINARY)[1]
serial_port.write(img2array(img))
总结
本项目充分发挥了 STM32 与 Python 的协作优势:
Python 负责繁重的视频解码与图像处理
STM32 专注于高速接收和 OLED 显示
最终实现了在小小的 OLED 屏幕上播放视频的效果。
虽然帧率与分辨率有限,但这是个非常适合入门图形处理与嵌入式串口通信的有趣项目。
下一步升级:可加入帧同步协议、压缩算法、SD 卡缓存等,让播放更流畅稳定。
————————————————
版权声明:本文为CSDN博主「jingjing~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhu_xian_gang/article/details/150147038
|