惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
MyScale Blog
MyScale Blog
雷峰网
雷峰网
量子位
小众软件
小众软件
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
T
Tailwind CSS Blog
月光博客
月光博客
博客园 - 【当耐特】
博客园_首页
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
IT之家
IT之家
爱范儿
爱范儿
阮一峰的网络日志
阮一峰的网络日志
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
The Cloudflare Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
SegmentFault 最新的问题
人人都是产品经理
人人都是产品经理
V
V2EX
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园 - ScottX

(7)ESP32 Python 使用看门狗 脱坑HC-SR04 (6)ESP32+Python 做一个超声波探测器 (5)ESP32+Python使用Socket传输播放Bad Apple (3)ESP32 Python 制作一个办公室温度计 (2)用Micropython将ESP32数据上云 (1)Micropython+ESP32 点亮一个LED [爱偷懒的程序员系列]-Section 4. 自定义钉钉消息推送 [爱偷懒的程序员系列]-Section 3. 链接钉钉审批流 [爱偷懒的程序员系列]-Section 2. 从改变钉钉审批开始 [爱偷懒的程序员系列]-Section 1. “懒”是一切需求的根源 回来了回来了,失踪人口回归 ADF 入门帮助 [Java]Java分层概念(转) Scurm 术语 关于敏捷的几个概念 数据迁移测试方法【转】 【转载】工作流模式与K2实现--(2) 【转载】工作流模式与K2实现--(1) 【转载】 K2 blackpearl 中的业务规则(Rules)
(4)ESP32 Python 用OLED播放Bad Apple
ScottX · 2022-01-20 · via 博客园 - ScottX

之前已经实现过了,把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

调用代码

bad_apple_oled = BadAppleOled()
bad_apple_oled.init_oled()
bad_apple_oled.show_pic()

最终结果如下
image

代码解释:

  1. 首先将文件读取成二进制 with open(show_pbm, 'rb')
  2. 将文件转换成字节数组 data = bytearray(f.read())
  3. 将图片的字节数组送入 framebuf ,并指定大小。 fbuf= framebuf.FrameBuffer(data,128,64, framebuf.MONO_HLSB)
  4. 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

image

但是,一般视屏都会很长的,不可能无限制的全部装在在ESP32当中。所以,有TF接口的开发板可以将图片存在SD卡当中进行播放哦。