环境:
-
Ubuntu 16.04 64 bit
-
QT5.13.1/QT5.12
原理
对于Linux来说一切都是文件,温度传感器也是个文件,如果要获取某个温度传感器的数值,可以读取相应的文件,Linux某些版本中,有一些温度传感器对应的文件在目录/sys/class/hwmon,比如我的一台装了ubuntu 1604的电脑,内核是4.15,如下:
其中hwmon0是跟w83627芯片相关的,w83627(DA00-WW83627DHG-P.pdf)是nuvoton(以前的华邦)出的监控IC,hwmon1目录对应的是CPU内部的温度传感器(Kernel driver k10temp)。这些传感器的信息可以使用cat命令读出。
要使用QT编写个程序来显示某个传感器的数值,只需要实现读取温度传感器对应的文件即可。
创建工程
先做个简单的,使用QT的Label显示我的电脑CPU温度,也就是对应hwmon1目录下对应的文件。创建个Qt Widgets Application工程,命名为cpu_temp,基类选择QDialog,选择创建ui,创建之后如下:
修改UI文件
修改UI文件,首先调整下UI的大小,然后添加Label控件并命名为value,如下:
读取的方式
从之前用cat查看CPU温度传感器对应的文件可知,该文件是个文本文件,只要一文本方式读取该文件的全部内容就可以获得该CPU的当前温度了,读出来的数值是CPU温度的实际值的1000倍,接下来只需要实现个读取文本文件的程序就基本上实现了,
然后在dialog.h中添加头文件:
#include "QFile"
并在类声明中声明个QFile变量:
QFile f;
实现代码
定义个宏来表示CPU温度传感器对应的文件:
#define SENSOR_PATH "/sys/class/hwmon/hwmon1/temp1_input"
然后实现读取的程序并显示到Label控件中:
QFile f(SENSOR_PATH);
if(!f.open(QIODevice::ReadOnly))
{
this->ui->value->setText("Open faile");
return;
}
QString va = f.readAll();
QString temp = va.left(2) + "." + va.mid(2,2) + "℃";
this->ui->value->setText(temp);
f.close();
编译运行结果如下:
每隔一段时间读取一次
程序还是非常简单的,不过,该程序只能显示运行该程序的那一瞬间CPU的温度,并不能实时显示CPU的温度,也没什么用。为了让该程序更有实用性,使用QT的定时器QTimer,实现每 1 秒读取一次并显示出来,具体代码在:cpu_temp_V0.01
在arm Linux 中运行
代码没有改动,交叉编译后,在一块基于S5P4418的板子上运行如下:
由于该板子自带的传感器的驱动好像有问题,读出来的数据不正常,我接了个LM75,所以上面显示的并不是CPU的温度。
sensors
上面使用到的工具 sensors,有些电脑可能没安装,安装方法如下:
sudo apt-get install lm-sensors hddtemp
sudo sensors-detect
sensors