最近在捣鼓树莓派,在此仅分享一下自己的配置过程

效果展示

IMG_8471.JPG

上图展示了一个树莓派连接一个SSD1306 OLED小屏幕显示时间、IP地址、CPU占用率、内存占用率以及温度等信息

本文提供的代码是最基础最简单的,效果如图上。如果您有更多的美观需要,可以自行修改

一、材料

  • 1个运行良好的树莓派(本文以树莓派4B举例)
  • 1个SSD1306 OLED屏幕
  • 4根母对母杜邦线

二、前置工作

1.开启I2C功能

  • 这个开启I2C的方法仅针对Raspberry Pi OS系统

执行sudo raspi-config命令,选择Interface Options

截屏2025-06-12 下午10.02.35.png

选择开启I2C

截屏2025-06-12 下午10.02.43.png

2.安装库

OLED有两个库:Adafruit_Python_SSD1306Luma.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,有直观引脚图和说明

v2-b68a8cb147ddc5a01bfc6da451b925e1_r.jpg

屏幕的接树莓派的功能
GNDGND地线
VCC3.3V正极
SDASDA数据线
SCLSCL时钟

a02da6d1a76c11cb56cd2a61203404a8.png
(转载自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辅助的,但是亲测没问题

标签: none

添加新评论