计算机负载模拟指示器

我曾经见过ClusterM的一篇文章,他用旧指示器的形式制作了一个小部件。 我真的很喜欢这个想法,因为在这个项目中有一种愉快的复古感觉。 但这真是倒霉-我从来没有与微控制器本身合作过,所以我经常编程,所以我推迟了很长时间。 但是最近,我看了一个视频 ,Alex在他的朋友Open source的帮助下修改了该程序,并开发了一种用于处理Arduino数据的算法。 在本文中,我想展示如何实现此任务。


第一阶段。我如何处理启动监视器代码



下载监视程序后,我将arduino与显示器连接起来,在该显示器中缝入了exampleRead示例库中的代码,它仅显示arduino在com端口上收到的所有内容。 如您所见,我得到了一系列字符,起初我尝试通过实验来理解,但随后 吐口水 我决定采取更加专业的行动,并使用代码阅读器打开了提供的源代码。 在帮助下,我找到了将所有数据发送到一个数组中的部分,为了方便起见,将其记录在一张纸上,因为我没有和Alex及其团队一起更改代码,所以我只使用了处理器,视频卡和RAM负载值,这些都是PCdata值[ 4],PCdata [5],PCdata [6]。 之后,我只能继续使用Arduino。


第二阶段。 我们处理数据解析和处理


老实说,我不会说我以初学者怪胎的方式弄清楚了,我只是意识到我需要Alex编写的代码,而没有任何修改,所以我将其添加到了我的代码中。 解析如下:


while (Serial.available() > 0) { char aChar = Serial.read(); if (aChar != 'E') { inData[index] = aChar; index++; inData[index] = '\0'; } else { char *p = inData; char *str; index = 0; String value = ""; while ((str = strtok_r(p, ";", &p)) != NULL) { string_convert = str; PCdata[index] = string_convert.toInt(); index++; } index = 0; isDataExist = true; } } } 

可以肯定的是,通过lcd.Write命令,我交替输出PCdata [4]值,以确保我接受所需的数据。


接下来,我开始将百分比数据转换为PWM信号。 知道我们发送的信号是0到255之间的值,并且我们接受了使用map函数并使用constrain函数限制值的0到100之间的值(这是工作负载的百分比),我编写了一个简单的代码:


  cpu = map(cpu, 0, 100, 0, 255); cpu = constrain(cpu, 0, 255); analogWrite(9, cpu); gpu= PCdata[5]; gpu = map(gpu, 0, 100, 0, 255); gpu = constrain(gpu, 0, 255); analogWrite(3, gpu); mem= PCdata[6]; mem = map(mem, 0, 100, 0, 255); mem = constrain(mem, 0, 255); analogWrite(5, mem); 

第三阶段。 如何将3个指标连接到一个arduino?


当我刚开始时,我只连接了一个指示器,并且一切都很好,但是一旦第二个指示器出现,问题就开始出现。 Arduino无法将两者“摆动”在一起,我怀疑这是由于Arduino板所致,有很多东西 uzz 如果您将Atmega本身用作ClusterM,则会消耗能量(各种LED,稳定器,防止傻瓜等)–应该足够,肯定两个。 我在mosfet晶体管的帮助下解决了这个问题,在设计板上使用了Aliexpress的IRF520,通过mosfet连接了一个指示器,然后将第二个指示器直接连接到arduino,它就起作用了。 由于带有Ali的木板太大,我决定自己焊接,根本不想举起木板,所以我用记号笔在纺织品上画了一个记号笔。



它紧凑地出现了,但对我而言,这是主要的。


接线图与带有Ali的板的接线图相同,差不多,我卸下了LED,因为这里不需要操作指示。



第四阶段。 指标的设计背景


我专门保留了设计以供发布,但我成功地丢失了最终草图,但保留了放大的原型。 后来我意识到这不是什么大问题,因为有必要调整指标的大小, 油漆 photoshop 2020,所以我确定您也可以对其进行修改。



在我看来,结果非常有趣,仍然需要为螺钉和箭头切出一个位置-完成!




舞台V.RGB背光


因为在此过程中,我意识到我无处可推LED-最终我拒绝了,但是我做了初始代码,这很简单-每个人都可以处理,只需为三个指示器添加所有颜色即可。 在错觉板上设计-像时钟一样工作:


  void led() { if (PCdata[4] < 20 ) { digitalWrite (6, HIGH);//,       rgb } else{ digitalWrite (6, LOW); } if (PCdata[4] > 20 && PCdata[4] < 60 );// ,     //     { digitalWrite(5, HIGH);//   -  } //      } 

总结
事实证明,这是一个有趣的小部件,在玩游戏,编辑视频和照片时非常有用,因为可以评估计算机是否过载。


提示-尽量不要丢掉指标,我不小心从RAM跌落了,箭头没有恢复为零,它固定了,但是拐杖很糟糕。


arduino的完整代码


 //#include <Wire.h> //    //#include <LiquidCrystal.h> //    ,     //LiquidCrystal lcd(8, 9, 4, 5, 6, 7); char inData[82]; //    () int PCdata[20]; //       byte index = 0; String string_convert; bool isDataExist = false; int cpu; int mem; int gpu; void setup() { Serial.begin(9600); } void loop() { parsing(); //led();       cpu = PCdata[4]; cpu = map(cpu, 0, 100, 0, 255); cpu = constrain(cpu, 0, 255); analogWrite(9, cpu); gpu= PCdata[5]; gpu = map(gpu, 0, 100, 0, 255); gpu = constrain(gpu, 0, 255); analogWrite(3, gpu); mem= PCdata[6]; mem = map(mem, 0, 100, 0, 255); mem = constrain(mem, 0, 255); analogWrite(5, mem); } void parsing() { while (Serial.available() > 0) { char aChar = Serial.read(); if (aChar != 'E') { inData[index] = aChar; index++; inData[index] = '\0'; } else { char *p = inData; char *str; index = 0; String value = ""; while ((str = strtok_r(p, ";", &p)) != NULL) { string_convert = str; PCdata[index] = string_convert.toInt(); index++; } index = 0; isDataExist = true; } } } /*void led() { if (PCdata[4] < 20 ) { digitalWrite (6, HIGH);//       rgb } else{ digitalWrite (6, LOW); } if (PCdata[4] > 20 && PCdata[4] < 60 );// ,     ,     { digitalWrite(5, HIGH);//   -  } //      } */ 

监视程序在Alex的档案中
我使用的是旧版本,效果很好,所以我建议您。


我要感谢Alex和他的团队完成了开源代码,并感谢ClusterM用户演示了他的小工具,并感谢我的父亲为解密代码提供了帮助。

Source: https://habr.com/ru/post/zh-CN429582/


All Articles