大家好,今天主要和大家分享一下,如何使用QT实现对三合一环境传感器的数据的获取和实现。
第一:资源介绍
在开发板上有一个三合一环境传感器,也就是在拨码开关旁边的传感器,采用的是I2C接口。下图是原理图,以及对应的实物图。
第二:具体代码的详细实现
在实现之前必须在系统的出厂系统里编写好AP3216C的驱动实现,并注册成了杂项设备,可以在/sys/class/misc下找到ap3216c节点。我们可以直接QT通过访问节点文件的方式来获取AP3216C的传感器数据。
读取数据流程解释:数据由驱动层传到Linux应用层,QT应用程序从应用成读取传感器的数据。
项目代码的具体实现,对应的.pro文件中的内容如下:
1 QT += core gui 2 3 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 4 5 CONFIG += c++11 6 7 # The following define makes your compiler emit warnings if you use 8 # any Qt feature that has been marked deprecated (the exact warnings 9 # depend on your compiler). Please consult the documentation of the 10 # deprecated API in order to know how to port your code away from it. 11 DEFINES += QT_DEPRECATED_WARNINGS 12 13 # You can also make your code fail to compile if it uses deprecated APIs. 14 # In order to do so, uncomment the following line. 15 # You can also select to disable deprecated APIs only up to a certain version of Qt. 16 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 17 18 SOURCES += \ 19 ap3216c.cpp \ 20 arcgraph.cpp \ 21 glowtext.cpp \ 22 main.cpp \ 23 mainwindow.cpp 24 25 HEADERS += \ 26 ap3216c.h \ 27 arcgraph.h \ 28 glowtext.h \ 29 mainwindow.h 30 31 # Default rules for deployment. 32 qnx: target.path = /tmp/$${TARGET}/bin 33 else: unix:!android: target.path = /opt/$${TARGET}/bin 34 !isEmpty(target.path): INSTALLS += target 35 36 include(headview/headview.pri)
分析:其中使用到pri文件,pri文件的语法和pro文件相同,通常它是由pro文件改写得到的,该类型文件类似于C++中的头文件,可以在 pro 文件中使用 include 将其包含进来,相当 于文件引入,当一个项目文件非常多时,或有些项目文件需要重复使用,为了方便管理就可以 使用此方法。
第三:源文件“mainwindow.h”实现
1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QMainWindow> 5 #include <QLabel> 6 #include <QVBoxLayout> 7 #include <QHBoxLayout> 8 #include "arcgraph.h" 9 #include "glowtext.h" 10 #include "ap3216c.h" 11 #include "headview/headview.h" 12 class ArcGraph; 13 class GlowText; 14 class Ap3216c; 15 class HeadView; 16 17 class MainWindow : public QMainWindow 18 { 19 Q_OBJECT 20 21 public: 22 MainWindow(QWidget *parent = nullptr); 23 ~MainWindow(); 24 25 private: 26 ArcGraph *arcGraph[3]; 27 GlowText *glowText[3]; 28 29 QVBoxLayout *vBoxLayout; 30 QHBoxLayout *hBoxLayout[5]; 31 32 GlowText *test; 33 34 /* 容器作用,用于布局 */ 35 QWidget *widget[6]; 36 37 /* 标签文本 */ 38 QLabel *label[3]; 39 40 /* i2C 传感器类 */ 41 Ap3216c *ap3216c; 42 43 /* 视图表头 */ 44 HeadView *headView; 45 46 private slots: 47 /* 获取 ap3216 传感器数据 */ 48 void getAp3216cData(); 49 }; 50 #endif // MAINWINDOW_H
分析:在"mainwindow.h"的头文件里,看到使用了ArcGraph、GlowText、Ap3216c 和 HeadView 自定义的类。它们是蓝色科技弧形视图、发光文本、Ap3216c 类和视图表头。不同的类分开来 写这样可以很方便地管理我们的项目。
第四:Linux应用接口获取数据
ap3216c类的作用是从驱动层提供给linux应用层的接口获取数据。
1 #include "ap3216c.h" 2 #include <stdio.h> 3 #include <string.h> 4 #include <sys/types.h> 5 #include <sys/stat.h> 6 #include <fcntl.h> 7 #include <unistd.h> 8 #include <QDebug> 9 10 Ap3216c::Ap3216c(QObject *parent) : QObject (parent) 11 { 12 timer = new QTimer(); 13 connect(timer, SIGNAL(timeout()), this, SLOT(timer_timeout())); 14 } 15 16 Ap3216c::~Ap3216c() 17 { 18 19 } 20 21 void Ap3216c::timer_timeout() 22 { 23 alsdata = readAlsData(); 24 psdata = readPsData(); 25 irdata = readIrData(); 26 emit ap3216cDataChanged(); 27 } 28 29 QString Ap3216c::readIrData() 30 { 31 char const *filename = "/sys/class/misc/ap3216c/ir"; 32 int err = 0; 33 int fd; 34 char buf[10]; 35 36 fd = open(filename, O_RDONLY); 37 if(fd < 0) { 38 close(fd); 39 return "open file error!"; 40 } 41 42 err = read(fd, buf, sizeof(buf)); 43 if (err < 0) { 44 close(fd); 45 return "read data error!"; 46 } 47 close(fd); 48 49 QString irValue = buf; 50 QStringList list = irValue.split("\n"); 51 return list[0]; 52 } 53 54 QString Ap3216c::readPsData() 55 { 56 char const *filename = "/sys/class/misc/ap3216c/ps"; 57 int err = 0; 58 int fd; 59 char buf[10]; 60 61 fd = open(filename, O_RDONLY); 62 if(fd < 0) { 63 close(fd); 64 return "open file error!"; 65 } 66 67 err = read(fd, buf, sizeof(buf)); 68 if (err < 0) { 69 close(fd); 70 return "read data error!"; 71 } 72 close(fd); 73 74 QString psValue = buf; 75 QStringList list = psValue.split("\n"); 76 return list[0]; 77 } 78 79 QString Ap3216c::readAlsData() 80 { 81 char const *filename = "/sys/class/misc/ap3216c/als"; 82 int err = 0; 83 int fd; 84 char buf[10]; 85 86 fd = open(filename, O_RDONLY); 87 if(fd < 0) { 88 close(fd); 89 return "open file error!"; 90 } 91 92 err = read(fd, buf, sizeof(buf)); 93 if (err < 0) { 94 close(fd); 95 return "read data error!"; 96 } 97 close(fd); 98 99 QString alsValue = buf; 100 QStringList list = alsValue.split("\n"); 101 return list[0]; 102 } 103 104 QString Ap3216c::alsData() 105 { 106 return alsdata; 107 } 108 109 QString Ap3216c::irData() 110 { 111 return irdata; 112 } 113 114 QString Ap3216c::psData() 115 { 116 return psdata; 117 } 118 119 void Ap3216c::setCapture(bool str) 120 { 121 if(str) 122 timer->start(500); 123 else 124 timer->stop(); 125 }
分析:通过C语言的接口访问节点文件的方法来获取数据。
第四:程序的运行效果
当我们使用三合一环境传感器时,界面上的数据会发生变化,数据默认设置为500ms采集一次。
总结:利用QT实现数据的获取,在界面上进行显示会更加的美观,其实设计界面是非常耗时的。