(4)ESP32 Python 用OLED播放Bad Apple
2025-08-14 来源:jianshu
之前已经实现过了,把OLED当作一个状态显示器。但是,仅仅显示文字肯定是不够炫酷的,因为有屏幕的地方就应该有Bad Apple。
这次我们尝试一下把OLED播放一下 Bad Apple.
Bad Apple看似是一段视频,但是我们这么来想这个问题。视频打散成很多张图片,按照每秒12贞的播放,那不就是一个视频了么。
首先,我们来体验一次把图片展示在OLED上面,需要展示的图片要是pbm格式(PBM格式由Jef Poskanzer在20世纪80年代发明,为了便于通过电子邮件,用ASCII码表示单色位图,能够承受一般的文本格式的变动。)
from ssd1306 import SSD1306_I2C ,framebuf
from machine import Pin, SoftI2C
oled = None
class BadAppleOled:
def init_oled(self):
global oled
i2c = SoftI2C(sda=Pin(21), scl=Pin(22),freq=600000)
i2c.scan()
print(i2c)
oled = SSD1306_I2C(128, 64, i2c)
def show_pic(self):
global oled
show_pbm = '/data/pyamp/example/pbm/rangcha.pbm'
with open(show_pbm, 'rb') as f:
f.readline()
f.readline()
data = bytearray(f.read())
fbuf= framebuf.FrameBuffer(data,128,64, framebuf.MONO_HLSB)
oled.fill(0)
oled.blit(fbuf, 0,0)
oled.show()
del fbuf
调用代码
oled.fill(0)
oled.blit(fbuf, 0,0)
oled.show()
del fbuf
最终结果如下

代码解释:
首先将文件读取成二进制 with open(show_pbm, 'rb')
将文件转换成字节数组 data = bytearray(f.read())
将图片的字节数组送入 framebuf ,并指定大小。 fbuf= framebuf.FrameBuffer(data,128,64, framebuf.MONO_HLSB)
OLED 清屏, 并展示framebuf内容,展示完成后,删除 framebuf
oled.fill(0)
oled.blit(fbuf, 0,0)
oled.show()
del fbuf
完成了基础的图片展示后,我们尝试一下把一个视频文件的连续PNG转换成pbm并进行展示。
from ssd1306 import SSD1306_I2C ,framebuf
from machine import Pin, SoftI2C
import uos
oled = None
class BadAppleOled:
def init_oled(self):
global oled
i2c = SoftI2C(sda=Pin(21), scl=Pin(22),freq=400000)
i2c.scan()
print(i2c)
oled = SSD1306_I2C(128, 64, i2c)
def show_pic(self):
global oled
show_pbm = '/data/pyamp/example/pbm/rangcha.pbm'
with open(show_pbm, 'rb') as f:
f.readline()
f.readline()
data = bytearray(f.read())
fbuf= framebuf.FrameBuffer(data,128,64, framebuf.MONO_HLSB)
oled.fill(0)
oled.blit(fbuf, 0,0)
oled.show()
del fbuf
def bad_apple_v1(self):
global oled
bpm_files_list = uos.listdir('data/pyamp/example/bpm_files')
for bpm_entity in bpm_files_list:
show_bpm = '/data/pyamp/example/bpm_files/'+bpm_entity
# print(show_bpm)
with open(show_bpm, 'rb') as f:
f.readline()
f.readline()
data = bytearray(f.read())
fbuf= framebuf.FrameBuffer(data,128,64, framebuf.MONO_HLSB)
oled.fill(0)
oled.blit(fbuf, 0,0)
oled.show()
del fbuf

但是,一般视屏都会很长的,不可能无限制的全部装在在ESP32当中。所以,有TF接口的开发板可以将图片存在SD卡当中进行播放哦。
- ESP32/8266固件备份方法
- upyOS:基于 MicroPython 的模块化操作系统,兼容 ESP32、RP2040 等微控制器
- ESP32与STM32哪个更适合初学者?问题解析与对比
- STM32与ESP32核心应用场景解析及PCB设计实践(深度探讨)
- ESP32与STM32:比较并非明智之举
- ESP32与STM32:性能对比分析及选型指南
- STM32与ESP32:核心差异详解
- 串口、并口、USB、UART及RS232/RS485接口与ESP32、STM32的应用解析
- ESP32音频输入-MAX4466,MAX9814,SPH0645LM4H,INMP441
- ESP32 ADF windows开发环境搭建 适配ADF到ESP32A1S
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- 蓝牙信道探测技术原理与开发套件实践
- 意法半导体中国本地造STM32微控制器启动规模量产




