65.9K
CodeProject 正在变化。 阅读更多。
Home

蓝牙配置

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (5投票s)

2018年8月4日

CPOL

10分钟阅读

viewsIcon

9974

downloadIcon

246

学习使用附带的 Arduino 草图配置你的 HC-05 蓝牙模块

引言

在我上一篇文章(蓝牙信使:学习在 Arduino 上使用 HC-05 蓝牙模块[^])中,我向您展示了如何开始在 Arduino 上使用 HC-05 蓝牙组件。

但是,您必须使用组件的默认设置。在本文中,我将向您展示如何配置您的 HC-05,使其具有自定义名称和您设置的 PIN 码。我们还将了解您可以发送到 HC-05 的命令,并探讨该组件对其中一些命令的响应方式。

该组件有时会很古怪,网上关于它的信息似乎各种各样且令人困惑,所以我希望在这里将它们整合在一起。

它的接线方式与上一篇文章中的基本相同,只需四根线。但是,要将 HC-05 置于完全命令模式(稍后详述),我们还需要从 Arduino 3.3V 引脚到 HC-05 的 EN 引脚增加一根额外的线。这是电路的快照,让您了解它的简单性。

背景

如果您阅读了第一篇文章并搭建了电路,您只需要添加那一根线(从 3.3V 到 EN 引脚),就可以准备上传新的草图,以便配置 HC-05。这是新的原理图,您可以清楚地看到 Arduino Uno 将如何连接到 HC-05。

Arduino 草图:发送命令,查看响应

搭建好这个简单的电路后,您就可以上传并运行新的草图了,这将允许您向 HC-05 发送命令并查看响应。

重申不要使用 Arduino 引脚 0 和 1 的重要性

请注意,我们没有使用 Arduino 引脚 0 和 1,它们是硬件 Rx(接收)和 Tx(发送)引脚。

当您通过 USB 端口将 Arduino 连接到计算机时,Arduino IDE 会使用 Arduino 引脚 0 和 1。它使用引脚 0 (Rx) 将您的草图上传到 Arduino Uno 板上的 Atmega328 芯片。

当您在 Arduino IDE 中打开串口监视器时,它也会使用引脚 0 和 1。我们将使用串口监视器向蓝牙模块发送命令,这就是为什么我们使用其他数字引脚让 HC-05 进行通信。

软件串口

在我们的电路中,我们将蓝牙组件的 Rx(接收)和 Tx(发送)引脚连接到 Arduino 的数字引脚 10 和 11。然后,我们将这些引脚用作软件串口引脚——基本上就是告诉 Arduino 草图使用这些引脚进行串行通信。

我试图强调所有这些,因为当我几年前开始尝试使用 HC-05 时,我经历了一些严重的挑战,因为没有人清楚地解释这些问题,我卡了很长时间。

让我们看看简单的 Arduino 草图,了解它的作用。

配置 HC-05:代码

这是您与 HC-05 在命令模式下通信所需的所有代码列表。

#include <SoftwareSerial.h>

SoftwareSerial BT_Serial(10, 11); // RX, TX

void setup() {
  Serial.begin(9600);
  Serial.println("Enter AT commands:");
  BT_Serial.begin(38400);
}

void loop()
{
  if (BT_Serial.available()) {
    Serial.write(BT_Serial.read());
  }

  if (Serial.available()) {
    BT_Serial.write(Serial.read());
  }
}

如您所见,我们包含了 Arduino(标准)库 SoftwareSerial。该库为我们提供了将 Arduino 的数字引脚转换为串行接收器和发送器的功能。

SoftwareSerial 的一些限制

Arduino Uno 和其他 Arduino 硬件存在一些限制。例如,最大串行数据速率为 57600bps。Arduino 就是无法以高于此速率的速度接收数据。您可以在官方 Arduino 网站 此处^ 找到更多详细信息。

创建用于我们的 SoftwareSerial 对象

在草图的第二行,我们创建了一个 SoftwareSerial 对象,将在整个草图中一直使用。该对象是用于与 HC-05 进行字节接收和发送的串行设备。

接下来在 setup() 方法中,我们初始化了硬件串行(在草图中称为 Serial)。您没有看到 Serial 对象创建的地方,因为它属于标准 Arduino 库的一部分。

接下来,您可以看到在 setup() 方法的第一行,我们将硬件数据速度初始化为 9600bps。请记住,这是将与 Arduino 串口监视器进行字节传输的串行端口。

在初始化硬件 Serial 后,我们使用该对象使用 println() 方法向其打印一行。这只是让我们知道一切都在进行,因为当我们打开 Arduino IDE 中的串口监视器时,我们将看到该行被打印出来。

初始化 SoftwareSerial 对象

我们将 SoftwareSerial 对象初始化为不同的数据速度(38400)。请记住,SoftwareSerial 对象将与 HC-05 通信,因此我们需要匹配 HC-05 的要求。

非常重要:HC-05 命令模式数据速率

HC-05 在置于命令模式时默认为 38400,因此我们必须匹配此速度。这是痛苦的部分。如果您不匹配速度,那么草图将无法在串口监视器中显示任何数据。它将简单地失败。它不会做任何事情,而且非常令人困惑。我长时间遭受了这个问题,而且几乎无法调试——如果您有示波器,也许您可以确定数据是如何传输的等等。

根据数据手册,38400 是默认值,但如果您遇到困难并且 100% 确定已正确连接所有内容,您需要检查您特定 HC-05 的数据手册。

带有命令的 HC-05 数据手册

您可以在 此链接^ 获取我正在使用的数据手册。

