超级版主
- 积分
- 4672
- 金钱
- 4672
- 注册时间
- 2019-5-8
- 在线时间
- 1224 小时
|
1)实验平台:正点原子阿尔法Linux开发板
2) 章节摘自【正点原子】《I.MX6U嵌入式Qt开发指南 V1.0》
3)购买链接:https://detail.tmall.com/item.htm?id=609033604451
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/arm-linux/zdyz-i.mx6ull.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子阿尔法Linux交流群:1027879335
第十六章 Qt控制BEEP
本章是Qt控制蜂鸣器实验,原理和上一章点亮LED一样。
16.1 资源简介
在正点原子的I.MX6U开发板,ALPHA和MINI Linux开发板板载资源上有一个蜂鸣器(BEEP)。如下图原理图。此蜂鸣器直接接在一个GPIO上,并不是接在PWM上,管脚资源限制。所以我们的操作与上一小节是一样的(下图为ALPHA开发板的BEEP原理图)。
16.2 应用实例
想要控制这个蜂鸣器(BEEP),首先我们正点原子的出厂内核已经默认将这个LED注册成了gpio-leds类型设备。所以实例与上一小节LED实例是一样的。
项目简介:设置一个按钮,点击即可控制BEEP状态反转(打开蜂鸣器或者关闭蜂鸣器)。
例02_led,控制BEEP(难度简单)。项目路径为Qt/3/02_beep。
在源文件“mainwindow.cpp”的代码如下。
- /******************************************************************
- Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
- * @projectName 02_beep
- * @brief mainwindow.h
- * [url=home.php?mod=space&uid=90321]@Author[/url] Deng Zhimao
- * [url=home.php?mod=space&uid=55957]@EMAIL[/url] <a href="mailto:1252699831@qq.com">1252699831@qq.com</a>
- * [url=home.php?mod=space&uid=28414]@net[/url] <a href="www.openedv.com" target="_blank">www.openedv.com</a>
- * @date 2021-03-11
- *******************************************************************/
- 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 /* 设置BEEP的状态 */
- 24 void setBeepState();
- 25
- 26 /* 获取BEEP的状态 */
- 27 bool getBeepState();
- 28
- 29 private slots:
- 30 /* 槽函数 */
- 31 void pushButtonClicked();
- 32 };
- 33 #endif // MAINWINDOW_H
复制代码
在头文件“mainwindow.h”里第24~27行声明一个设置蜂鸣器状态方法,别一个是获取状态的方法。另外第31声明一个槽函数,作用是点击切换蜂鸣器的状态。
在源文件“mainwindow.cpp”的代码如下。
- /******************************************************************
- Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
- * @projectName 02_beep
- * @brief mainwindow.cpp
- * @author Deng Zhimao
- * @email <a href="mailto:1252699831@qq.com">1252699831@qq.com</a>
- * @net <a href="www.openedv.com" target="_blank">www.openedv.com</a>
- * @date 2021-03-11
- *******************************************************************/
- 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 #else
- 22 /* 否则则设置主窗体大小为800x480 */
- 23 this->resize(800, 480);
- 24 #endif
- 25
- 26 pushButton = new QPushButton(this);
- 27
- 28 /* 居中显示 */
- 29 pushButton->setMinimumSize(200, 50);
- 30 pushButton->setGeometry((this->width() - pushButton->width()) /2 ,
- 31 (this->height() - pushButton->height()) /2,
- 32 pushButton->width(),
- 33 pushButton->height()
- 34 );
- 35 /* 开发板的蜂鸣器控制接口 */
- 36 file.setFileName("/sys/devices/platform/leds/leds/beep/brightness");
- 37
- 38 if (!file.exists())
- 39 /* 设置按钮的初始化文本 */
- 40 pushButton->setText("未获取到BEEP设备!");
- 41
- 42 /* 获取BEEP的状态 */
- 43 getBeepState();
- 44
- 45 /* 信号槽连接 */
- 46 connect(pushButton, SIGNAL(clicked()),
- 47 this, SLOT(pushButtonClicked()));
- 48 }
- 49
- 50
- 51 MainWindow::~MainWindow()
- 52 {
- 53 }
- 54
- 55 void MainWindow::setBeepState()
- 56 {
- 57 /* 在设置BEEP状态时先读取 */
- 58 bool state = getBeepState();
- 59
- 60 /* 如果文件不存在,则返回 */
- 61 if (!file.exists())
- 62 return;
- 63
- 64 if(!file.open(QIODevice::ReadWrite))
- 65 qDebug()<<file.errorString();
- 66
- 67 QByteArray buf[2] = {"0", "1"};
- 68
- 69 if (state)
- 70 file.write(buf[0]);
- 71 else
- 72 file.write(buf[1]);
- 73
- 74 file.close();
- 75
- 76 getBeepState();
- 77 }
- 78
- 79 bool MainWindow::getBeepState()
- 80 {
- 81 /* 如果文件不存在,则返回 */
- 82 if (!file.exists())
- 83 return false;
- 84
- 85 if(!file.open(QIODevice::ReadWrite))
- 86 qDebug()<<file.errorString();
- 87
- 88 QTextStream in(&file);
- 89
- 90 /* 读取文件所有数据 */
- 91 QString buf = in.readLine();
- 92
- 93 /* 打印出读出的值 */
- 94 qDebug()<<"buf: "<<buf<<endl;
- 95 file.close();
- 96 if (buf == "1") {
- 97 pushButton->setText("BEEP开");
- 98 return true;
- 99 } else {
- 100 pushButton->setText("BEEP关");
- 101 return false;
- 102 }
- 103 }
- 104
- 105 void MainWindow::pushButtonClicked()
- 106 {
- 107 /* 设置蜂鸣器的状态 */
- 108 setBeepState();
- 109 }
复制代码
解释与上一小节LED的一样。
第7~48行,界面初始化设置,在嵌入式里,根据实际的屏的大小,设置全屏显示。按钮居中显示。
第55~77行设置蜂鸣器的方法,写入“0”或“1”代表开和关。写入之前先读取蜂鸣器的状态,预防在用户其他地方有设置过蜂鸣器。
第79~103行获取BEEP的状态。
第105~109行设置蜂鸣器的状态,此方法为槽函数,由点击按钮触发。
16.3 程序运行效果
下面为Ubuntu上仿真界面的效果,由于Ubuntu不是“开发板”,所以在读取BEEP设备时会读取失败。实际在板上运行图略。交叉编译程序到正点原子I.MX6U开发板上运行即可控制蜂鸣器的状态。
|
|