基于嵌入式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==

相关推荐
烛阴3 小时前
bignumber.js深度解析:驾驭任意精度计算的终极武器
前端·javascript·后端
服务端技术栈4 小时前
电商营销系统中的幂等性设计:从抽奖积分发放谈起
后端
你的人类朋友4 小时前
✍️Node.js CMS框架概述:Directus与Strapi详解
javascript·后端·node.js
面朝大海,春不暖,花不开4 小时前
自定义Spring Boot Starter的全面指南
java·spring boot·后端
钡铼技术ARM工业边缘计算机5 小时前
【成本降40%·性能翻倍】RK3588边缘控制器在安防联动系统的升级路径
后端
CryptoPP5 小时前
使用WebSocket实时获取印度股票数据源(无调用次数限制)实战
后端·python·websocket·网络协议·区块链
白宇横流学长6 小时前
基于SpringBoot实现的大创管理系统设计与实现【源码+文档】
java·spring boot·后端
草捏子6 小时前
状态机设计:比if-else优雅100倍的设计
后端
考虑考虑8 小时前
Springboot3.5.x结构化日志新属性
spring boot·后端·spring
涡能增压发动积8 小时前
一起来学 Langgraph [第三节]
后端