QT学习笔记(实战之Qt 控制 LED)

Qt 控制 LED

本章开始使用 Qt 应用到正点原子的嵌入式 I.MX6ULL 开发板上,凡事是先易后难,我们
也是从最简单的点亮 LED 说起。介绍如何使用 Qt 知识应用到正点原子的嵌入式 I.MX6ULL 开
发板,亦可参考来修改到其他平台的嵌入式 Linux 开发板上。

资源简介

在正点原子的 I.MX6U 开发板,ALPHA 和 MINI Linux 开发板板载资源上有一个 LED。如
下图原理图(下图为 ALPHA 开发板的 LED 原理图)。
QT学习笔记(实战之Qt 控制 LED)_第1张图片

应用实例

想要控制这个 LED,首先我们正点原子的出厂内核已经默认将这个 LED 注册成了 gpio-leds

类型设备。所以我们可以直接在应用层接口直接可以操作这个 LED 设备。我们在 Qt 里有很多
种方法可以控制正点原子 I.MX6U 的 LED 设备。如可以用 C 语言的读写函数读写来控制 LED

的状态,或者直接使用 system()函数启动一个进程执行相关指令直接控制 LED 等。

我们介绍最简单的方法控制开发板上的LED,就是使用Qt的操作文件的类直接控制LED。
因为 Linux 上一切皆文件,所有的东西都当作文件来处理。

下面将贴上代码,其中不会再去讲如何搭建工程,不会贴上实验现象图。代码注释详细,
不额外说明。实现现象请自行编译到开发板上运行查看。(笔者都有在正点原子 I.MX6U 开发板
上实验,确保准确性)。项目虽然简单,但是在嵌入式里基本都是从点亮一个 LED 里开始说起。
只有我们会操作一个 IO,剩下的基本都不会难!

项目简介:设置一个按钮,点击即可控制 LED 状态反转(点亮或者熄灭 LED)。项目看来
很起来很简单,实际上有些需要注意的地方,我们在改变 LED 的状态时,需要先去读取 LED

的状态,防止外界(外面应用程序)将 LED 的状态改变了。否则我们反转操作将不成立。在

C++里一般使用 get()和 set()方法来获取和设置。我们的 LED 程序里也有这种方法。所以需要写
好一个让人看得懂的程序是有“方法”的。不能将程序功能写在一堆,最好是分开写,留有接
口。让后面的人看懂!

例 01_led,控制 LED(难度简单)。项目路径为 Qt/3/01_led。3 是代表第三篇的例程父目录。
在源文件“mainwindow.h”的代码如下。

 /****************************************************************** 
 Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved. 
 * @projectName 01_led 
 * @brief mainwindow.h 
 * @author Deng Zhimao 
 * @email [email protected] 
 * @net www.openedv.com 
 * * @date 2021-03-08 
 *******************************************************************/ 

1 #ifndef MAINWINDOW_H 

2 #define MAINWINDOW_H 

3 

4 #include <QMainWindow> 

5 #include <QPushButton> 

6 #include <QFile> 

7 

8 class MainWindow : public QMainWindow 

9 { 

10 Q_OBJECT 

11 

12 public: 

13 MainWindow(QWidget *parent = nullptr); 

14 ~MainWindow(); 

15 

16 private: 

17 /* 按钮 */ 

18 QPushButton *pushButton; 

19 

20 /* 文件 */ 

21 QFile file; 

22 

23 /* 设置 lED 的状态 */ 

24 void setLedState(); 

25 

26 /* 获取 lED 的状态 */ 

27 bool getLedState(); 

28 

29 private slots: 

30 void pushButtonClicked(); 

31 }; 

32 #endif // MAINWINDOW_H 

在头文件“mainwindow.h”里第 24 行声明一个设置 LED 状态方法,另一个是获取状态的
方法。另外声明一个槽函数,作用是点击切换 LED 的状态。

在源文件“mainwindow.cpp”的代码如下。

 /****************************************************************** 
 Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved. 
 * @projectName 01_led 
 * @brief mainwindow.cpp 
 * @author Deng Zhimao 
 * @email [email protected] 
 * * @net www.openedv.com 
 * @date 2021-03-08 
 *******************************************************************/ 

1 #include "mainwindow.h" 

2 #include <QDebug> 

3 #include <QGuiApplication> 

4 #include <QScreen> 

5 #include <QRect> 

6 

7 MainWindow::MainWindow(QWidget *parent) 

8 : QMainWindow(parent) 

9 { 

10 /* 获取屏幕的分辨率,Qt 官方建议使用这 
11 * 种方法获取屏幕分辨率,防上多屏设备导致对应不上 
12 * 注意,这是获取整个桌面系统的分辨率 
13 */ 

14 QList <QScreen *> list_screen = QGuiApplication::screens(); 

15 

16 /* 如果是 ARM 平台,直接设置大小为屏幕的大小 */ 

17 #if __arm__ 

18 /* 重设大小 */ 

19 this->resize(list_screen.at(0)->geometry().width(), 

20 list_screen.at(0)->geometry().height()); 

21 /* 默认是出厂系统的 LED 心跳的触发方式,想要控制 LED, 
22 * 需要改变 LED 的触发方式,改为 none,即无 */ 

23 system("echo none > /sys/class/leds/sys-led/trigger"); 

24 #else 

25 /* 否则则设置主窗体大小为 800x480 */ 

26 this->resize(800, 480); 

27 #endif 

28 

29 pushButton = new QPushButton(this); 

30 

31 /* 居中显示 */ 

32 pushButton->setMinimumSize(200, 50); 

33 pushButton->setGeometry((this->width() - pushButton->width()) /2 , 

34 (this->height() - pushButton->height()) /2, 

35 pushButton->width(), 

36 pushButton->height() 

37 ); 

38 /* 开发板的 LED 控制接口 */ 

39 
file.setFileName("/sys/devices/platform/leds/leds/sys-led/brightness"); 
40 

41 if (!file.exists()) 

42 /* 设置按钮的初始化文本 */ 

43 pushButton->setText("未获取到 LED 设备!"); 

44 

45 /* 获取 LED 的状态 */ 

46 getLedState(); 

47 

48 /* 信号槽连接 */ 

49 connect(pushButton, SIGNAL(clicked()), 

50 this, SLOT(pushButtonClicked())); 

51 } 

52 

53 MainWindow::~MainWindow() 

54 { 

55 } 

56 

57 void MainWindow::setLedState() 

58 { 

59 /* 在设置 LED 状态时先读取 */ 

60 bool state = getLedState(); 

61 

62 /* 如果文件不存在,则返回 */ 

63 if (!file.exists()) 

64 return; 

65 

66 if(!file.open(QIODevice::ReadWrite)) 

67 qDebug()<<file.errorString(); 

68 

69 QByteArray buf[2] = {"0", "1"}; 

70 

71 /* 写 0 或 1 */ 

72 if (state) 

73 file.write(buf[0]); 

74 else 

75 file.write(buf[1]); 

76 

77 /* 关闭文件 */ 

78 file.close(); 

79 

80 /*重新获取 LED 的状态 */ 

81 getLedState(); 

82 } 
83 

84 bool MainWindow::getLedState() 

85 { 

86 /* 如果文件不存在,则返回 */ 

87 if (!file.exists()) 

88 return false; 

89 

90 if(!file.open(QIODevice::ReadWrite)) 

91 qDebug()<<file.errorString(); 

92 

93 QTextStream in(&file); 

94 

95 /* 读取文件所有数据 */ 

96 QString buf = in.readLine(); 

97 

98 /* 打印出读出的值 */ 

99 qDebug()<<"buf: "<<buf<<endl; 

100 file.close(); 

101 if (buf == "1") { 

102 pushButton->setText("LED 点亮"); 

103 return true; 

104 } else { 

105 pushButton->setText("LED 熄灭"); 

106 return false; 

107 } 

108 } 

109 

110 void MainWindow::pushButtonClicked() 

111 { 

112 /* 设置 LED 的状态 */ 

113 setLedState(); 

114 } 

第 9 行~24 行,界面初始化设置,在嵌入式里,根据实际的屏的大小,设置全屏显示。按
钮居中显示。

第 23 行,因为出厂系统里配置 LED 的触发方式为心跳方式,要想控制此 LED,需要将 LED

的触发方式改为 none,即是无触发方式。为了方便,笔者直接使用 system()函数,用指令的方
式改变 LED 的触发方式。

第 54~82 行设置 LED 的方法,写入“0”或“1”代表开和关。写入之前先读取 LED 的状
态,预防在用户其他地方有设置过 LED。
第 84 行~108 行,获取 LED 的状态。
第 110 行~114 行设置 LED 的状态,此方法为槽函数,由点击按钮触发。
至此常规的控制一个 IO,大概流程已经完成。

##3 程序运行效果

下面为 Ubuntu 上仿真界面的效果,由于 Ubuntu 不是“开发板”,所以在读取 LED 设备时
会读取失败。实际在板上运行图略。交叉编译程序到正点原子 I.MX6U 开发板上运行即可控制

LED 的状态。
QT学习笔记(实战之Qt 控制 LED)_第2张图片

你可能感兴趣的:(QT开发学习笔记,qt,学习,开发语言)