1. 模块来源
2. 规格参数
ssd1315与ssd1306除了滚动之外其它功能驱动相同
工作电压:3.3V
工作电流:9MA
模块尺寸:27.3 x 27.8 MM
像素大小:128 x 64
驱动芯片:SSD1315
通信协议:IIC
管脚数量:4 Pin(2.54mm间距排针)
3. 模块原理
SSD1315是一款OLED驱动芯片,支持通过I2C协议进行通信。I2C(Inter-Integrated Circuit)是一种多主机、串行计算机总线,允许多个“设备”连接到同一总线上进行通信。SSD1315的I2C模块原理基于以下几个关键点:
- 通信地址:SSD1315具有两个I2C通信地址,0x78和0x7A,可以通过外部设置选择使用其中一个3。
- 数据线和时钟线:I2C通信使用两根线,数据线(SDA)和时钟线(SCL)。数据线负责传输数据,时钟线提供数据同步。
- 开始和停止条件:I2C通信通过特定的起始位和停止位来标识一次通信的开始和结束。起始位是SCL为高时SDA从高到低的跳变,停止位是SCL为高时SDA从低到高的跳变。
- 应答信号:在发送数据后,接收设备需要发送一个应答信号(ACK),以确认数据接收成功。
- 写指令和写数据:在I2C通信中,SSD1315区分指令和数据。通常,通过特定的指令来设置OLED的显示参数,如亮度、对比度、页面地址等4。
- 模拟I2C通信:在一些微控制器上,如果没有硬件I2C支持,可以通过软件模拟I2C通信,通过操作IO口的高电平和低电平来实现48。
- 初始化过程:OLED屏幕的初始化包括发送一系列指令来配置屏幕,如关闭屏幕、设置列的起始地址、设置寻址模式、设置显示起始线、设置对比度、不反转显示、设置复用率、设置电流、屏幕偏移、分频与时钟频率、点灯周期、COM引脚硬件设置、VCOM电压等1。
- 数据发送:在I2C通信中,数据通常以8位字节的形式发送。发送数据前需要设置目标设备的地址,然后是具体的数据或指令。
SSD1315的I2C模块原理遵循标准的I2C通信协议,通过微控制器的软件或硬件支持来实现与OLED屏幕的通信和控制。
4. 移植工程
4.1 接线方式
接线图如下:
4.2 移植步骤
1)安装驱动
在步骤1之前,请参考《泰山派适配Adafruit Blinka,轻松接入CircuitPython传感器库》为泰山派适配 Adafruit Blinka
库。
Adafruit提供的SSD1306的驱动库是Adafruit_CircuitPython_SSD1306
,在树莓派系统(泰山派)的终端上通过以下命令安装:
sudo pip3 install adafruit-circuitpython-ssd1306
2)驱动测试
安装完成后,先测试一下是否可以正常点亮屏幕。在Thonny上使用远程Python 3(SSH),编写SSD1306测试代码,参考代码如下:
import time
from board import *
import busio
import adafruit_ssd1306
#定义I2C
i2c = busio.I2C(I2C2_SCL, I2C2_SDA)
#建立显示模块
disp = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c)
#亮屏
disp.fill(1)
disp.show()
2
3
4
5
6
7
8
9
10
11
12
13
14
注意I2C的引脚参考上一篇GPIO库中I2C的引脚:I2C2_SCL, I2C2_SDA
3、显示泰山派的信息
Adafruit_CircuitPython_SSD1306
的官方仓库提供了不少示例,经过测试都可以正常运行。
Adafruit_CircuitPython_SSD1306的github地址:
https://github.com/adafruit/Adafruit_CircuitPython_SSD1306
我们用ssd1306_stats.py
测试一下显示CPU、内存等信息的示例,参考代码如下:
import time
import subprocess
from board import *
import busio
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
i2c = busio.I2C(I2C2_SCL, I2C2_SDA)
disp = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c)
#清屏
disp.fill(0)
disp.show()
width = disp.width
height = disp.height
#单色位图
image = Image.new("1", (width, height))
#定义绘图对象
draw = ImageDraw.Draw(image)
#绘制一个黑色填充的矩形以清屏
draw.rectangle((0, 0, width, height), outline=0, fill=0)
#定义一些常量
padding = -2
top = padding
bottom = height - padding
x = 0
#定义字体
font = ImageFont.load_default()
while True:
draw.rectangle((0, 0, width, height), outline=0, fill=0)
# 调用命令显示IP、CPU、内存、存储等信息
cmd = "hostname -I | cut -d' ' -f1"
IP = subprocess.check_output(cmd, shell=True).decode("utf-8")
cmd = 'cut -f 1 -d " " /proc/loadavg'
CPU = subprocess.check_output(cmd, shell=True).decode("utf-8")
cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%s MB %.2f%%\", $3,$2,$3*100/$2 }'"
MemUsage = subprocess.check_output(cmd, shell=True).decode("utf-8")
cmd = 'df -h | awk \'$NF=="/"{printf "Disk: %d/%d GB %s", $3,$2,$5}\''
Disk = subprocess.check_output(cmd, shell=True).decode("utf-8")
draw.text((x, top + 0), "IP: " + IP, font=font, fill=255)
draw.text((x, top + 8), "CPU: " + CPU, font=font, fill=255)
draw.text((x, top + 16), MemUsage, font=font, fill=255)
draw.text((x, top + 25), Disk, font=font, fill=255)
# 显示信息
disp.image(image)
disp.show()
time.sleep(0.1)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
5. 移植验证
成功点亮屏幕:
实验2显示效果: