蓝牙配置
学习使用附带的 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:首次发布