飞腾派体验(三) - I2C协议OLED

分享作者:user202208045395
作者昵称:yao123
评测品牌:萤火工场
评测型号:CEK8903-E2KQD4
发布时间:2024-11-27 09:39:06
0
概要
本篇评测内容转载自创作者“小鳄鱼”:飞腾派驱动支持I2C协议的OLED
开源口碑分享内容

一、简介

手里的飞腾派使用wifi连接网络, 然后笔记本电脑使用SSH协议连接飞腾派。由于飞腾派设置的是DHCP方式获取IP, 可能存在每次启动的时候, 飞腾派的IP会变, 会让连接飞腾派变成一件麻烦事,所以想使用一个OLED屏幕显示IP等信息。

通过本篇教程,你可以学习飞腾派派环境下I2C接口驱动OLED基础功能的使用,以及获取到复杂功能的Demo例程。

二、 硬件连接

飞腾派与I2C相关的引脚如图所示:

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

三、软件准备

3.1.Luma.oled驱动库的安装

Luma.oled是基于PythonOLED库,支持SSD1306 / SSD1309 / SSD1322 / SSD1325 / SSD1327 / SSD1331 / SSD1351 / SSD1362 / SH1106 / WS0010驱动芯片。

luma库使用基本官方介绍网页 luma的例程代码git仓库地址

安装命令:

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的教程。

还希望能点赞、赞赏鼓励一下。


全部评论
暂无评论
0/144