基于嵌入式Qt 开发板蜂鸣器(BEEP)

简介

在GEC6818开发板,开发板板载资源上有一个蜂鸣器(BEEP)。如下图原理图。此蜂鸣器直接接在一个 GPIO 上,并不是接在 PWM上,管脚资源限制。

示例

想要控制这个蜂鸣器(BEEP),首先我们出厂内核已经默认将这个 LED 注册成了 gpio-leds 类型设备。

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

Qt是一个跨平台的应用程序开发框架,它主要用于开发图形用户界面(GUI)应用程序。蜂鸣器的控制方式通常取决于硬件设计和接口电平的设置,而不是Qt框架本身。

一般来说,蜂鸣器可以通过不同的电平(高电平或低电平)进行控制。具体是低电平开还是高电平开,取决于蜂鸣器的接口设计和连接方式。通常,蜂鸣器在接口电平为高时会发出声音,而在接口电平为低时会停止发声。但是,这种设置可能因硬件设计和制造商的不同而有所变化。

头文件:mainwindow.h

c++ 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
​
#include <QMainWindow>
#include <QPushButton>
#include <QFile>
​
class MainWindow : public QMainWindow
{
    Q_OBJECT
​
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
​
​
private:
    /* 按钮 */
     QPushButton *pushButton;
​
     /* 文件 */
     QFile file;
​
     /* 设置 BEEP 的状态 */
     void setBeepState();
​
     /* 获取 BEEP 的状态 */
     bool getBeepState();
​
private slots:
     /* 槽函数 */
     void pushButtonClicked();
};
#endif // MAINWINDOW_H

源文件:mainwindow.cpp

c++ 复制代码
#include "mainwindow.h"
​
#include <QDebug>
#include <QGuiApplication>
#include <QScreen>
#include <QRect>
​
​
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
​
    /* 获取屏幕的分辨率,Qt 官方建议使用这
    11 * 种方法获取屏幕分辨率,防上多屏设备导致对应不上
    12 * 注意,这是获取整个桌面系统的分辨率
    13 */
    QList<QScreen *>list_screen = QGuiApplication::screens();
​
    /* 如果是 ARM 平台,直接设置大小为屏幕的大小 */
     #if __arm__
         /* 重设大小 */
         this->resize(list_screen.at(0)->geometry().width(),list_screen.at(0)->geometry().height());
     #else
         /* 否则则设置主窗体大小为 800x480 */
         this->resize(800, 480);
     #endif
​
    pushButton = new QPushButton(this);
​
    /* 居中显示 */
     pushButton->setMinimumSize(200, 50);
     pushButton->setGeometry((this->width() - pushButton->width()) /2 ,
         (this->height() - pushButton->height()) /2,
         pushButton->width(),
         pushButton->height()
     );
     /* 开发板的蜂鸣器控制接口(不同的开发板路径不一样,问板子供应商) */
    file.setFileName("/sys/devices/platform/leds/leds/beep/brightness");
    if (!file.exists())
         /* 设置按钮的初始化文本 */
         pushButton->setText("BEEP device does not exist");
​
     /* 获取 BEEP 的状态 */
     getBeepState();
​
     /* 信号槽连接 */
     connect(pushButton, SIGNAL(clicked()),this, SLOT(pushButtonClicked()));
​
}
​
MainWindow::~MainWindow()
{
}
​
/* 设置 BEEP 的状态 */
void MainWindow::setBeepState()
{
    /* 在设置 BEEP 状态时先读取 */
     bool state = getBeepState();
​
     /* 如果文件不存在,则返回 */
     if (!file.exists()) {
         return;
     }
​
     if(!file.open(QIODevice::ReadWrite))
            qDebug()<<file.errorString();
​
     // 蜂鸣器开或关
     QByteArray buf[2] = {"0", "1"};
​
     if (state)
        file.write(buf[0]);
     else
        file.write(buf[1]);
​
     file.close();
​
      /* 更新按钮状态 */
     getBeepState();
}
​
 /* 获取 BEEP 的状态 */
bool MainWindow::getBeepState()
{
    /* 如果文件不存在,则返回 */
     if (!file.exists())
         return false;
​
     if(!file.open(QIODevice::ReadWrite))
         qDebug()<<file.errorString();
​
     QTextStream in(&file);
​
     /* 读取文件所有数据 */
     QString buf = in.readLine();
​
     /* 打印出读出的值 */
     qDebug()<<"buf: "<<buf<<endl;
      file.close();
​
      if (buf == "1") {
          pushButton->setText("BEEP 开");
          return true;
      } else {
          pushButton->setText("BEEP 关");
          return false;
      }
}
​
​
void MainWindow::pushButtonClicked()
{
    /* 设置蜂鸣器的状态 */
     setBeepState();
}
​

效果截图:纯代码实现

下面为 Ubuntu 上仿真界面的效果,由于 Ubuntu 不是"开发板",所以在读取 BEEP设备时会读取失败。实际在板上运行图略.

【1】界面初始化设置,在嵌入式里,根据实际的屏的大小,设置全屏显示。按钮居中显示。

【2】设置蜂鸣器的方法,写入"0"或"1"代表开和关。写入之前先读取蜂鸣器的状态,预防在用户其他地方有设置过蜂鸣器。

【3】获取 BEEP 的状态。

【4】设置蜂鸣器的状态,此方法为槽函数,由点击按钮触发。

==END==

相关推荐
冰暮流星5 分钟前
flask之定义URL
后端·python·flask
程序员爱钓鱼1 小时前
为什么学习 Rust?Rust 能做什么?
后端·rust
掘金者阿豪2 小时前
Docker命令太多记不住?用Portainer把容器管理变成可视化操作
后端
用户69371750013842 小时前
AI Agent 里的 Loop 到底是什么?
android·前端·后端
Rain的Java大神之路2 小时前
高并发下的抢优惠券如何设计
后端
钟智强2 小时前
AWS CloudGoat 实战:一个 SSRF 如何撬动整个云账户
后端
Ai拆代码的曹操2 小时前
@Transactional 写在 private 方法上,事务根本没生效
后端
云技纵横3 小时前
@Async 默认执行器又炸了:SimpleAsyncTaskExecutor 为什么不是线程池?
后端·面试
程序员Agions3 小时前
Fypro 新手快速上手与实战指南
后端
舒心的云朵3 小时前
用三张图片详解Asp.Net 全生命周期
后端·asp.net