SSD1306 OLED屏的使用

本文介绍SSD1306 OLED屏在ESP32中的使用,程序为MicroPython开发。

SSD1306 OLED屏介绍 

实物图 

SSD1306 OLED屏的使用 

本文中使用的SSD1306 是通过I2C协议进行通信的。 

所需材料 

ESP32开发板(已刷入MicroPython固件,未刷入的小伙伴可以参考我前面的教程) 

ssd1306 

OLED显示屏 

Thonny(其他支持MicroPython开发的IDE皆可) 


连线说明

OLED VCC GND SCL SDA
ESP32 3.3V GND P14 P13

(在ESP32中,SCL与SDA可选择其他引脚)


代码函数说明 

I2C库的部分引用说明

函数 使用说明
i2c = machine.I2C(scl,sda) 构建 I2C 对象。 scl:时钟引脚; sda:数据引脚。
i2c.scan() 扫描 I2C 总线的设备。返回地址,如: 0x3c;
i2c.readfrom(addr,nbytes) 从指定地址读数据。 addr:指定设备地址; nbytes:读取字节数;
i2c.write(buf) 写数据。 buf:数据内容

SSD1306库部分引用说明

函数 使用方法
oled = SSD1306_I2C(width, height, i2c, addr) 构建 OLED 显示屏对象。 width:屏幕宽像素; height: 屏幕高像素; i2c:定义好的 I2C 对象; addr:显示屏设备地址。
oled.text(string,x,y) 将 string 字符写在指定为位置。 string:字符; x:横坐标; y:纵坐标。
oled.show() 执行显示
oled.fill(RGB) 清屏。 RGB: 0 表示黑色, 1 表示白色
核心代码 SSD1306.py
# MicroPython SSD1306 OLED driver, I2C and SPI interfaces

from micropython import const
import framebuf

# register definitions
SET_CONTRAST = const(0x81)
SET_ENTIRE_ON = const(0xA4)
SET_NORM_INV = const(0xA6)
SET_DISP = const(0xAE)
SET_MEM_ADDR = const(0x20)
SET_COL_ADDR = const(0x21)
SET_PAGE_ADDR = const(0x22)
SET_DISP_START_LINE = const(0x40)
SET_SEG_REMAP = const(0xA0)
SET_MUX_RATIO = const(0xA8)
SET_COM_OUT_DIR = const(0xC0)
SET_DISP_OFFSET = const(0xD3)
SET_COM_PIN_CFG = const(0xDA)
SET_DISP_CLK_DIV = const(0xD5)
SET_PRECHARGE = const(0xD9)
SET_VCOM_DESEL = const(0xDB)
SET_CHARGE_PUMP = const(0x8D)

# Subclassing FrameBuffer provides support for graphics primitives
# http://docs.micropython.org/en/latest/pyboard/library/framebuf.html
class SSD1306(framebuf.FrameBuffer):
    def __init__(self, width, height, external_vcc):
        self.width = width
        self.height = height
        self.external_vcc = external_vcc
        self.pages = self.height // 8
        self.buffer = bytearray(self.pages * self.width)
        super().__init__(self.buffer, self.width, self.height, framebuf.MONO_VLSB)
        self.init_display()

    def init_display(self):
        for cmd in (
            SET_DISP,  # display off
            # address setting
            SET_MEM_ADDR,
            0x00,  # horizontal
            # resolution and layout
            SET_DISP_START_LINE,  # start at line 0
            SET_SEG_REMAP | 0x01,  # column addr 127 mapped to SEG0
            SET_MUX_RATIO,
            self.height - 1,
            SET_COM_OUT_DIR | 0x08,  # scan from COM[N] to COM0
            SET_DISP_OFFSET,
            0x00,
            SET_COM_PIN_CFG,
            0x02 if self.width > 2 * self.height else 0x12,
            # timing and driving scheme
            SET_DISP_CLK_DIV,
            0x80,
            SET_PRECHARGE,
            0x22 if self.external_vcc else 0xF1,
            SET_VCOM_DESEL,
            0x30,  # 0.83*Vcc
            # display
            SET_CONTRAST,
            0xFF,  # maximum
            SET_ENTIRE_ON,  # output follows RAM contents
            SET_NORM_INV,  # not inverted
            # charge pump
            SET_CHARGE_PUMP,
            0x10 if self.external_vcc else 0x14,
            SET_DISP | 0x01,  # display on
        ):  # on
            self.write_cmd(cmd)
        self.fill(0)
        self.show()

    def poweroff(self):
        self.write_cmd(SET_DISP)

    def poweron(self):
        self.write_cmd(SET_DISP | 0x01)

    def contrast(self, contrast):
        self.write_cmd(SET_CONTRAST)
        self.write_cmd(contrast)

    def invert(self, invert):
        self.write_cmd(SET_NORM_INV | (invert & 1))

    def rotate(self, rotate):
        self.write_cmd(SET_COM_OUT_DIR | ((rotate & 1) << 3))
        self.write_cmd(SET_SEG_REMAP | (rotate & 1))

    def show(self):
        x0 = 0
        x1 = self.width - 1
        if self.width == 64:
            # displays with width of 64 pixels are shifted by 32
            x0 += 32
            x1 += 32
        self.write_cmd(SET_COL_ADDR)
        self.write_cmd(x0)
        self.write_cmd(x1)
        self.write_cmd(SET_PAGE_ADDR)
        self.write_cmd(0)
        self.write_cmd(self.pages - 1)
        self.write_data(self.buffer)


