一、简介
手里的飞腾派使用wifi
连接网络, 然后笔记本电脑使用SSH
协议连接飞腾派。由于飞腾派设置的是DHCP
方式获取IP
, 可能存在每次启动的时候, 飞腾派的IP
会变, 会让连接飞腾派变成一件麻烦事,所以想使用一个OLED
屏幕显示IP
等信息。
通过本篇教程,你可以学习飞腾派派环境下I2C接口驱动OLED基础功能的使用,以及获取到复杂功能的Demo例程。

二、 硬件连接
飞腾派与I2C
相关的引脚如图所示:

飞腾派与OLED
的连接方式如图所示:

三、软件准备
3.1.Luma.oled驱动库的安装
Luma.oled
是基于Python
的OLED
库,支持SSD1306 / SSD1309 / SSD1322 / SSD1325 / SSD1327 / SSD1331 / SSD1351 / SSD1362 / SH1106 / WS0010驱动芯片。
安装命令:
sudo pip3 install luma.oled
3.2. I2C测试
安装Linux
通用I2C
测试工具:
sudo apt-get install i2c-tools
SSH
到开发板, 使用sudo
命令进行简单的I2C
读写,可以发现接上I2C
传感器之后I2C-2
总线多了一个地址为0x23
的器件,简单介绍如下:
1.查看有哪几个I2C
总线
sudo i2cdetect -l

2.查看总线为2
的设备
sudo i2cdetect -y -r 2
下图中0x3c
是OLED屏幕的地址:

3.读取总线2
下面地址为0x3C
设备的所有值
sudo i2cdump -f 2 0x3c

四、OLED驱动程序
4.1. 例程1: OLED显示“Hello,World”
OLED显示“Hello,World”的python
代码如下:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from luma.core.interface.serial import i2c, spi
from luma.core.render import canvas
from luma.oled.device import ssd1306, ssd1325, ssd1331, sh1106
from time import sleep
"""
OLED luma 驱动库测试程序
功能:显示 hello world 和矩形外框持续10秒
"""
# 初始化端口
serial = i2c(port=2, address=0x3C)
# 初始化设备,这里改ssd1306, ssd1325, ssd1331, sh1106
device = ssd1306(serial)
print("当前版本:1.0")
# 调用显示函数
with canvas(device) as draw:
draw.rectangle(device.bounding_box, outline="white", fill="black")
draw.text((30, 20), "Hello World", fill="white")
# 延时显示10s
sleep(10)
运行代码:
sudo python hello.py
此代码会在OLED
屏幕上画出一个矩形边框,并在内部显示Hello,World
,10s后关闭,效果如下图:

4.2. 例程2: OLED显示汉字
代码如下:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from luma.core.interface.serial import i2c, spi
from luma.core.render import canvas
from luma.oled.device import ssd1306, ssd1325, ssd1331, sh1106
from time import sleep
from PIL import ImageFont
"""
OLED luma 驱动库测试程序
功能:显示 汉字古诗持续10秒
"""
# 初始化端口
serial = i2c(port=2, address=0x3C)
# 初始化设备,这里改ssd1306, ssd1325, ssd1331, sh1106
device = ssd1306(serial)
print("当前版本:1.0")
font = ImageFont.truetype('./msyh.ttc', 12)
# 调用显示函数
with canvas(device) as draw:
draw.rectangle(device.bounding_box, outline="white", fill="black")
draw.text((5, 10), "芯查查", fill="white", font=font)
draw.text((5, 24), "飞腾派", fill="white", font=font)
draw.text((5, 38), "遥遥领先", fill="white", font=font)
# 延时显示10s
sleep(10)
显示效果如下:

代码解析:
from PIL import ImageFont
这个是强大的PIL库中的字体类,显示汉字,默认字体就不行了,所以需要新增字体文件font = ImageFont.truetype('./msyh.ttc', 12)
这段代码含义是调用当前目录下的字体文件 "msyh.ttc"创建一个字体类,"msyh.ttc"是微软雅黑字体,可以百度一下自行下载,我也是在盗版网站上扒到的,此处就不贴链接了。draw.text((5, 10), "芯查查", fill="white", font=font)
这段代码跟上一个示例相比,就是多了一个字体赋值,含义是在(5,10)的位置显示汉字。
4.3. 例程3: 显示IP等信息
程序如下:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from luma.core.interface.serial import i2c, spi
from luma.core.render import canvas
from luma.oled.device import ssd1306, ssd1325, ssd1331, sh1106
from PIL import ImageFont
import time
import socket
import fcntl
import struct
import subprocess
serial = i2c(port=2, address=0x3C)
oled = ssd1306(serial, width=128, height=64)
def printStats(x, y):
cmd = "hostname -I | cut -d\' \' -f1"
IP = subprocess.check_output(cmd, shell = True )
cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'"
CPU = subprocess.check_output(cmd, shell = True )
cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%%\", $3,$2,$3*100/$2 }'"
MemUsage = subprocess.check_output(cmd, shell = True )
cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'"
Disk = subprocess.check_output(cmd, shell = True )
font = ImageFont.truetype('./msyh.ttc', 12)
with canvas(oled) as draw:
draw.text((x, y), "IP: " + str(IP, encoding='utf8'), fill="white")
draw.text((x, y+10), str(CPU, encoding='utf8'), fill="white")
draw.text((x, y+20), str(MemUsage, encoding='utf8'), fill="white")
draw.text((x, y+30), str(Disk, encoding='utf8'), fill="white")
draw.text((x, y+40), "芯查查/飞腾派/YYDS", fill="white", font=font)
if __name__ == "__main__":
while (1):
printStats(0, 0)
time.sleep(3)
显示效果如下:

再来一张整体效果图:

4.4.开源示例库
使用luma.oled
的开源示例: 开源案例
示列:
python 3d_box.py -i i2c --i2c-port 2 --i2c-address 0x3c

animate_gif.py

font_awesome.py

demo.py

五、设置开机运行
为了让stats.py
能够开机自动运行,我们可以做下面的配置,这样我们就可以不用通过工具或路由器去查找飞腾派的 IP
地址等信息了。
1.新建stats_temp_service文件(无文件扩展名, 且与stats.py在同一文件夹下)
#!/bin/bash
### BEGIN INIT INFO
# Provides: XXX
# Required-Start: $syslog $remote_fs $network
# Required-Stop: $syslog $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start XXX daemon at boot time
# Description: Start XXX daemon at boot time
### END INIT INFO
case "$1" in
start):
echo "Starting"
# 有环境先source或conda进入环境,否则直接使用python即可
sudo nohup python stats.py &
;;
stop):
echo "Stoping"
echo "Usage: service start_tool start|stop"
exit 1 ;;
esac
exit 0
将stats_temp_service
文件设置为自启动服务:
sudo cp stats_temp_service /etc/init.d/
sudo chmod 777 /etc/init.d/stats_temp_service
sudo reboot # 这里重启了树莓派
# 树莓派重启之后,启动stats_temp_service服务,并将stats_temp_service设置为开机自启动
sudo systemctl start stats_temp_service
sudo systemctl enable stats_temp_service
# 取消开机自启动
sudo systemctl disable stats_temp_service
总结
飞腾派这块板子非常容易上手, 后面将为大家带来飞腾派集成ChatGPT的教程。
还希望能点赞、赞赏鼓励一下。
全部评论