树莓派连接小屏幕实时显示IP地址等系统信息
最近在捣鼓树莓派,在此仅分享一下自己的配置过程
效果展示
上图展示了一个树莓派连接一个SSD1306 OLED小屏幕显示时间、IP地址、CPU占用率、内存占用率以及温度等信息
本文提供的代码是最基础最简单的,效果如图上。如果您有更多的美观需要,可以自行修改
一、材料
- 1个运行良好的树莓派(本文以树莓派4B举例)
- 1个SSD1306 OLED屏幕
- 4根母对母杜邦线
二、前置工作
1.开启I2C功能
- 这个开启I2C的方法仅针对Raspberry Pi OS系统
执行sudo raspi-config
命令,选择Interface Options
选择开启I2C
2.安装库
OLED有两个库:Adafruit_Python_SSD1306
和Luma.oled
可以阅读https://blog.csdn.net/u011198687/article/details/120347965,该文对两个库进行了详细的对比
直接安装Luma.oled库:
sudo pip3 install luma.oled
由于我们连接屏幕是为了显示一些系统信息,所以我们还需要psutil库!
sudo pip3 install psutil
三、连接屏幕
1.接线
建议阅读https://blog.csdn.net/u011198687/article/details/120347965,简单易懂
可以阅读https://zhuanlan.zhihu.com/p/86375710,有直观引脚图和说明
屏幕的 | 接树莓派的 | 功能 |
---|---|---|
GND | GND | 地线 |
VCC | 3.3V | 正极 |
SDA | SDA | 数据线 |
SCL | SCL | 时钟 |
(转载自https://blog.csdn.net/u011198687/article/details/120347965)
2.检测是否连接成功
运行命令
sudo i2cdetect -y 1
如果输出如下就说明连接好啦,其中3c代表I2C地址
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
如果没有,请检查I2C是否开启,或者尝试换一个GND地线的引脚
四、点亮屏幕
先创建一个python文件
cd ~
sudo vim oled.py
粘贴下面的代码
#!/usr/bin/env python3
from luma.core.interface.serial import i2c
from luma.oled.device import ssd1306
from luma.core.render import canvas
import time
import socket
import psutil
import datetime
serial = i2c(port=1, address=0x3C)
device = ssd1306(serial)
def get_internal_ip():
"""获取本机内网IP地址"""
try:
# 创建临时socket连接获取IP
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
sock.connect(("8.8.8.8", 80))
return sock.getsockname()[0]
except OSError:
return "NoNet" # 网络异常时显示提示
def get_cpu_temp():
"""获取CPU温度"""
try:
with open("/sys/class/thermal/thermal_zone0/temp", "r") as f:
temp = int(f.read().strip()) / 1000.0
return f"{temp:.1f}°C"
except Exception:
return "N/A" # 读取失败时显示
# 显示布局设置
LABEL_X = 1 # 标签文字起始位置(左边缘留1像素)
VALUE_X = 45 # 数值文字起始位置(统一对齐)
LINE_HEIGHT = 12 # 行高(像素)
try:
while True:
# 获取当前日期时间并格式化
now = datetime.datetime.now()
top_line = f" {now.strftime('%Y-%m-%d %H:%M:%S')}"
# 获取系统监控数据
ip_address = get_internal_ip()
cpu_usage = f"{psutil.cpu_percent(interval=0.5)}%"
memory_usage = f"{psutil.virtual_memory().percent}%"
cpu_temperature = get_cpu_temp()
# 绘制信息
with canvas(device) as draw:
draw.text((0, 0), top_line, fill="white")
# IP地址行 - 第1行
draw.text((LABEL_X, LINE_HEIGHT * 1), "IP:", fill="white")
draw.text((VALUE_X, LINE_HEIGHT * 1), ip_address, fill="white")
# CPU使用率 - 第2行
draw.text((LABEL_X, LINE_HEIGHT * 2), "CPU:", fill="white")
draw.text((VALUE_X, LINE_HEIGHT * 2), cpu_usage, fill="white")
# 内存使用率 - 第3行
draw.text((LABEL_X, LINE_HEIGHT * 3), "MEM:", fill="white")
draw.text((VALUE_X, LINE_HEIGHT * 3), memory_usage, fill="white")
# CPU温度 - 第4行
draw.text((LABEL_X, LINE_HEIGHT * 4), "TEMP:", fill="white")
draw.text((VALUE_X, LINE_HEIGHT * 4), cpu_temperature, fill="white")
time.sleep(0.3)
except KeyboardInterrupt:
print("\n程序已退出")
接着,退出vim
然后,你可以运行
sudo python3 oled.py
如果屏幕亮了,就说明成功了!!
五、开机自启
我们可以用systemd以实现开机自启
sudo vim /etc/systemd/system/oled.service
把以下内容复制进去
[Unit]
Description=OLED 启动程序
After=network.target
[Service]
ExecStart=/usr/bin/python3 /home/实际用户名/oled.py
Restart=always
User=xxxx
Environment=PYTHONUNBUFFERED=1
[Install]
WantedBy=multi-user.target
其中ExecStart=
要填 你的脚本完整路径(包括 /usr/bin/python3
的位置,你可以用 which python3
查看)我在上文中就是在用户目录创建的oled.py,所以我写的路径是这样的,如果你不是在用户目录创建的,就给他改成实际目录
User=
是你的用户名
接着,保存并退出编辑界面
然后,刷新systemd并启动服务
sudo systemctl daemon-reexec # 重新执行 systemd 的主进程
sudo systemctl daemon-reload # 重新加载 systemd 的配置文件
sudo systemctl enable oled.service # 让OLED服务开机自启
sudo systemctl start oled.service # 立即启动OLED服务
可以运行代码来查看oled服务的状态
sudo systemctl status oled
到此就配置完了。如果文章有问题请指出。部分代码是chatgpt 4o辅助的,但是亲测没问题