向任何 Raspberry Pi 项目添加状态监视器对于实时了解 CPU 在使用、温度和 RAM 使用以及重要连接信息方面的执行情况非常有用。如果超频是您的事,那么这对于查看您的设置对 Pi 的影响并做出相应的调整非常有价值。
Breadboard Mates TIMI-130显示器与 Breadboard Mates Pi 适配器一起,是该项目的完美选择,因为它易于使用且启动和运行所需的代码简单。
Breadboard Mates 提供了一个 Python 库,使 Python 编码体验变得轻松。
该项目需要以下内容。
通过访问https://www.raspberrypi.com/software/并按照安装操作系统的说明,设置 Raspberry Pi 非常容易。
安装 Python 库和 Git 克隆项目文件需要 Internet 连接。
Pi OS 需要配置为启用 SSH 并启用我们将用来与 TIMI-130 通信的串行端口 (UART)。
Pi 适配器需要连接到 Pi GPIO 接头和连接到适配器的 TIMI-130,如下所示。
由于需要为状态监视器配置 TIMI-130,因此需要将 Pi 适配器上的开关设置为 PROG。
接下来,将Mates Programmer连接到 Pi 适配器。
将 USB 电缆连接到 Mates Programmer 和 PC USB 端口。TIMI-130 现在已准备好安装状态监视器项目。
需要Mates Studio来配置 TIMI-130,您可以从这里下载https://breadboardmates.com/products/mates-studio/
创建状态监视器项目当您启动 Mates Studio 时,系统会提示您选择您的产品。
单击 TIMI-130,TIMI-130 的图形表示将出现在右侧面板上。
在 TIMI-130 的图像上单击两次可将显示屏旋转 180 度。
点击 CONFIRM 然后选择Commander Environment 。
Commander 环境现在将打开。
点击“+”浏览页面库。
然后从通知选项卡中选择状态和资源监视器,然后单击确认。
波特率需要从 9600 更改为 115200,方法是单击工具和配置按钮并选择 115200
接下来,通过单击 COM 面板并从下拉菜单中选择正确的端口,为 Mates Programmer 选择 com 端口。
最后,单击上传按钮将状态监视器上传到 TIMI-30。
状态监视器现在将显示在 TIMI-130 上
现在可以从 Pi 适配器中移除 USB 引线和 Mates Programmer。Pi 适配器开关现在可以设置为 HOST,准备好接收来自 Pi 的命令。
所有最近的 Raspberry Pi OS Distro 都预装了 Python 3,因此我们可以使用 PIP 安装所需的 Python 库。
psutil库可以通过运行安装
pip3 install psutil
接下来,可以通过运行安装 Breadboard Mates Controller 库
pip3 install rpi-mates-controller
接下来,我们可以从 Github 克隆 Python 代码
git clone https://github.com/BreadBoardMates/RPi-Status-Monitor.git
或者,可以从这里下载 Python 代码https://github.com/BreadBoardMates/RPi-Status-Monitor
移动到 RPi-Status-Monitor 文件夹
cd RPi-Status-Monitor
然后运行应用程序
python3 ./BBMPiStatusMonitor.py
TIMI-130 应首先重置为屏幕外,然后开始显示 CPU 使用状态、CPU 温度和 RAM 使用状态以及连接的 IP 地址和正常运行时间。
如果您希望状态监视器作为后台任务运行,只需在命令中添加“&”即可。
python3 ./BBMPiStatusMonitor.py &
通过在 Mates Studio 中创建新页面并更改 Python 代码以匹配所使用的任何新小部件,可以简单地更改或改进该项目以获得所需的外观。唯一的限制是想象力。
import time
import sys
import psutil
import socket
import fcntl
import struct
import uptime
from gpiozero import CPUTemperature
from rpi_mates.controller import RPiMatesController as MatesController
from mates.constants import *
def up():
t = uptime.uptime()
days = 0
hours = 0
min = 0
out = ''
while t > 86400:
t -= 86400
days += 1
while t > 3600:
t -= 3600
hours += 1
while t > 60:
t -= 60
min += 1
out += str(days) + 'd '
out += str(hours) + 'h '
out += str(min) + 'm'
return out
def get_interface_ipaddress(network):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915,
struct.pack('256s',
network[:15].encode('utf-8')))[20:24]) # SIOCGIFADDR
except OSError:
return '0.0.0.0'
if __name__ == '__main__':
mates = MatesController('/dev/ttyS0')
mates.begin(115200)
gtime = up()
lastCpuUse = 0
lastTemp = 0
lastlTemp = 0
lastRamUse = 0
lastWIPaddr = '0.0.0.0'
lastEIPaddr = '0.0.0.0'
mates.updateTextArea(5, gtime, True)
cpu = CPUTemperature()
lastlTemp = int(cpu.temperature * 10)
IPinterval = 0
while True:
cpu = CPUTemperature()
gcpu = int(cpu.temperature)
lcpu = int(cpu.temperature * 10)
cpuuse = int(psutil.cpu_percent())
ramuse = int(psutil.virtual_memory().percent)
if cpuuse < lastCpuUse:
lastCpuUse = lastCpuUse - (1 + (lastCpuUse - cpuuse > 9))
if cpuuse > lastCpuUse:
lastCpuUse = lastCpuUse + 1 + (cpuuse - lastCpuUse > 9)
if gcpu < lastTemp:
lastTemp = lastTemp - (1 + (lastTemp - gcpu > 9))
if gcpu > lastTemp:
lastTemp = lastTemp + 1 + (gcpu - lastTemp > 9)
if lcpu < lastlTemp:
lastlTemp = lastlTemp - 1
if lcpu > lastlTemp:
lastlTemp = lastlTemp + 1
if ramuse < lastRamUse:
lastRamUse = lastRamUse - (1 + (lastRamUse - ramuse > 9))
if ramuse > lastRamUse:
lastRamUse = lastRamUse + 1 + (ramuse - lastRamUse > 9)
if gcpu != lastTemp:
mates.setWidgetValueByIndex(MatesWidget.MATES_MEDIA_GAUGE_B,0, lastTemp)
if lcpu != lastlTemp:
mates.setLedDigitsShortValue(0, lastlTemp)
if cpuuse != lastCpuUse:
mates.setWidgetValueByIndex(MatesWidget.MATES_MEDIA_GAUGE_B,1, lastCpuUse)
mates.setLedDigitsShortValue(1, lastCpuUse)
if ramuse != lastRamUse:
mates.setWidgetValueByIndex(MatesWidget.MATES_MEDIA_GAUGE_B,2, lastRamUse)
mates.setLedDigitsShortValue(2, lastRamUse)
if IPinterval > 20:
tempIPaddr = get_interface_ipaddress('eth0')
if tempIPaddr != lastEIPaddr:
mates.updateTextArea(1, tempIPaddr, True)
lastEIPaddr = tempIPaddr
tempIPaddr = get_interface_ipaddress('wlan0')
if tempIPaddr != lastWIPaddr:
mates.updateTextArea(3, tempIPaddr, True)
lastWIPaddr = tempIPaddr
IPinterval = 0
IPinterval = IPinterval + 1
time.sleep(0.060)
tempTime = up()
if tempTime != gtime:
mates.updateTextArea(5, tempTime, True)
gtime = tempTime
time.sleep(0.040)
Python 代码将创建一个 Mates Controller 实例并以 115200 波特率启动它。
mates = MatesController('/dev/ttyS0')
mates.begin(115200)
然后创建一组变量,这些变量将在每次更新各种状态后设置。这使主循环能够将刚刚读取的状态与其上一个状态进行比较,然后仅在其值发生变化时才更新相应的小部件。
lastCpuUse = 0
lastTemp = 0
lastlTemp = 0
lastRamUse = 0
lastWIPaddr = '0.0.0.0'
lastEIPaddr = '0.0.0.0'
如果需要,循环的每次迭代都将使用以下简单命令更新显示屏上的小部件
mates.setWidgetValueByIndex(MatesWidget.MATES_MEDIA_GAUGE_B,0, lastTemp)
mates.setLedDigitsShortValue(0, lastlTemp)
mates.setWidgetValueByIndex(MatesWidget.MATES_MEDIA_GAUGE_B,1, lastCpuUse)
mates.setLedDigitsShortValue(1, lastCpuUse)
mates.setWidgetValueByIndex(MatesWidget.MATES_MEDIA_GAUGE_B,2, lastRamUse)
mates.setLedDigitsShortValue(2, lastRamUse)
mates.updateTextArea(1, tempIPaddr, True)
mates.updateTextArea(3, tempIPaddr, True)
mates.updateTextArea(5, tempTime, True)
以下是软件应用程序、库和已完成项目文件的链接。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !