查看引脚定义#

依赖安装#
1pip install psutil luma.core luma.oled
 1import subprocess
 2import time
 3import socket
 4import psutil
 5from luma.core.interface.serial import i2c, spi
 6from luma.core.render import canvas
 7from luma.oled.device import ssd1306, ssd1325, ssd1331, sh1106
 8 
 9serial = i2c(port=2, address=0x3C)
10device = ssd1306(serial)
11 
12def get_cpu_temperature():
13    with open('/sys/class/thermal/thermal_zone0/temp', 'r') as file:
14        temperature = int(file.read()) / 1000.0
15    return temperature
16 
17cmd = "hostname -I | cut -d\' \' -f1"
18IP = subprocess.check_output(cmd, shell=True).decode().strip()
19 
20    # 将字节转换为 GB
21def bytes_to_gb(bytes):
22    return bytes / (1024 ** 3)
23 
24# 将字节转换为合适的单位
25def convert_size(size):
26    # 定义单位列表
27    units = ['B', 'KB', 'MB', 'GB', 'TB']
28 
29    # 迭代转换单位直到小于1024
30    for unit in units:
31        if size < 1024:
32            return f"{size:.2f} {unit}"
33        size /= 1024
34 
35    return f"{size:.2f} {units[-1]}"
36 
37# 获取初始的输入输出流量
38net_io_start = psutil.net_io_counters()
39 
40while True:
41    with canvas(device) as draw:
42        cmd = "hostname -I | cut -d\' \' -f1"
43        current_IP = subprocess.check_output(cmd, shell=True).decode().strip()
44        timestamp_start = time.time()
45 
46        # 等待一秒钟
47        time.sleep(1)
48        
49        cpu_usage = psutil.cpu_percent(interval=1)
50        cpu_temperature = get_cpu_temperature()
51 
52        # 获取内存占用情况
53        memory = psutil.virtual_memory()
54 
55        # 获取总内存大小(以 GB 为单位)
56        total_memory = bytes_to_gb(memory.total)
57 
58        # 获取可用内存大小(以 GB 为单位)
59        available_memory = bytes_to_gb(memory.available)
60 
61        # 获取已使用内存大小(以 GB 为单位)
62        used_memory = bytes_to_gb(memory.used)
63 
64        # 获取内存使用率
65        memory_usage = memory.percent
66 
67        disk = psutil.disk_usage('/')
68        total_disk = bytes_to_gb(disk.total)
69        free_disk = bytes_to_gb(disk.free)
70 
71        # 获取当前的输入输出流量和时间戳
72        net_io_current = psutil.net_io_counters()
73        timestamp_current = time.time()
74 
75        # 计算时间间隔
76        time_interval = timestamp_current - timestamp_start
77 
78        # 计算上行和下行网速
79        upload_speed = (net_io_current.bytes_sent - net_io_start.bytes_sent) / time_interval 
80        download_speed = (net_io_current.bytes_recv - net_io_start.bytes_recv) / time_interval
81        upload_speed = upload_speed / 2
82 
83        # 切换单位
84        upload_speed = convert_size(upload_speed) 
85        download_speed = convert_size(download_speed)
86 
87 
88        # 更新初始的输入输出流量
89        net_io_start = net_io_current
90 
91        draw.rectangle(device.bounding_box, outline="white", fill="black") # 让屏幕周围显示一个框
92        draw.text((2,1),f"IP:{current_IP}",fill="white")
93        draw.text((2,11),f"CPU_use:{cpu_usage}%",fill="white")
94        draw.text((2,21),f"CPU_tem:{cpu_temperature:.2f}°C",fill="white")
95        draw.text((2,31),f"MEM:{memory_usage:.2f}%",fill="white")
96        draw.text((2,41), f"DISK:{free_disk:.2f}/{total_disk:.2f}GB", fill="white")
97        draw.text((2,51), f"NET:{upload_speed}/{download_speed}", fill="white")
