实战microPython(06)-OLED屏的使用(2)

实战microPython(06)-OLED屏的使用(2)

David Zou 2018-11-27

大家好,上次介绍了OLED显示屏的相关知识,今天,我们进入实战,学习如何使用OLED显示屏。

如前所述,OLED显示屏的价格还是比较高的,因此我们实验用的OLED屏选用了一个0.96寸的单色小屏,像素数为128x64。大家可以在淘宝上搜索“0.96寸oled”,就可以搜到一大堆。几十元大家货比三家吧。但要注意两点:
1 要买带底板的显示屏,如下图:
在这里插入图片描述
蓝色的板子就是底板。

2 注意底板接口,要买7脚接口的。目前市面有两种,除这种7脚的,还有一种4脚的版本,这两个版本的区别是,7脚的接口可使用I2C或SPI来传输显示内容,而4脚的只支持I2C接口。为以后这块显示屏能够用在更多的场合,这里我们选用7脚的底板。
在这里插入图片描述在这里插入图片描述
好了,选购好OLED屏,我们这里默认是7脚的OLED屏,其背面如下:
在这里插入图片描述
需要说明的一点,以上图,都是淘宝随意找的商品图,仅作参考。由此商品的背面图可以看出,如果使用SPI接口,需要焊接上R3,R4电阻,如果使用I2C接口,要改焊R1,R4,R6,R7,R8电阻。板子默认是SPI口。今天我们使用的就是SPI口,因此,不需要做任何焊接工作。
接下来我们需要讲显示屏连接到uPyBoard板上,由前面的图中看到显示屏的7个引脚分别是:GND,VCC,DO,DI,RES,DC,CS。

信号描述
1.GND电源地
2.VCC电源正(2.8-5.5V)
3.D0SPI时钟 - SCLK
4.D1SPI数据 - MOSI
5.RES显示屏复位
6.DC数据/命令选择
7.CS片选

查看,uPYB的引脚图:
在这里插入图片描述
一共有两个SPI口,这里我们使用SPI1口。再将其他引线(RES, DC, CS)连接到GPIO上,这里可以随意选择IO,我的连接如下:

显示屏引脚描述uPyBoard连接
1.GND电源地GND
2.VCC电源正(2.8-5.5V)3.3V
3.D0SPI时钟 - SCLKX6
4.D1SPI数据 - MOSIX8
5.RES显示屏复位Y11
6.DC数据/命令选择Y12
7.CS片选X5

在这里插入图片描述
连接好后,要反复检查确认无误后(尤其是VCC和GND引脚),下面就可以编写程序了。使用OLED显示屏,要用到两个官方的库:machine库中的SPI接口以及ssd1306库中的SSD1306-SPI设备。
machine库和之前我们一直使用的pyb库一样,是整个uPyBoard板的接口驱动库,它是官方新出的用来取代pyb库的新版本库。官方推荐使用这个machine库来取代之前的pyb库,但由于machine库和pyb库中相同设备的使用方法不同,而且,machine库目前尚不算完善。因此,之前我们一值在使用pyb库,而这次,我们要使用machine库,因为ssd1306库是基于machine库的。
那么另一个SSD1306是什么?SSD1306是OLED显示屏的驱动芯片。上次已经讲过,显示屏上的像素排列成行阵列,当我们要显示内容时,必须要一个个的设置屏上的像素,128x64点阵像素逐个访问我们的处理器即没有那么多的外部引脚,也不能把所有时间都花在不停的更新像素上。因此,必须要一个芯片专门处理此事,我们只需要讲要显示的数据传递给它,有这个芯片将我们的数据转换为实际的像素去显示出来。这个芯片就是显示驱动芯片,而我们选用的OLED屏使用的显示芯片的型号就是SSD1306。下图显示了这3者的关系:
在这里插入图片描述
uPyBoard将要显示的内容通过SPI(或I2C)接口提供给SDD1306驱动芯片,SSD1306芯片将这些数据转换为OLED屏幕上对应的发光点显示出来。

好了现在,我们就来看看我们的程序吧:这是源码

