[] 原理图
[] ssd1312_oled_128x64_bad_apple.py
在开始之前,您需要以下物品:
[] 树莓派开发板
[] SSD1312 OLED屏幕-I2C显示接口
[] Python编程环境
硬件连接
打开I2C接口
在树莓派上确保开启I2C接口之后重启树莓派
查找I2C设备地址
您可以使用以下命令查找连接到树莓派上的I2C设备的地址:
sudo i2cdetect -y 1
运行结果如图所示(一般ssd1312oled的默认i2c地址为0x3c)
安装库
接下来,您需要在树莓派上安装luma.oled库。可以通过以下命令在终端中进行安装:
sudo pip3 install luma.oled
sudo apt-get install ttf-mscorefonts-installer
测试Python程序
运行代码之前需要在树莓派新建一个名为ssd1306_oled_128x64_bad_apple.py的python文件(文件名可自定义)
sudo nano ssd1312_oled_128x64_bad_apple.py
组合以上步骤,并使用luma.oled库驱动SSD1312 OLED屏幕,(sd1312的驱动原理与ssd1306的一样,只不过ssd1312的显示默认是镜像的,在代码中加入修改镜像寄存器的代码即可解决镜像问题)以下是一个完整的Python程序,用于在树莓派上驱动SSD1312 OLED屏幕:
import os
import time
import threading
from PIL import Image, ImageSequence
from PIL import ImageFont, ImageDraw
from luma.core.interface.serial import i2c
from luma.core.render import canvas
from luma.oled.device import ssd1306
serial = i2c(port=1, address=0x3C)
device = ssd1306(serial, width=128, height=64)
# 将视图反转
device.command(0x00) # 0xA0指令设置为默认的column address 0.
device.command(0xA0) # 0xA7指令打开像素反转
# Return CPU temperature as a character string
def getCPUtemperature():
res = os.popen('vcgencmd measure_temp').readline()
return(res.replace("temp=","").replace("'C\n",""))
# Return RAM information (unit=kb) in a list
# Index 0: total RAM
# Index 1: used RAM
# Index 2: free RAM
def getRAMinfo():
p = os.popen('free')
i = 0
while 1:
i = i + 1
line = p.readline()
if i==2:
return(line.split()[1:4])
# Return % of CPU used by user as a character string
def getCPUuse():
return(str(os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip()))
# Return information about disk space as a list (unit included)
# Index 0: total disk space
# Index 1: used disk space
# Index 2: remaining disk space
# Index 3: percentage of disk used
def getDiskSpace():
p = os.popen("df -h /")
i = 0
while 1:
i = i +1
line = p.readline()
if i==2:
return(line.split()[1:5])
def draw_text(text, width, height, fontsize):
font = ImageFont.truetype("arial.ttf", fontsize)
with canvas(device) as draw:
draw.rectangle(device.bounding_box, outline="white", fill="black")
# Calculate the width of the text using textlength() instead of textsize()
w = font.getlength(text)
# Calculate the height of the text by subtracting the font descent from the font ascent
ascent, descent = font.getmetrics()
h = ascent - descent
# Calculate the position of the text
x = (width - w) // 2
y = (height - h) // 2
# Draw the text using the new width and height values
draw.text((10, 1), text, font=font, fill="white")
def image_gif():
# Display each image with an idea
for frame in frames:
device.display(frame)
time.sleep(0.01)
def computer_resources(flag):
while not flag.is_set():
# CPU informatiom
CPU_use = getCPUuse()
CPU_tmp = getCPUtemperature()
# RAM information
# Output is in kb, here I convert it in Mb for readability
RAM_stats = getRAMinfo()
RAM_total = round(int(RAM_stats[0]) / 1000,1)
RAM_used = round(int(RAM_stats[1]) / 1000,1)
RAM_free = round(int(RAM_stats[2]) / 1000,1)
# Disk information
DISK_stats = getDiskSpace()
DISK_total = DISK_stats[0]
DISK_used = DISK_stats[1]
DISK_perc = DISK_stats[3]
#
status_text = "CPU_use: "+CPU_use+"\nCPU_tmp: "+CPU_tmp+"\nRAM_used: "+str(RAM_used)+"\nDISK_used: "+DISK_used
draw_text(status_text, device.width, device.height, 12)
if __name__ == '__main__':
# Open a GIF file and create an Image object for each frame
frames = []
with Image.open("./bad_apple_128x64.gif") as img:
for frame in ImageSequence.Iterator(img):
frames.append(frame.convert("1").resize((128,64)))
# Create a threading.Event() object for synchronization
flag = threading.Event()
# Create a thread to compute system resources usage
t = threading.Thread(target=computer_resources,args=(flag,))
while True:
# Show some text and wait for 2 seconds
draw_text(" Spotpear\nhttp://www.spotpear.cn\nhttp://www.spotpear.com\n", device.width, device.height, 12)
time.sleep(2)
#Start the thread to compute system resources usage,wait for 5 seconds
t.start()
time.sleep(5)
# Set the flag to stop the thread
flag.set()
# Wait for the thread to terminate
t.join()
# Clear the flag and create a new thread for next loop
flag.clear()
t = threading.Thread(target=computer_resources,args=(flag,))
time.sleep(2)
# Display Bad Apple animation as GIF images
image_gif()
请注意,我们在i2c对象中使用了地址"0x3C",这是默认的SSD1312 OLED屏幕地址。如果您使用的是其他类型的I2C设备,请使用命令sudo i2cdetect -y 1查找其地址,并将其地址替换为i2c对象中的地址。
该程序实现了gif的显示效果,所以必须得有对应的gif文件,否则程序无法正常运行。
如何转换视频为gif参考这个教程:MP4视频如何转化为gif
程序执行效果
上述代码输入到python文件内,保存并且退出,在树莓派终端输入以下代码即可执行程序:
sudo python3 ssd1312_oled_128x64_bad_apple.py