单片机
返回首页

(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


最终结果如下

代码解释:

  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


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

进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 锂离子/锂聚合物USB电池充电器

  • 6晶体管H桥

  • AVR LCD温度计—LM35

  • AVR PC步进电机驱动器

  • AVR温度计TCN75

  • JDM2 PIC 18F 编程器

    相关电子头条文章