from micropython import const
from machine import SPI
from pyb import Pin
from ssd1306 import SSD1306_SPI

spi = SPI(1);

oled = SSD1306_SPI(128, 64, spi, pyb.Pin('Y12'), pyb.Pin('Y11'), pyb.Pin('X5'));

#test
buf = bytearray(5);
buf[0] = 0x55;
buf[1] = 0x55;
buf[2] = 0x55;
buf[3] = 0x55;
buf[4] = 0x55;
oled.write_data(buf);

为方便讲解,我们还是使用截屏的方式:
在这里插入图片描述
19-22行是导入相应的库,我想大家都应该知道了,特别说明一下22行的ss1306库中含有两种接口SPI和I2C,如果你的显示屏配置的是I2C的接口,就需要引入SSD1306_I2C驱动库。这里我们使用的是SPI接口。
25行,实例化SPI1,因为我的显示屏接到SPI1口上了。
27行,实例化SSD1306_SPI设备,也就是具有SPI接口的OLE显示屏设备,也就是前面显示屏框图中右侧的部分。创建这个设备时需要指定相应的参数,SSD1306_SPI的参数如下:
SSD1306_SPI(width, height, spi, dc, res, cs, external_vcc=False)
width: 显示屏像素矩阵的宽度,我们使用的是128x64像素矩阵,因此这里值是128。
height: 显示屏像素矩阵的高度,这里值是64
spi: spi接口实例,25行已经创建好,直接带入。
dc: 7脚接口中6脚DC信号使用的GPIO,我这里连接到Y12。
res: 7脚接口中5脚RES信号使用的GPIO,我这里连接到Y11。
cs: 7脚接口中7脚CS信号使用的GPIO,我这里连接到X5。
external_vcc=False: 显示屏是否使用外部电源,默认为否。我的显示屏VCC直接使用uPyBoard的电源。因此,不需要特别指定此参数。
30-35行,是要构建一个需要显示的内容,这个内容存在字节数组中。
36行,将显示数据发给显示屏显示出来。
好了,将上面的程序拷贝并粘贴到控制台软件的输入区,并发送到uPyBoard板上去执行:
在这里插入图片描述
如果你的接线没问题的话,可以看到显示结果:
在这里插入图片描述
显示会始终保持在屏幕上,如果要清掉屏幕上的内容:

oled.fill(0);
oled.show();

如果要显示英文信息:

oled.text("Hello", 10, 10, 1);
oled.show();

搜索并关注#公#众#号: MakerDIY-Park,获取更多资料。
在这里插入图片描述

