MicroPython-On-ESP8266——oled屏幕的使用方法
1. OLED屏幕介绍
1.1. I2C协议简述
I2C是一种串行总线,用来连接多个集成电路设备或芯片,它的连接方式比较简单2条线连接即可,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。
通信原理是通过对SCL和SDA线高低电平时序
的控制,来产生信号传递。空闲时上拉电阻拉高,保持着高电平。
想更多了解I2C相关的原理的话自行骚扰度娘。
1.2. OLED屏幕
之所以先介绍I2C总线,是因为咱们要用到的OLED显示屏幕,它就是使用的I2C总线协议来与单片机通信的。
我这里手上使用的是0.96寸的oled屏幕,是当时买第一块esp8266开发板europa时附带买的,单色屏价格便宜,能达到测试使用的目的就行。
这块屏的分辨率是128*64,上面分布了这么多矩阵排列的发光二极管,我们要在上面绘制线条、图案、字符甚至中文,其实就是点亮相应的像素点二极管。
至于绘制的算法,需要查看显示屏官方资料,分为横向扫描法和纵向扫描法,这里也不展开了。
2. 与屏幕通信
2.1. Micropython中使用I2C总线的方式
前面咱们在学习温湿度计的时候,当时已经使用过I2C总线。
Micropython官方 提供的I2C总线的基本通信代码:
from machine import Pin, I2C
# construct an I2C bus
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)
i2c.readfrom(0x3a, 4) # read 4 bytes from slave device with address 0x3a
i2c.writeto(0x3a, '12') # write '12' to slave device with address 0x3a
buf = bytearray(10) # create a buffer with 10 bytes
i2c.writeto(0x3a, buf) # write the given buffer to the slave
此处是把两个GPIO管(5和4)脚当作SCL和SDA线来使用,I2C的通信由这两个管脚完成。I2C接线是4条,另外两条是电源正负。
2.2. OLED驱动库引入
0.96寸的这款oled屏幕,官方提供了ssd1306
库作为驱动,这个库底层是有多种总线通信的实现方式的,我们使用的I2C总线,所以需要引入下面的库:
from ssd1306 import SSD1306_I2C
如果编译的mpy固件没有包含该库时,可以从mcropython官网上下载ssd1306库
2.3. 简单显示示例
2.3.1. 查找屏幕从机地址
from machine import I2C, Pin
i2c = I2C(scl=Pin(5), sda=Pin(4)) # C1接口对应的SCL=IO5, SDA=IO4
print(i2c.scan())
通过REPL看到日志打印出[60] 或 [61]之类,证明已找到屏幕的从机地址。
2.3.2. 根据从机地址初始驱动并显示字符
from machine import I2C, Pin
from ssd1306 import SSD1306_I2C
i2c = I2C(scl=Pin(5), sda=Pin(4))
oled = SSD1306_I2C(128, 64, i2c, addr=61) # 创建OLED对象,addr地址需要参考上面scan输出的地址
oled.text('Hello World', 0, 20) # 在屏幕(0, 20)坐标上显示文字“Hello World”
oled.show() # 刷新屏幕
这里需要注意的是在初始化ssd1306对象时,要准确地指定分辨率,这样才好在后面指定不同字符的显示位置。
ssd1306继承自framebuffer类,绘制内容时是将定义好的缓存对象刷新(show)到屏幕上。
附:ssd1306的功能函数列表:
- framebuf绘制图形
- fill 填充整个缓存区为