環境:
-
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
