ESP32开发之旅——ssd1306 OLED屏的使用
ESP32开发之旅——ssd1306 OLED屏的使用
前言
- 在本文中,您将学会ssd1306 OLED屏在ESP32中的使用,本文提供了简单的示例供学习参考。
- 需要注意的是,本文中的ESP32是使用Micro Python进行开发的,(同时ESP8266也可按照本文进行开发)。
- 对ssd1306 OLED屏熟悉的小伙伴可以直接跳至正文部分
SSD1306 OLED屏介绍
实物图
本文中使用的SSD1306 是通过I2C协议进行通信的。
什么是I2C协议?
I2C 是用于设备之间通信的双线协议,在物理层面,它由 2 条线组成: SCL 和SDA,分别是时钟线和数据线。也就是说不通设备间通过这两根线就可以进行通信。
什么是OLED显示屏?
OLED 的特性是自己发光,不像 TFT LCD 需要背光,因此可视度和亮度均高,其次是电压需求低且省电效率高,加上反应快、重量轻、厚度薄,构造简单,成本低等特点。简单来说跟传统液晶的区别就是里面像素的材料是由一个个发光二极管组成,因为密度不高导致像素分辨率低,所以早期一般用作户外 LED 广告牌。随着技术的成熟,使得集成度越来越高。小屏也可以制作出较高的分辨率。
正文
所需材料
- 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 interfacesfrom 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 = widthself.height = heightself.external_vcc = external_vccself.pages = self.height // 8self.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 settingSET_MEM_ADDR,0x00, # horizontal# resolution and layoutSET_DISP_START_LINE, # start at line 0SET_SEG_REMAP | 0x01, # column addr 127 mapped to SEG0SET_MUX_RATIO,self.height - 1,SET_COM_OUT_DIR | 0x08, # scan from COM[N] to COM0SET_DISP_OFFSET,0x00,SET_COM_PIN_CFG,0x02 if self.width > 2 * self.height else 0x12,# timing and driving schemeSET_DISP_CLK_DIV,0x80,SET_PRECHARGE,0x22 if self.external_vcc else 0xF1,SET_VCOM_DESEL,0x30, # 0.83*Vcc# displaySET_CONTRAST,0xFF, # maximumSET_ENTIRE_ON, # output follows RAM contentsSET_NORM_INV, # not inverted# charge pumpSET_CHARGE_PUMP,0x10 if self.external_vcc else 0x14,SET_DISP | 0x01, # display on): # onself.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 = 0x1 = self.width - 1if self.width == 64:# displays with width of 64 pixels are shifted by 32x0 += 32x1 += 32self.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 = i2cself.addr = addrself.temp = bytearray(2)self.write_list = [b"\x40", None] # Co=0, D/C#=1super().__init__(width, height, external_vcc)def write_cmd(self, cmd):self.temp[0] = 0x80 # Co=1, D/C#=0self.temp[1] = cmdself.i2c.writeto(self.addr, self.temp)def write_data(self, buf):self.write_list[1] = bufself.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 * 1024dc.init(dc.OUT, value=0)res.init(res.OUT, value=0)cs.init(cs.OUT, value=1)self.spi = spiself.dc = dcself.res = resself.cs = csimport timeself.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 timei2c = I2C(sda=Pin(13), scl=Pin(14)) #I2C 初始化: sda-->13, scl -->14
#OLED 显示屏初始化: 128*64 分辨率,OLED 的 I2C 地址是 0x3coled = 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)
结尾
参考文献:
- ssd1306库(github搬运)
- 《MicroPython从0到1》
ESP32开发之旅——ssd1306 OLED屏的使用相关推荐
- 物联网开发笔记(48)- 使用Micropython开发ESP32开发板之控制OLED ssd1306屏幕
一.目的 这一节我们学习如何使用我们的ESP32开发板来控制OLED ssd1306屏幕,此处使用的是I2C协议,大家可自行百度学习一下I2C. 二.环境 ESP32 + OLED ssd1306屏幕 ...
- ESP32开发之旅——人体感应传感器HC-SR501
ESP32开发之旅--人体感应传感器HC-SR501 前言 在本文中,您将学会HC-SR501人体感应传感器在ESP32中的使用,本文提供了简单的示例供学习参考. 需要注意的是,本文中的ESP32是使 ...
- ESP32开发之旅——RC522模块的使用
ESP32开发之旅--RC522模块的使用 前言 在本文中,您将学会如何使用ESP32连接RFID模块RC522,本文提供了简单的示例供学习参考. 需要注意的是,本文中的ESP32是使用Micro P ...
- ESP32开发之旅——AS608指纹识别模块
ESP32开发之旅--AS608指纹识别模块) 前言 本文中,您将了解到如何使用ESP32调用AS608指纹识别模块. 需要注意的是,本文中的ESP32是使用Micro Python进行开发的,(同时 ...
- ESP32开发之旅——基于ESP32的室内空气质量检测系统
ESP32开发之旅--基于ESP32的室内空气质量检测系统 前言 成果展示 核心代码 MQTT部分 获取传感器数据部分 连接WiFi部分 结尾 前言 本文主要是我课设项目的一个备忘,部分资料来源于网上 ...
- ESP32开发之旅——MicroPython介绍
ESP32开发之旅--MicroPython介绍 什么是ESP32 为什么使用MicroPython开发ESP32 参考文献链接 什么是ESP32 ESP32是由我国乐鑫公司继ESP8266芯片后推出 ...
- ESP32开发之旅——搭建MicroPython开发环境
ESP32开发之旅--搭建MicroPython开发环境 获取ESP32-MicroPython固件 写入固件 编译器配置 编写第一行代码--Hello World 结尾 获取ESP32-MicroP ...
- ESP32 开发之旅② Arduino For ESP32说明
从这一篇开始,博主将会带领各位读者进入ESP32开发的征程.在此,博主认为各位读者已经具备以下前提: 读者具有C语言以及Arduino的开发知识: 读者了解过博主的ESP8266开发系列: 读 ...
- 【嵌入式系统开发16】基于OLED屏显和汉字点阵编码原理显示姓名学号,湿度温度,滚动长字符
要求 理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能: 显示自己的学号和姓名: 显示AHT20的温度和湿度: 上下或左右的滑动显示长字符,比如"H ...
最新文章
- Ruby的Singleton method
- 255套绝美ppt模板!适用于总结汇报、形象宣传、授课培训、项目介绍、毕业答辩等...
- jQuery将不再支持IE6/7/8
- 简练软考知识点整理-规划风险应对
- Linux Shell 通配符、元字符、转义符使用实例介绍
- c语言每次堆的变化是1k,DSPXC语言+程序烧写讲述.ppt
- C++语言string类介绍和示例
- Cheatsheet: 2014 03.01 ~ 03.31
- 在网页中引用DWG控件,交互绘图,和响应鼠标点击对象的方法
- 转载 :sql server 2005 无法删除数据库 #Test,因为该数据库当前正在使用
- 【原创】构建高性能ASP.NET站点 第七章 如何解决内存的问题(前篇)—托管资源优化—垃圾回收机制深度剖析...
- python如何安装pipwindows_如何在Windows上使用python 2.6安装pip
- 带你穿越古罗马,元宇宙巴士来啦 #Invisible Cities
- 练习2-1 Programming in C is fun
- 批处理文件怎么写用c语言,批处理文件怎么写
- (HarmonyOS)JS FA调用Java PA(一)Ability概念及Ability与Internal Ability调用方式
- SQL Server基础操作(此随笔仅作为本人学习进度记录六 !--程序块和循环)
- 小波变换(wavelet transform)的通俗解释(一)
- 怎么安装Python
- 计算机修改人类记忆曲线,Memory Helper - 艾宾浩斯遗忘曲线记忆助手