<think> 我们正在讨论如何在ESP32使用MicroPython驱动OLED幕(SH1106SSD1306)。根据引用,用户有两种驱动芯片的幕:SH1106SSD1306。注意,引用[1]提到使用SSD1306的驱动去驱动SH1106会导致花,因此需要区分驱动。 关键点: 1. 引脚连接:根据引用[1]和[2],连接方式可能不同,但通常需要VCCGND、SCL(时钟线)、SDA(数据线)。 引用[1]中的连接:ESP32的GPIO39接SCL,GPIO38接SDA(注意:通常I2C引脚是固定的,但ESP32可以通过软件I2C使用任意引脚) 引用[2]中的连接:SCL接GPIO22,SDA接GPIO21(这是常见的I2C引脚,但并非唯一) 2. 驱动选择:根据幕的驱动芯片选择正确的驱动库。 对于SSD1306:可以使用`ssd1306.py`库(MicroPython通常内置,或者需要从官方获取) 对于SH1106:需要专门的`sh1106.py`驱动(引用[1]提到参考了《micropython+esp32+1.3寸oled显示驱动sh1106.py》) 3. 代码步骤: - 导入必要的模块(machine, ssd1306或sh1106- 设置I2C引脚使用SoftI2C或I2C) - 创建幕对象(传入宽度、高度和I2C对象) -幕上显示文本或图形 - 调用`show()`方法更新显示 下面,我们将分别展示SSD1306和SH1106的示例代码。 注意:用户并没有明确说明自己使用的是哪种驱动芯片,因此需要根据实际情况选择。如果用户不确定,可以尝试两种方法(先尝试SSD1306,如果花则尝试SH1106)。 另外,关于引脚连接,用户需要根据自己幕的实际引脚连接来设置。常见的I2C引脚在ESP32上可以是任意引脚,但通常使用GPIO21(SDA)和GPIO22(SCL)作为默认硬件I2C引脚,但也可以使用软件I2C(SoftI2C)来使用其他引脚使用指南: 步骤1:硬件连接 -OLEDVCC连接到ESP32的3.3V -OLEDGND连接到ESP32GND -OLED的SCL(时钟线)连接到ESP32的某个GPIO(比如22,或者用户自己定义的引脚-OLED的SDA(数据线)连接到ESP32的某个GPIO(比如21,或者用户自己定义的引脚) 步骤2:在MicroPython中安装驱动(如果需要) 对于SSD1306:通常MicroPython固件已经内置了ssd1306模块,如果没有,可以从MicroPython的GitHub仓库获取。 对于SH1106:需要额外的驱动文件(sh1106.py),需要将其上传到ESP32的文件系统中。 步骤3:编写代码 示例代码(SSD1306): 注意:以下代码基于引用[2]提供的信息。 $$示例代码1: SSD1306驱动$$ ```python from machine import Pin, SoftI2C # 或者使用I2C,如果使用硬件I2C import ssd1306 # 导入SSD1306驱动 # 初始化I2C,这里使用软件I2C,并指定SCL和SDA的引脚 i2c = SoftI2C(scl=Pin(22), sda=Pin(21)) # 这里使用GPIO22和GPIO21 # 创建OLED幕对象,分辨率128x64 oled = ssd1306.SSD1306_I2C(128, 64, i2c) # 在幕的指定位置显示文字 oled.text('Hello, World!', 0, 0) # 在坐标(0,0)开始显示 oled.text('MicroPython', 0, 16) # 第二行 oled.text('ESP32', 0, 32) # 第三行 oled.text('OLED test', 0, 48) # 第四行 # 更新幕显示 oled.show() ``` 示例代码(SH1106): 注意:需要先上传sh1106.py驱动文件到ESP32。 $$示例代码2: SH1106驱动$$ ```python from machine import Pin, SoftI2C from sh1106 import SH1106_I2C # 导入SH1106驱动 # 初始化I2C i2c = SoftI2C(scl=Pin(39), sda=Pin(38)) # 这里使用了引用[1]中的引脚:39和38,但用户可以根据实际连接修改 # 创建OLED幕对象,分辨率128x64(SH1106通常为128x64) oled = SH1106_I2C(128, 64, i2c) # 清(可选,SH1106可能需要) oled.fill(0) # 0表示黑色,1表示白色 # 显示文字 oled.text('SH1106 OLED', 0, 0) oled.text('Pin:SCL=39,SDA=38', 0, 16) oled.text('Powered by', 0, 32) oled.text('MicroPython', 0, 48) # 更新显示 oled.show() ``` 步骤4:运行代码 注意事项: - 如果幕不显示,检查接线是否正确(特别是VCCGND是否接反?SCL和SDA是否接对?) - 检查引脚号是否在代码中设置正确。 - 如果使用SH1106,确保sh1106.py文件已经上传到设备(可以使用Thonny IDE上传文件)。 常见问题: - 使用SSD1306驱动SH1106幕会导致花,所以必须匹配驱动。 - I2C地址:通常情况下,这两种幕的I2C地址都是0x3C,但也有可能是0x3D。如果地址不对,可以扫描I2C地址: $$I2C地址扫描代码$$ ```python from machine import Pin, SoftI2C i2c = SoftI2C(scl=Pin(22), sda=Pin(21)) # 使用你自己的引脚 devices = i2c.scan() if len(devices) == 0: print("No I2C devices found!") else: print("I2C addresses found:", [hex(device) for device in devices]) ``` 如果扫描到地址是0x3C或0x3D,则在创建幕对象时可以指定地址(例如,ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3C))。但通常驱动默认使用0x3C。 最后,由于用户之前的问题(使用指南),我们提供了两种情况的代码。用户需要根据自己的幕芯片型号选择。 希望这个指南能帮助用户点亮OLED幕! §§相关问题§§ 1. 如何检测OLED幕的I2C地址? 2. 如果使用硬件I2C,代码应该如何修改? 3. 如何绘制图形(如直线、矩形、圆形)到OLED幕上? 4. 如何清除OLED幕内容? </think> ### MicroPython在ESP32使用OLED使用指南 以下是详细的使用方法,适用于SSD1306和SH1106两种驱动芯片的OLED幕: #### 1. **硬件连接** | OLED引脚 | ESP32引脚 | 说明 | |----------|-----------|------| | VCC | 3V3 | 电源正极 | | GND | GND | 电源地线 | | SCL | GPIO22 | I2C时钟线 | | SDA | GPIO21 | I2C数据线 | ```mermaid graph LR A[OLED] -->|VCC| B(ESP32 3V3) A -->|GND| C(ESP32 GND) A -->|SCL| D(GPIO22) A -->|SDA| E(GPIO21) ``` > **注意**:若引脚冲突(如引用[1]使用GPIO39/38),请根据实际连线调整代码中的引脚号[^1]。 #### 2. **驱动库安装** - **SSD1306驱动**(128x64像素): ```python import ssd1306 # 通常内置在MicroPython固件中 ``` - **SH1106驱动**(128x64像素): ```python # 需手动下载sh1106.py并上传到设备 # 下载地址:https://github.com/robert-hh/SH1106 from sh1106 import SH1106_I2C ``` #### 3. **基础代码示例** **SSD1306显示屏**(引用[2]方案): ```python from machine import Pin, SoftI2C import ssd1306 i2c = SoftI2C(scl=Pin(22), sda=Pin(21)) # 初始化I2C oled = ssd1306.SSD1306_I2C(128, 64, i2c) # 创建幕对象 oled.text('Hello World!', 0, 0) # 在(0,0)显示文本 oled.text('ESP32 + OLED', 0, 20) # 在(0,20)显示文本 oled.show() # 更新幕显示 ``` **SH1106显示屏**(引用[1]方案): ```python from machine import Pin, SoftI2C from sh1106 import SH1106_I2C i2c = SoftI2C(scl=Pin(39), sda=Pin(38)) # 使用指定引脚 oled = SH1106_I2C(128, 64, i2c) # SH1106对象 oled.fill(0) # 清(0=黑色,1=白色) oled.text('SH1106 Works!', 10, 30) oled.show() ``` #### 4. **核心功能详解** - **显示控制**: ```python oled.fill(0) # 清 oled.pixel(10,10,1) # 在(10,10)绘制白点 oled.line(0,0,50,50,1) # 绘制直线 oled.rect(20,20,40,20,1)# 绘制矩形 oled.show() # 应用所有更改 ``` - **滚动效果**: ```python oled.scroll(10,0) # 向右滚动10像素 oled.show() ``` - **对比度调节**: ```python oled.contrast(128) # 0-255范围(默认128) ``` #### 5. **常见问题解决方案** | 问题现象 | 解决方法 | |----------|----------| | 花/乱码 | 检查驱动芯片类型(SSD1306/SH1106) | | 幕无显示 | 1. 确认VCC接3.3V<br>2. 检查I2C地址<br>3. 运行I2C扫描:`print(i2c.scan())` | | 显示内容残留 | 操作前调用`oled.fill(0)`清 | | 文本位置偏移 | 调整`text()`中的x,y坐标参数 | #### 6. **进阶技巧** - **显示图像**: ```python # 转换图像为字节数组 with open('image.pbm', 'rb') as f: oled.invert(True) # 反色显示 oled.blit(f.read(), 0, 0) # 显示图像 oled.show() ``` - **低功耗模式**: ```python oled.poweroff() # 关闭oled.poweron() # 唤醒幕 ``` > **重要提示**:当使用SH1106驱动时,务必选用专用库(如`sh1106.py`),直接使用SSD1306库会导致花[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值