当前位置: 首页 > article >正文

QT开发学习笔记(Qt 控制 BEEP)

Qt 控制 BEEP

本章是 Qt 控制蜂鸣器实验,原理和上一章点亮 LED 一样。

资源简介

在正点原子的 I.MX6U 开发板,ALPHA 和 MINI Linux 开发板板载资源上有一个蜂鸣器
(BEEP)。如下图原理图。此蜂鸣器直接接在一个 GPIO 上,并不是接在 PWM 上,管脚资源
限制。所以我们的操作与上一小节是一样的(下图为 ALPHA 开发板的 BEEP 原理图)。
在这里插入图片描述

应用实例

想要控制这个蜂鸣器(BEEP),首先我们正点原子的出厂内核已经默认将这个 LED 注册成
了 gpio-leds 类型设备。所以实例与上一小节 LED 实例是一样的。

项目简介:设置一个按钮,点击即可控制 BEEP 状态反转(打开蜂鸣器或者关闭蜂鸣器)。

例 02_beep,控制 BEEP(难度简单)。项目路径为 Qt/3/02_beep。

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

 /****************************************************************** 
 Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved. 
 * @projectName 02_beep 
 * @brief mainwindow.h 
 * @author Deng Zhimao 
 * @email 1252699831@qq.com 
 * @net www.openedv.com 
 * @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 1252699831@qq.com 
 * @net www.openedv.com 
 * @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 行设置蜂鸣器的状态,此方法为槽函数,由点击按钮触发。

程序运行效果

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


http://www.kler.cn/a/3429.html

相关文章:

  • 一位前端小白的2024总结
  • 由于请求的竞态问题,前端仔喜提了一个bug
  • 从零到一:Spring Boot 与 RocketMQ 的完美集成指南
  • leetcode 2920. 收集所有金币可获得的最大积分
  • 困境如雾路难寻,心若清明步自轻---2024年创作回顾
  • 从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CICD)
  • TiDB入门篇-模拟生产集群部署
  • WinForm | C# 弹出简易的消息提示框 (仿Android Toast消息提示)
  • 【FreeRTOS(一)】FreeRTOS新手入门——初识FreeRTOS
  • SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
  • 一文分析RISC-V Linux启动之页表创建
  • 人工智能能否取代软硬件开发工程师
  • ubuntu下使用GCC开发单片机的过程
  • 【数据结构】栈和队列
  • git为什么要先commit,然后pull,最后再push?而不是commit完直接push?
  • 【C++】类和对象(三)
  • Spring6 - (03) Spring 入门程序
  • 一文吃透SpringBoot整合mybatis-plus(保姆式教程)
  • 自己设计的网站,如何实现分页功能?(详细代码+注释)
  • 优秀程序员的5个特征,你在第几层?
  • 走进Vue【四】导航守卫和路由原信息详解
  • 进阶C语言——字符函数和字符串函数【详解】(二)
  • 开关电源Y电容放置的位置
  • 不要迷信 QUIC
  • 计算机组成原理实验一(完整)
  • git基本用法教程(fork软件+git命令)