class SSD1306_I2C(SSD1306):
    def __init__(self, width, height, i2c, addr=0x3C, external_vcc=False):
        self.i2c = i2c
        self.addr = addr
        self.temp = bytearray(2)
        self.write_list = [b"\x40", None]  # Co=0, D/C#=1
        super().__init__(width, height, external_vcc)

    def write_cmd(self, cmd):
        self.temp[0] = 0x80  # Co=1, D/C#=0
        self.temp[1] = cmd
        self.i2c.writeto(self.addr, self.temp)

    def write_data(self, buf):
        self.write_list[1] = buf
        self.i2c.writevto(self.addr, self.write_list)


class SSD1306_SPI(SSD1306):
    def __init__(self, width, height, spi, dc, res, cs, external_vcc=False):
        self.rate = 10 * 1024 * 1024
        dc.init(dc.OUT, value=0)
        res.init(res.OUT, value=0)
        cs.init(cs.OUT, value=1)
        self.spi = spi
        self.dc = dc
        self.res = res
        self.cs = cs
        import time

        self.res(1)
        time.sleep_ms(1)
        self.res(0)
        time.sleep_ms(10)
        self.res(1)
        super().__init__(width, height, external_vcc)

    def write_cmd(self, cmd):
        self.spi.init(baudrate=self.rate, polarity=0, phase=0)
        self.cs(1)
        self.dc(0)
        self.cs(0)
        self.spi.write(bytearray([cmd]))
        self.cs(1)

    def write_data(self, buf):
        self.spi.init(baudrate=self.rate, polarity=0, phase=0)
        self.cs(1)
        self.dc(1)
        self.cs(0)
        self.spi.write(buf)
        self.cs(1)
main.py
from machine import I2C,Pin #从 machine 模块导入 I2C、 Pin 子模块
from SSD1306 import SSD1306_I2C #从 ssd1306 模块中导入 SSD1306_I2C 子模块
import time

i2c = I2C(sda=Pin(13), scl=Pin(14)) #I2C 初始化: sda-->13, scl -->14
#OLED 显示屏初始化: 128*64 分辨率,OLED 的 I2C 地址是 0x3c

oled = SSD1306_I2C(128, 64, i2c, addr=0x3c)
while True:
    oled.fill(0) ###清空当前屏幕,当1时,填充满屏幕
    oled.show()  ###显示
    time.sleep(1)  ###等待1秒
        
    oled.rect(0, 0, 128, 64, 1)
    oled.show()
    time.sleep(1)
        
    oled.rect(32, 16, 64, 32, 1)
    oled.show()
    time.sleep(1)
        
    oled.fill(0)  # 清空内容后再单独绘制字符
    oled.text("MicroPython test", 0, 20)  #在指定位置显示英文字符
    oled.show()
    time.sleep(1)

———————————————— 

链接:https://blog.csdn.net/weixin_44186593/article/details/121649644

- 本文内容来自网络,如有侵权,请联系本站处理。

2023-10   阅读(784)   评论(0)
 标签: 创客 ESP32 OLED MicroPython

涨知识
摩尔斯电码

摩尔斯电码(Morse code)也被称作摩斯密码,是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。

评论:
相关文章
【ESP32 C++教程】Unit4-2 模拟量传感器

本小节讲解模拟量传感器使用,旋转电位器,DHT11温湿度传感器和实现自定义传感器类。


【ESP32 C++教程】Unit4-1 数字量传感器

本小节讲解Sensor类及派生类、数字量传感器使用和传感器的推荐交互流程。


【ESP32 C++教程】Unit3-2 触摸输入

本小节讲解ESP32内置触摸引脚的用法,


【ESP32 C++教程】Unit3-1 按键输入

本小节主要介绍按键信号转换、Button类及派生类、和Button交互推荐流程。


【ESP32 C++教程】Unit2-2 Ws2812灯珠

本小节主要介绍Ws2812灯珠的使用、对父类进行扩展实现自定义功能,和指针向下强制转换的使用。


【ESP32 C++教程】Unit2-1 RGB三色LED

本小节主要介绍RGB三色LED的使用,以及多态的具体实现。


【ESP32 C++教程】Unit1-3 ESP32 Arduino 开发框架

ESP32 Arduino Framework是专门针对ESP32开发板的Arduino应用开发框架,为用户开发IOT应用、HMI应用提供一致的开发体验。


ESPConnect:基于浏览器的ESP32管理器

ESPConnect是一个基于现代浏览器的管理器,在你需要快速验证、调试、管理文件、检查状态的时候,它能帮你省下大量打开和切换重型工具的时间。


用ESP32做一个FM收音机

本文介绍两种使用TEA5767收音机模块实现FM收音机的方案,感兴趣的朋友可在此基础上实现更丰富的功能。


GPIOViewer:让ESP32引脚状态一览无余!

GPIOViewer 是一个强大的 Arduino 库,专门为 ESP32 芯片设计,可以实时监控 ESP32 芯片上的所有 GPIO 引脚状态。它可以帮助你快速直观地了解每个引脚的当前状态,例如高电平、低电平、输入、输出、中断等等。