ESP32 基于micropython监视PC机资源-第二代

前言

运行全屏游戏软件或者使用虚拟机往往会出现异常奔溃的情况,所以在此使用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

写在最后

在考虑要不要加硬盘资源···不过硬盘读写占用比较少,效果不明显,索性砍了吧

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IoT_H2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值