arduino+oled=电脑性能监测器

前两天,狗群主nemo在群里发了个视频


作为一个电子系的学生,我当即就吹了下nb:

但由于这两天期末考试繁忙,所以先搁置了一两天,直到今天考完传感器,回家就来兑现这句话

因为原作者的思路是aida64允许其他进程来访问自己的一部分内存,然后写了c#去读,并且整理之后发送给下位机。可是我不会c#啊(哭),c到现在也没操作过读内存(话说寄存器可以看做内存的话那倒是经常操作)
于是我打开aida64,看到与外部程序共享数据的选单里面有四个选项:

那我换个途径去拿数据吧,于是我选择了WMI(接下来是失败经验)
至于c#,我就拿python替换了

查了查csdn,pip install了两个关于WMI的库,实现了读取cpu利用率并打印:(注意这里并没有用到AIDA64,只是在读windows系统的数据)

cpuArr = wmi.WMI()
for cpu in cpuArr.Win32_Processor():
            timestamp = time.strftime('%a, %d %b %Y %H:%M:%S', time.localtime())
            print ('%s | Utilization: %s: %d %%' % (timestamp, cpu.DeviceID, cpu.LoadPercentage))

接下来就碰到了两个问题

  1. 官方文档并没有给怎么读取aida64传输到WMI的数据,翻了一阵子谷歌,也没有社区讨论过
  2. 我试着对上面那个代码做了延时循环,发现我的设定延时和实际输出延时对不上,试了几下发现光读一次WMI的操作就要花掉1s时间……那我1s更新一次数据岂不是这程序就得一直占着我cpu?

于是,WMI计划失败,我把眼光投向了注册表

对我这种萌新来说,要写python先下库,首先下了这俩库:win32api、win32con

然后按官方文档中给的地址打开注册表找到数据

我这里只开了三个选项,分别是cpu占用百分比,内存占用百分比和当前时间,看名称很容易分辨

然后以获取cpu占用百分比为例,代码如下:

reg_root = win32con.HKEY_CURRENT_USER
reg_path = r"Software\FinalWire\AIDA64\SensorValues"
reg_flags = win32con.WRITE_OWNER | win32con.KEY_WOW64_64KEY | win32con.KEY_ALL_ACCESS

#读取键值
key = win32api.RegOpenKeyEx(reg_root, reg_path, 0, reg_flags)
value, key_type = win32api.RegQueryValueEx(key, 'Value.SCPUUTI')
#print(value)

#关闭键
win32api.RegCloseKey(key)

测试发现速度也相当快,然后将这三个数据都拿过来放进一个字符串,中间加点分隔符,给串口送过去就完成上位机工作啦

串口的话,先下个serial库,然后配置
arduino = serial.Serial('COM27', 9600)
这边我的arduino接的是com27,然后波特率和下位机软件一致即可

s = str(value1)+'/'+str(value2)+'/'+str(value3)+'/'
arduino.write(s.encode('utf-8'))

这是数据整合和串口输出

上位机完成

下位机基本没啥好讲的,只要arduino读取串口,按分隔符把数据理出来,调个u8g2库打印到oled上即可,代码将一并附在下面

最后来个完成品图

不愧是单身贵族,连拍照时间都能选的这么好(哭)

两份代码下载地址

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注