在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. 第四行内容:磁盘内存使用情况与已用磁盘内存百分比