JetsonNano搭载的扩展板的OLED显示屏的使用(实时显示IP、内存、CPU等)

在DIY机器人时,我们可以使用远程连接到机器人查看相关信息,也就是前面提到的远程连接VNC-Viewer与安全传输WinSCP软件,通过VNC-Viewer来连接,不过对于不便使用电脑或者想简单直观的看到机器人常见的属性,比如IP地址,内存和CPU等情况,一般使用小的显示屏直接显示就好了。

我们这里使用到的是128*32分辨率的OLED显示屏,可以显示IP地址、内存、CPU、硬盘大小等,这些信息对于我们来说已足够。

想要在显示屏显示信息,需要用到驱动,这里我们使用的是Adafruit_Python_SSD1306驱动,顾名思义OLED屏的驱动名称叫做SSD1306,这是很常见的OLED的驱动。开源代码:https://github.com/adafruit/Adafruit_Python_SSD1306/

我们打开https://github.com/adafruit/Adafruit_Python_SSD1306/blob/master/Adafruit_SSD1306/SSD1306.py

SSD1306_I2C_ADDRESS = 0x3C    # 011110+SA0+RW - 0x3C or 0x3D

可以知道OLED的I2C外设地址为0x3C,里面存放着关于驱动屏幕的所有方法、寄存器信息。

Linux命令

在这之前为避免Jetbotmini开启的实时刷新显示的jetbotmini_stats.service运行的stats.py程序与我们现在正要测试的程序都同时使用一个I2C外设OLED屏而产生异常冲突

我们先在Jetbotmini命令控制台停止刷新OLED服务的运行:sudo systemctl stop jetbotmini_stats

内存,CPU和硬盘情况用到Linux命令

这里我直接在wsl中 运行测试下这个格式化:

f.sh内容如下,当然单独一条一条命令执行也是可以的,跟Windows中的批处理一样:

free -m | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'
df -h | awk '$NF=="/"{printf "Disk Usage: %d/%dGB (%s)\n", $3,$2,$5}'
top -bn1 | grep load | awk '{printf "CPU Load: %.2f\n", $(NF-2)}' 

执行看下效果(内存、硬盘、CPU负载的使用情况与占比):

(base) tony@TonyComputer:/mnt/c/Users/Tony$ ./f.sh
Memory Usage: 65/12747MB (0.51%)
Disk Usage: 4/251GB (2%)
CPU Load: 0.00

当然也可以在jetbotmini平台执行命令,也就是在Ubuntu系统上

新建文件:vi f.sh

复制粘贴之后 :wq回车保存即可,然后直接执行:./f.sh

如果出现权限错误:bash: ./f.sh: Permission denied

修改文件权限:chmod 777 f.sh

然后我们来实时将内存等信息显示到OLED显示屏,先导入需要的模块

import time
import Adafruit_SSD1306
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
from jetbotmini.utils.utils import get_ip_address
import subprocess

SSD1306驱动

初始化驱动SSD1306,将屏幕清空,设置字体等操作

# 128x32 显示与硬件I2C:
disp = Adafruit_SSD1306.SSD1306_128_32(rst=None, i2c_bus=0, gpio=1)# 将gpio设置hack为1,以避免平台检测
# 初始化库。
disp.begin()
# 清除显示
disp.clear()
disp.display()
# 为绘图创建空白图像
# 确保创建带有模式为'1'即1位颜色的图像
width = disp.width
height = disp.height
image = Image.new('1', (width, height))
# 获取要在图像上绘制的绘图对象
draw = ImageDraw.Draw(image)
# 画一个黑色填充框来清除图像
draw.rectangle((0,0,width,height), outline=0, fill=0)
# 画一些形状
# 首先定义一些常量,以方便调整形状的大小
padding = -2
top = padding
# 从左到右移动,以跟踪绘图图形的当前x位置。
x = 0
# 加载默认字体
font = ImageFont.load_default()

可以查看下驱动SSD1306,熟悉下有哪些属性和方法:

print(dir(disp))
#['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_buffer', '_gpio', '_i2c', '_initialize', '_log', '_pages', '_rst', '_spi', 'begin', 'clear', 'command', 'data', 'dim', 'display', 'height', 'image', 'reset', 'set_contrast', 'width']

然后就是每隔一秒循环刷新信息显示到OLED屏

while True:
    # 画一个黑色填充框来清除图像。
    draw.rectangle((0,0,width,height), outline=0, fill=0)

    # 从这个链接可以获取系统监视的Shell脚本 : 
    #https://unix.stackexchange.com/questions/119126/command-to-display-memory-usage-disk-usage-and-cpu-load
    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/%sM %.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 )

    draw.text((x, top),       "eth0:" + str(get_ip_address('eth0')),  font=font, fill=255)
    draw.text((x, top+8),     "wlan0:" + str(get_ip_address('wlan0')), font=font, fill=255)
    draw.text((x, top+16),    str(MemUsage.decode('utf-8')),  font=font, fill=255)
    draw.text((x, top+25),    str(Disk.decode('utf-8')),  font=font, fill=255)

    # 显示图像
    disp.image(image)
    disp.display()
    time.sleep(1)

下图就是OLED显示的Jetbotmini使用信息的界面

清空屏幕-->实时显示

1. 第一行内容:有线网络的IP地址,这里我使用无线连接的,所以是None

2. 第二行内容:WiFi无线网络的IP地址

3. 第三行内容:运行内存使用情况与已用运行内存百分比

4. 第四行内容:磁盘内存使用情况与已用磁盘内存百分比

猜你喜欢

转载自blog.csdn.net/weixin_41896770/article/details/129662615