• (4)ESP32 Python 用OLED播放Bad Apple


    之前已经实现过了,把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卡当中进行播放哦。

  • 相关阅读:
    ESP8266 wifi钓鱼
    九,ESP8266 判断是断电上电(强制硬件复位)之后运行的内部程序还是内部软件复位之后运行的程序(基于Lua脚本语言)
    关于Http 传输二维json
    Android6.0权限大全和权限分类
    Android 多线程-----AsyncTask详解
    关于加密(转载文章)
    java基础之:匿名内部类
    系统吞吐量(TPS)、用户并发量、性能测试概念和公式
    java多线程之:SynchronousQueue队列
    Hibernate之:各种主键生成策略与配置详解
  • 原文地址:https://www.cnblogs.com/voidxy/p/15828672.html
Copyright © 2020-2023  润新知