这是我曾经研究过的一个 instructable.com 文章的链接,该文章非常信息丰富,但缺少我需要的一些部分。

在草图的这一点上,我们使用的两个串行设备都已初始化并准备好工作。

loop() 代码可能看起来有点令人困惑,因为它从一个设备读取并写入另一个设备,反之亦然。

从 BT_Serial 读取,写入 Serial

让我们仔细看看代码中的第一个 if 块。

if (BT_Serial.available()) {
    Serial.write(BT_Serial.read());
  }

if 语句说,“如果 SoftwareSerial 对象上有可用的字节,那么

SoftwareSerial 读取这些字节(BT_Serial.read()),并将它们(Serial.write())写入硬件串行设备。当我们使用串口监视器键入命令并将其(Serial.write())发送到 BT_Serial 设备时,就会发生这种情况。这是 loop() 代码的第二部分。

if (Serial.available()) {
    BT_Serial.write(Serial.read());
  }

串口监视器如何与 HC-05 通信

当您在串口监视器中键入命令并按 <ENTER> 时,命令将被写入串行端口,并且此循环的第二部分将看到有可用的串行字节。当它看到这些字节时,它会将它们写入 BT_Serial 设备(我们的 HC-05)(将字节发送到组件)。这将导致 HC-05 响应写入串口监视器的字节,它将在屏幕上显示。

现在我们知道了代码的工作原理,让我们上传它,然后将 HC-05 置于命令模式并尝试一下。

获取代码

从本文顶部下载 Arduino 草图源文件 (BT_Config_v001.zip),解压缩并上传到您的 Arduino。

将 HC-05 置于命令模式

但是,请注意,当您为 HC-05 上电时,它默认为正常(消息发送)模式。要使此代码工作,必须将 HC-05 强制置于命令模式。

部分命令模式

这些 HC-05 模块带有一个小的瞬时开关,可以让您将它们置于命令模式。但是,我刚刚了解到这实际上只是部分命令模式:某些命令将不起作用。

要将 HC-05 置于(部分)命令模式,您只需在通电时按住小按钮。由于只有两只手,这可能有点棘手。

按下按钮会发生什么?

当您按下该按钮并为电路供电时,实际蓝牙芯片 (EGBT-045MS) 上的 34 引脚——它焊接到 HC-05 上——将被保持高电平(施加电压)。标有 EN 的 HC-05 引脚已连接到 EGBT-045MS 的 34 引脚。

当 34 引脚保持高电平时,它会将芯片置于命令模式。但是,由于该按钮仅在按下时施加电压,因此芯片仅处于部分命令模式。要使设备进入完全命令模式,必须连续施加电压。

部分命令模式让我抓狂!

部分命令模式实际上让我抓狂了……嗯……我估计大概一年。我一直想知道为什么蓝牙设备处于命令模式但无法接受像 AT+NAME? 这样的命令,这个命令应该返回蓝牙设备的名称,但实际上没有响应。

整个问题是因为他们在侧面放置了那个简单的小按钮。过去,您必须将 EN 引脚直接连接到电压,因为没有按钮,所以根本没有部分模式。他们为什么要添加那个按钮并造成那种混乱?我不确定。

完全命令模式

将 HC-05 置于完全命令模式非常简单。我们所要做的就是从 Arduino 3.3V 插座连接一根线到 HC-05 上的 EN 引脚。

如何确定 HC-05 是否处于命令模式

当 HC-05 处于默认的消息发送/接收模式时,它上面的 LED 会每秒闪烁(非常快)2 次。当它处于命令模式时,LED 只会每 2 秒闪烁(非常慢)1 次。

如果您已正确连接电路,将 Arduino 3.3V 引脚连接到 HC-05 EN 引脚,那么您应该一切顺利,不用担心部分模式。

现在,让我们向这个东西发送一些命令。

发送命令并查看输出

搭建好电路并上传草图后,只需打开 Arduino IDE 中的串口监视器。

当串口监视器窗口打开时,Arduino 将打印一条初始消息(如上所示),以便您知道它正在正常运行。注意:确保您的波特率为 9600,并且所有其他设置都与图像中显示的相匹配。

现在,我将提供一个命令列表,并在图像中显示会话,其中显示了我运行它时获得的值。

运行一些 AT 命令

确定它是否响应 => 输入:AT 响应:OK

获取设备名称 => 输入:AT+NAME? 响应:+NAME:superblue(您的可能不同)

获取设备密码 => 输入:AT+PSWD? 响应:+PSWD:1234

设置设备名称 => 输入:AT+NAME=<您想要的名称> 响应:OK(这里我输入了“icecoldbt”)

获取设备名称 => 输入:AT+NAME? 响应:+NAME:icecoldbt

获取设备处于正常消息发送模式时的波特率 => 输入:AT+UART? 响应:+UART:38400,0,0

该行还包括停止位数(当前设置为 0)以及奇偶校验是否开启(当前关闭)。

设置密码 => 输入:AT+PSWD=3321 响应:OK

再次检查密码 => 输入:AT+PSWD? 响应:+PSWD:3321

就是这样。一旦您了解了它的工作原理,它就非常简单了。

不要忘记移除 3.3V 到 EN 引脚的连接

一旦您完成 HC-05 的配置,只需移除 3.3V 到 EN 引脚的连线,然后断开并重新连接电路电源,HC-05 将再次以正常的消息发送模式启动。

所有其他命令

还有许多其他命令可以发送,但我会让您自己去探索。只需查看我提供的 PDF 的先前链接,您就会得到所有命令。

历史

  • 2018-08-04:首次发布
© . All rights reserved.