Linux中使用QT读取并显示温度传感器数值

时间:2024-02-25 12:54:11

环境:

  • 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

参考:archlinux lm_sensors

lm_sensors projectinformation