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   阅读(894)   评论(0)
 标签: 创客电子 ESP32 OLED MicroPython

涨知识
新冠肺炎

新型冠状病毒肺炎(Corona Virus Disease 2019,COVID-19),简称“新冠肺炎”,世界卫生组织命名为“2019冠状病毒病” [1-2] ,是指2019新型冠状病毒感染导致的肺炎。

评论:
相关文章
【ESP32 C++教程】Unit10-1:音频播放

本小节介绍音频的基础知识、音频开发框架和AudioCodec的简介,用一个音频播放示例来说明音频管道的使用。


MimiClaw – 开源超轻量级AI助手,无需高级运行环境

MimiClaw是基于ESP32-S3芯片的超轻量级AI助手,通过Telegram或WebSocket提供Claude/GPT智能服务。


【ESP32 C++教程】Unit9-2:文件系统应用

本小节是一个Web服务结合SD卡文件系统的应用示例。


【ESP32 C++教程】Unit9-1:文件系统

本节主要讲解FileSystem类的使用,以及Flash文件系统配置和SD存储模块的使用。


【ESP32 C++教程】Unit8-2:Wifi热点和网页上控制设备

本节主要讲解Wifi热点的Web服务使用,以及使用网页交互来控制LED。


【ESP32 C++教程】Unit8-1:WiFi连接和HTTP请求

本节主要讲解WifiBoard类的功能和HTTPClient库及cJSON的使用。


【ESP32 C++教程】Unit7-3:TFT-LCD显示屏

本节主要讲解TFT-LCD显示屏的使用和Window派生类与TFT_eSPI库的使用。


基于STEAM教育和设计思维的初中化学跨学科实践活动——基于血氧指标控制的简易供氧器设计与制作

这篇文章展示了如何将化学与工程、信息技术、现代制造技术紧密结合,以“血氧指标控制的简易供氧器”为载体,组织一次真实的跨学科项目。设计中突出“从需求出发”“闭环控制”“可视化反馈”,不仅呼应了新课标中“跨学科实践”的要求,更贴近生活实际需求,尤其适用于对科技应用、健康关怀有兴趣的学生群体,可作为项目式学习或社团活动的优质课例。


【ESP32 C++教程】Unit7-2:OLED显示屏

本节主要讲解OLED显示屏的使用和Display类及派生类的介绍及使用。


【ESP32 C++教程】Unit7-1:四位7段式数码管

本节主要讲解用TM1650来驱动四位7段式数码管模块的显示使用。