芯查查logo
  • 数据服务
    1. 新产品
    2. 物料选型
    3. 查替代
    4. 丝印反查
    5. 查品牌
    6. PCN/PDN
    7. 查方案
    8. 查代理
    9. 数据合作
  • SaaS/方案
      SaaS产品
    1. 供应链波动监控
    2. 半导体产业链地图
    3. BOM管理
    4. 解决方案
    5. 汽车电子
    6. 政府机构
    7. 数据API
  • 商城
  • 行业资讯
    1. 资讯
    2. 直播
  • 论坛社区
    1. 论坛
    2. 学习
    3. 测评中心
    4. 活动中心
    5. 积分商城
  • 查一下
  • 开通会员
飞腾派体验(三) - I2C协议OLED
原创 发布时间:2024/05/15 20:35
版块:
飞腾
简介:飞腾派驱动支持I2C协议的OLED

一、简介

手里的飞腾派使用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驱动芯片。

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

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

工程附件
示例代码.zip
Phytium Pi GPIO口介绍.xlsx
Phytium 飞腾
2024/05/15 20:35
  • 举报
😁😂😃😄😅😆😉😊😋😌😍😏😒😓😔😖😘😚😜😝😞😠😡😢😣😤😥😨😩😪😫😭😰😱😲😳😵😷😸😹😺😻😼😽😾😿🙀🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🙏✂✅✈✉✊✋✌✏✒✔✖✨✳✴❄❇❌❎❓❔❕❗❤➕➖➗➡➰🚀🚃🚄🚅🚇🚉🚌🚏🚑🚒🚓🚕🚗🚙🚚🚢🚤🚥🚧🚨🚩🚪🚫🚬🚭🚲🚶🚹🚺🚻🚼🚽🚾🛀Ⓜ🅰🅱🅾🅿🆎🆑🆒🆓🆔🆕
@好友

全部评论

加载中
游客登录通知
已选择 0 人
自定义圈子
移动
发布帖子
发布动态
发布问答
发布者
小鳄鱼
创作者认证
目录

一、简介

二、 硬件连接

三、软件准备

3.1.Luma.oled驱动库的安装

3.2. I2C测试

四、OLED驱动程序

4.1. 例程1: OLED显示“Hello,World”

4.2. 例程2: OLED显示汉字

4.3. 例程3: 显示IP等信息

4.4.开源示例库

示列:

五、设置开机运行

总结

最新帖子
树莓派pico 2测评 - 初体验【工程师经验】+ 飞线【开源】zvs142857 2.1A,3A快充 充电宝迷你UC3842 开关电源优化全解析:攻克常见难题,提升性能飞腾CPU × DeepSeek大模型,双芯加持全系列稳跑
热门版块
查看更多
电子DIY
电子元器件
维修技术
抄图联盟
汽车电子工程师论坛
工业电子专区
新手入门指南
单片机/MCU论坛
PCB设计
开源项目

146

收藏

分享

微信扫码
分享给好友

评论