之前已经实现过了,把OLED当作一个状态显示器。但是,仅仅显示文字肯定是不够炫酷的,因为有屏幕的地方就应该有Bad Apple。
这次我们尝试一下把OLED播放一下 Bad Apple.
Bad Apple看似是一段视频,但是我们这么来想这个问题。视频打散成很多张图片,按照每秒12贞的播放,那不就是一个视频了么。
首先,我们来体验一次把图片展示在OLED上面,需要展示的图片要是pbm格式(PBM格式由Jef Poskanzer在20世纪80年代发明,为了便于通过电子邮件,用ASCII码表示单色位图,能够承受一般的文本格式的变动。)
fromssd1306importSSD1306_I2C ,framebuffrommachineimportPin, SoftI2Coled=NoneclassBadAppleOled: definit_oled(self): globaloledi2c=SoftI2C(sda=Pin(21), scl=Pin(22),freq=600000) i2c.scan() print(i2c) oled=SSD1306_I2C(128, 64, i2c) defshow_pic(self): globaloledshow_pbm='/data/pyamp/example/pbm/rangcha.pbm'withopen(show_pbm, 'rb') asf: 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() delfbuf
调用代码
bad_apple_oled=BadAppleOled() bad_apple_oled.init_oled() bad_apple_oled.show_pic()
最终结果如下
代码解释:
- 首先将文件读取成二进制 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() delfbuf
完成了基础的图片展示后,我们尝试一下把一个视频文件的连续PNG转换成pbm并进行展示。
fromssd1306importSSD1306_I2C ,framebuffrommachineimportPin, SoftI2Cimportuosoled=NoneclassBadAppleOled: definit_oled(self): globaloledi2c=SoftI2C(sda=Pin(21), scl=Pin(22),freq=400000) i2c.scan() print(i2c) oled=SSD1306_I2C(128, 64, i2c) defshow_pic(self): globaloledshow_pbm='/data/pyamp/example/pbm/rangcha.pbm'withopen(show_pbm, 'rb') asf: 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() delfbufdefbad_apple_v1(self): globaloledbpm_files_list=uos.listdir('data/pyamp/example/bpm_files') forbpm_entityinbpm_files_list: show_bpm='/data/pyamp/example/bpm_files/'+bpm_entity# print(show_bpm)withopen(show_bpm, 'rb') asf: 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() delfbuf
但是,一般视屏都会很长的,不可能无限制的全部装在在ESP32当中。所以,有TF接口的开发板可以将图片存在SD卡当中进行播放哦。