趣味玩意,用Arduino开发板做CPU监视器

Arduino是什么?
不知道自己google去,简单的说就是一个给我这种嵌入式完全不懂的文盲来做机器人之流的电子小玩意的平台,开发很简单,就是类似与c语言的语法,上手极快,关键是还可以通过一定的手段和Andriod联动。
好吧,这次和Andriod无关,只是我突发奇想罢了。我一直希望有个小屏幕可以监视我的系统状态,比如CPU占用,内存占用等等。可惜最便宜的usb屏幕也要1000多块,太贵了,不实惠,于是就萌发用Arduino自己做一个。
设备很简单,就是一块Arduino的板子,一块LCD1602屏幕,一台MAC。我就只做了一个简单的CPU占用的东西,如图:

IMG_9191

先说说我的思路吧,首先从Mac上通过一个程序读取到CPU占用率,然后通过串口发送到板子上,板子上缓冲一下,再输出到LCD屏幕。流程非常简单。不过问题还是蛮多。
首先,怎么读取CPU占用率?
我先是打算用Cocoa的系统函数来调用,查了半天Mac的资料后果断放弃,太复杂了,而且我Object-c又不是很熟悉。之后的想法是打算利用shell程序来完成,通过C和shell中的top命令交互来实现。这里有个小插曲,因为Linux下面其实读取这些可以直接去/proc/这个虚拟目录下读取,但是Mac这类系统是没有这个虚拟目录的,所以只能用top,而且Mac的top函数的参数又和Linux之类的GNU的top不同。总之折腾了很久,才有了下面这句销魂的shell命令

$ top -n0 -l1

啥意思?很简单,就是不要显示进程,top执行一次就自动退出,就那么简单。至于为什么可以达到这样的效果,请有mac或者别的BSD系统的同学man top一下就好。
有了这个就方便的多了,c语言部分去掉串口通讯的就只很简单的一部分了,就是调用shell函数,返回,字符串处理,这几个问题。串口通讯的代码早就很熟悉了,最近一直开发这种东西(其实python下面串口通讯会简单的多,不过我比较熟悉C,所以还是选择了C)
关键代码如下:

FILE *fp; char a[256]; fp=popen("top -n0 -l1","r"); fgets(a,sizeof(a),fp)

之后的过程势如破竹,Arduino平台上的更加容易,就是简单的读写罢了。直接上代码就好:

#include #include LiquidCrystal_I2C lcd(0x27,16,2); byte line = 0; // track which line of the display we are on void setup(){ // set up the LCD's number of columns and rows: lcd.init(); lcd.backlight(); // initialize the serial communications: Serial.begin(9600); lcd.setCursor(0,0); lcd.clear(); } void loop() { char input; while(Serial.available() > 0) { input = Serial.read(); switch(input) { case 0: // line feed lcd.clear(); break; default: if(input>31) lcd.print(input); } } }

最后再上一个图~哈:

IMG_9194