ESP32 基于micropython监视PC机资源2
前言
运行全屏游戏软件或者使用虚拟机往往会出现异常奔溃的情况,所以在此使用ESP32制一个监视计算机资源消耗的桌面摆件。
开发语言:python/micropython
主控芯片:ESP32-WROOM-32E开发板
外设模块:0.96寸四针OLED(GND,VCC,SCL,SDA)
没想到这么快就出了第二代,好吧,其实不是2,只是做了一些优化而已。
新增功能:
1.看门狗复位——发现无论如何优化都会导致程序最终内存溢出导致进程崩溃,现在添加看门狗复位器,在程序跑飞后的5s完成复位。
2.CPU消耗:发现CPU在占用不大的时候一直在快慢横跳,诸君请合理利用宝贵的CPU资源,避免CPU着凉
3.剩余内存消耗:当你内存余量不足时,就不要去开启不该开的大型软件了
4.内存占用比
发送端(个人PC机)
我们的电脑需要需要在后台运行以下Python脚本,其原理是获取计算机内存资源后通过udp协议发送至ESP32
import socket
import time
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
sleep_num = 0.2
def send(msg):
a = "{}".format(msg)
buf = bytes(a,'utf-8')
# 192.168.31.150 ESP32-IP
s.sendto(buf, ("192.168.31.150", 9090)) # 向服务器发送图像数据
time.sleep(sleep_num)
while True:
mem = psutil.virtual_memory()
# 系统总计内存
cpu = psutil.cpu_percent(interval=0.2)
percent = mem.used / mem.total
total = float(mem.total) / 1024 / 1024 / 1024
used = float(mem.used) / 1024 / 1024 / 1024
free = float(mem.free) / 1024 / 1024 / 1024
cpu = str(cpu)[:4]
percent = str(percent)[:6]
used = str(used)[:4]
free = str(free)[:4]
total = str(total)[:4]
li = [cpu, total,used,free,percent]
print(li)
send(str(li))
接收方(ESP32)
from network import WLAN,STA_IF
import socket
import gc
from machine import I2C, Pin,freq,WDT
from ssd1306 import SSD1306_I2C
import time
# oled屏幕初始化
freq(240000000)
i2c = I2C(0, sda=Pin(23), scl=Pin(22))
display = SSD1306_I2C(128, 64, i2c)
# 网络连接
wlan = WLAN(STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect('Xiaomi_E417', '703703703')
while not wlan.isconnected():
pass
print('网络配置:', wlan.ifconfig())
# 建立套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
s.bind((wlan.ifconfig()[0], 9090))
gc.enable()
cpu_x = 0
cpu_y = 8
cpu_len = 6
sleep_num = 0.2
# 防止主机未运行脚本使程序异常终止
li = [0,0,0,0,0]
wdt = WDT(timeout=10000)
while True:
# 接收数据
data, IP = s.recvfrom(60000)
# 数据处理
print(str(data)[2:-1])
li = eval(str(data)[2:-1])
for i in range(len(li)):
li[i] = float(li[i])
# li = [cpu, total,used,free,percent]
# 内存收集
gc.mem_alloc()
gc.mem_free()
gc.collect()
cpu = str(li[0]) + "%"
used = str(li[2])+"/"+str(li[1]) + "G"
free = str(li[3]) + "/" + str(li[1]) + "G"
persent = str(li[4])
# 输出到oled屏幕
display.fill(0)
display.text("cpu:{}".format(cpu),0,0,1)
display.rect(cpu_x, cpu_y, 120, cpu_len, 1)
display.fill_rect(cpu_x, 8, int((128-cpu_x)*li[0]/100)+cpu_x, cpu_len, 1)
display.text("used:{}".format(used),0,16,1)
display.rect(cpu_x, cpu_y, 120, cpu_len, 1)
display.fill_rect(cpu_x, 24, int((128-cpu_x)*li[2]/li[1])+cpu_x, cpu_len, 1)
display.text("free:{}".format(free),0,32,1)
display.rect(cpu_x, cpu_y, 120, cpu_len, 1)
display.fill_rect(cpu_x, 40, int((128-cpu_x)*li[3]/li[1])+cpu_x, cpu_len, 1)
display.text("percent:{}".format(str(li[4]*100) + "%"),0,48,1)
display.rect(cpu_x, cpu_y, 120, cpu_len, 1)
display.fill_rect(cpu_x, 56, int((128-cpu_x)*li[4])+cpu_x, cpu_len, 1)
display.show()
time.sleep(sleep_num)
wdt.feed()
使用效果
如以下演示所示:
资源监视2
写在最后
在考虑要不要加硬盘资源···不过硬盘读写占用比较少,效果不明显,索性砍了吧