在本Arduino教程中,我们将学习如何配置和配对两个HC-05蓝牙模块作为主和从设备。你可以观看下面的视频或阅读下面的书面教程。
在前面的两个教程中,我们已经学过了如何将HC-05蓝牙模块连接到Arduino并在一个Android智能手机和Arduino.在这些教程中,我们使用HC-05蓝牙模块及其默认配置作为从设备。
配置HC-05蓝牙模块- AT命令
对于本教程,我们需要配置这两个模块。为了做到这一点,我们需要切换到AT命令模式,下面是我们将如何做到这一点。首先,我们需要将蓝牙模块连接到Arduino,如前面教程中解释的电路原理图。另外我们需要做的是将蓝牙模块的“EN”引脚连接到5伏,并在Arduino Board上切换TX和RX引脚。
因此,Arduino的RX引脚需要通过分压器和Arduino的TX引脚连接到蓝牙模块的RX引脚,以及Arduino的TX引脚到蓝牙模块的TX引脚。现在在握住“en”引脚上的小按钮,我们需要为模块供电,这就是我们将如何输入命令模式。如果蓝牙模块LED每2秒闪烁,这意味着我们已在AT命令模式下成功输入。
在此之后,我们需要将空草图上传到Arduino,但不要忘记在上传时断开RX和TX线路。然后我们需要运行串行监视器,并选择“两个NL和CR”,以及“38400波特”速率,这是蓝牙模块的默认波特率。现在我们已准备好发送命令,它们的格式如下。
所有命令都以“at”开头,然后是“+”符号,然后是<参数名称>,它们以“?”结尾签名当我们希望为该参数输入新值时,返回参数的当前值或“=”符号。
奴隶的配置
例如,如果我们只输入“AT”,这是一个测试命令,我们应该会得到消息“OK”。如果我们输入" AT+UART? "“我们应该会得到显示默认波特率为38400的消息。如果我们输入“AT+ROLE?”我们会得到一个消息“+ROLE=0”,这意味着蓝牙设备处于从属模式。如果我们输入“AT+ADDR?”“我们会得到蓝牙模块的地址,它应该看起来像这样:98d3:34:905d3f。
现在我们需要写下这个地址,因为我们在配置主设备时需要它。实际上,这就是我们在配置从设备时所需要的获取其地址的全部内容,尽管我们可以更改许多不同的参数,如名称、波特率、配对密码等,但我们不会在本例中这样做。
主配置
确定现在让我们继续前进并将另一个蓝牙模块作为主设备配置。首先,我们将检查波特率以确保它与从设备相同的38400。然后通过键入“AT +角色= 1”,我们将将蓝牙模块设置为主设备。在使用“AT + CMODE = 0”之后,我们将将连接模式设置为“固定地址”,并使用“AT + BIND =”命令我们将设置我们以前写下的从设备的地址。
请注意,在写地址时,我们需要使用逗号,而不是冒号。还要注意,如果我们在“at +CMODE”命令中输入“1”而不是“0”,那么我们就可以跳过前面的步骤,这将使主服务器连接到其传输范围内的任何设备,但这是不安全的配置。在这里你可以找到一个完整的命令和参数列表:HC-05 AT命令列表
然而,这就是我们所需要的蓝牙模块作为主从设备的基本配置,现在如果我们以正常的数据模式重新连接它们,并重新给模块供电,在几秒钟内主从设备就会连接上。两个模块将每2秒闪一次,表示连接成功。
两个HC-05蓝牙模块之间的通信示例
好的,所以现在我们准备好了这个教程的实际榜样。这是电路原理图。我们将在主机上使用电位器,在奴隶上控制伺服电机。反之亦然,我们将在从机处使用按钮,在主设备上控制LED。
你可以从下面的任何一个网站获得这个Arduino教程所需的组件:
- HC-05蓝牙模块................亚马逊/伯格多德/阿里巴巴全球速卖通
- Arduino Board .................................亚马逊/伯格多德/阿里巴巴全球速卖通
- 伺服电机.................................. ......亚马逊/伯格多德/阿里巴巴全球速卖通
- 电位仪............... .. ......... ...... ......亚马逊/伯格多德/阿里巴巴全球速卖通
- 3x 220欧姆电阻.....................亚马逊/伯格多德/阿里巴巴全球速卖通
- 面包板和跳跃电线..........亚马逊/伯格多德/阿里巴巴全球速卖通
必威外围提钱披露:这些是附属链接。作为一名亚马逊助理,我从合格的购买中获得收入。
Arduino源代码
描述:因此,首先我们需要定义程序所需的引脚和一些变量。在“设置”部分,在主设备上,我们将LED引脚设置为输出并立即将其设置为低,以及以38400波特率启动串行通信。类似,在从机处,我们将按钮引脚设置为输入,定义连接引脚的伺服,并以相同的波特率启动串行通信。
在循环部分中,在这两段代码中,使用serial .available()函数我们将检查串口中是否有可用的数据需要读取,并使用serial .read()函数读取数据并将数据存储到“state”变量中。因此,如果主服务器接收到从服务器发送的字符' 1 ',当按钮状态是高的,或按钮被按下,LED就会亮。否则,如果字符是' 0 ',LED将关闭。
至于伺服电机的控制,首先在主控,我们读取电位器的值,并将其映射到一个适合的范围,为伺服从0到255。这个值被发送给从机,从机使用它来相应地旋转伺服电机。这就是我们需要的,下面是这个例子的演示。
主代码:
/* * How to configure and pair two HC-05 Bluetooth Modules * by Dejan Nedelkovski, www.bet188官方网站HowToMechatronics.com * * == MASTER CODE == */ #define ledPin 9 int state = 0;int potValue = 0;void setup() {pinMode(ledPin, OUTPUT);digitalWrite (ledPin、低);Serial.begin (38400);//蓝牙模块的默认通信速率}void loop() {if(serial .available() > 0){//检查数据是否来自串口状态= serial .read();//从串口读取数据}//控制LED如果(state == '1') {digitalWrite(ledPin, HIGH);// LED ON状态= 0;} else if (state == '0') {digitalWrite(ledPin, LOW);// LED ON状态= 0; } // Reading the potentiometer potValue = analogRead(A0); int potValueMapped = map(potValue, 0, 1023, 0, 255); Serial.write(potValueMapped); // Sends potValue to servo motor delay(10); }
奴隶代码:
/* * How to configure and pair two HC-05 Bluetooth Modules * by Dejan Nedelkovski, www.bet188官方网站HowToMechatronics.com * * == SLAVE CODE == */ #include#define button 8 Servo myServo;Int state = 20;int buttonState = 0;void setup() {pinMode(button, INPUT);myServo.attach (9);Serial.begin (38400);//蓝牙模块的默认通信速率}void loop() {if(serial .available() > 0){//检查数据是否来自串口状态= serial .read();//从串口读取数据}//控制伺服电机myServo.write(state);延迟(10);//读取按钮buttonState = digitalRead(按钮); if (buttonState == HIGH) { Serial.write('1'); // Sends '1' to the master to turn on LED } else { Serial.write('0'); } }
以上就是全部内容,如果你有任何问题,请在下面的评论部分寻求帮助。
嗨,我想知道你是否可以帮助我,我正在尝试做一些真正简单的HC-05,但它已经变得非常困难。我想从运行的Uno草图发送AT命令到HC-05。我有HC-05引脚#32 & #34连接到Uno,所以我可以通过Uno控制HC-05电源和AT-state。现在我使用Uno将HC-05的状态更改为AT Command模式,然后通过串行发送一个命令。打印到HC-05上。但是HC-05没有反应或反应。我不确定是否没有响应,或者如果我不能读取响应。我通过将响应传递给串行监视器来读取响应(调试)。你可以看看我的代码来帮助我使这个工作吗?谢谢。
抱歉,但我不能说什么,因为我没有尝试这样的沟通,我没有这样的代码。抱歉,我不能看或做自定义代码时,有人问我,因为这需要相当的时间和很多其他工作要做。
好的,关于如何在hc-05上设置睡眠模式的信息呢?我想应该有嗅嗅命令,但我没有找到任何文档。
谢谢
尝试从其数据表中找到信息。
嘿,我一直在想做同样的事情,但我仍然不能这样做。你有什么成功吗?
Tnx Dejan,很棒的教程!对我来说,它没有分压器,波特率为9600。
谢谢,很高兴听到这个!
无论你做什么,不要取出分压器。当我这样做时,它会抽烟。它可能工作了一秒钟,但最终它无法锻炼。
对,那是正确的。HC-05模块的RX引脚适用于3.3V,需要一个分压器。
你好,
这次写作的伟大工作!!极好的!
我想知道,如果master HC-05已经和另一个HC-05配对了,一个蓝牙手机可以和master连接吗?
大家好,谢谢!
我还没试过,但我觉得不会奏效因为血祖已经很忙了。
如果我使用HC-05主机并控制HC-6从机呢?
它应该以同样的方式工作。
你能告诉我这个项目的蓝牙范围吗?我的意思是我能在多远的地方用POT指挥伺服?
大约10米(30英尺)。
嗨,首先伟大的教程:)。我有一个问题。是否可以连接例如1个垫头和5个奴隶?如果是的话怎么做?我应该在+绑定中写几个地址吗?
大家好,谢谢。你不能同时连接一个master和五个slave。
你好
我2天前才开始搜索使用蓝牙模块的方法。但是当我看了你的教程视频,我几乎学到了所有我想知道的东西,仅仅在几分钟内。
这是一个非常棒且非常容易学习的教程boss。
我有一些问题。
如果我配置1个HC-05作为master,其他的HC-05作为slave,波特率为9600,我可以使用两个单独的mcu进行简单的数字数据通信吗?
这两个工作模式都是全双工模式吗?意味着如果主人发送任何数据字符串到奴隶,那么奴隶也可以发送任何数据回主人?
提前谢谢你的帮助
谢谢。是的,我认为他们可以做到这一点,从而可以将数据发送到主站。
谢谢先生
请指导如果我配置1个HC05作为master和其他作为slave通过AT命令,并设置9600 buadrate,然后离开钥匙sw开路。然后两者都连接到普通的mcu如pic或avr或8951,这些会互相通信吗?
如何控制两个伺服两个方向?
两个HC-05和arduino。
因为这只是一个伺服和一个方向。
我不知道怎么控制两个Servo。
它困扰我> _ <
谢谢你的说明。完美地工作谢谢
很好,很高兴听到这个!
你好,Dejan,优秀的教程,我使用hc 05作为主和从hc 06,没有分压器在波特率9600。现在我要用两个伺服器和两个锅。这是可能的吗?。你能帮我弄一下密码吗?
当然这是可能的,你只需要编写代码。
你好podrías ayudar a general ese código para poder controlar dos o mas servos?非常感谢优秀的教程!!
嗨,我一直得到一个错误7当绑定到从到主,无法找到如何修复它。
你能帮我吗?
非常感谢;
如何将sim800c连接到hc-05模块?
谢谢。对不起,但我没有SIM800C的任何经验。
谢谢!
但我有一个问题。
当我使用两个HC05将数据从一个Arduino传递到另一个时,我得到了2秒的延迟。当我改变POT,两秒后(大约),伺服电机旋转。
我该如何减少这种延迟?
那很奇怪。您是否在谈论本教程中的相同示例代码,或者,如视频中所示,这应该正常工作。
我只是修改了一下接收码。我将' state '声明为String,因为它从Serial.read()中获取值,因此它将在String中。然后使用toInt()函数将其转换为整数值。
谢谢帮助我很多,在大学里我要做一个PICONET和这个例子帮助我。
您好,我的名字是迈克,我是Arduino世界的新手。您的教程非常有用!但是我可以让我的HC 05和HC 05对(从快速闪烁到每秒左右闪烁),但我可以看到它们之间没有串行通信。我想知道你对像我这样的傻瓜写下教程是不是很麻烦,因为我不能因为我做错了!,即使是如何让他们说“嗨!”的东西。对彼此。感谢您与您的教程一起帮助像我这样的人,这很欣赏!
大家好,谢谢。我确实有一些其他的基本教程,教如何使用各种引脚,串行通信,电机等。首先,您可以浏览这些其他教程,您应该能够学习足够多的内容。
嗨! !我是jan,我正在为我的arduino机器人设计一个蓝牙手柄。我计划把它们连接起来,这样我就可以用我的游戏手柄控制机器人了。我已经做了硬件,但在写代码时遇到了麻烦。我的游戏手柄上有一个操纵杆和4个按钮。总之,我相信至少有169个条件。蓝牙能处理这些吗?或者它可以只处理从char ' 0 '到' 9 '的10个条件?例如,数字12会以字符' 1 '和字符' 2 '的形式发送给机器人吗?先谢谢你。 I am a big fan of yours. I have been watching your videos for quite a while now. I have started arduino just several months back, i consider myself a newbie. Your videos really help.
嗨。实际上,你可以发送更长的信息,但当接收时,你将不得不接受它一个字节一次。例如,如果你发送" Test ",你将接收,' T ', ' e ', ' s ', ' T ',所以你可以将这些值添加到一个字符串或其他东西中,并对它们做任何你想做的事情。
您也可以查看我的新教程的HC-12无线模块,它的工作方式相同的发送和接收数据,通过串口。在本教程中,我将对上面的示例进行解释。
if(state =='1'){
digitalWrite (ledPin、高);/ /领导
国家= 0;
}
Else if (state == ' 0 ') {
digitalWrite (ledPin、低);/ /领导
国家= 0;
“国家= 0”的目的是什么??
谢谢
它在每次迭代后将“state”变量重置为0。否则,如果它的值是1,它也会留在下一次迭代中但我们希望它是0。
你好!我试过了,但没有成功。在串行监视器上arduinos只有问号和符号出现时,按下按钮。我该如何解决这个问题?谢谢你!
试着在你的串行显示器上使用不同的波特率。
请帮助。我在造一个机器人,但它不能工作。请告诉我如何让它工作。谢谢。
只是在开玩笑。一如既往的帮助很棒。我从你学到了更多的学院教科书。
呵呵那是一个很好的。谢谢!
嗨,我尝试了同样的例子,在接收器结束时,我收到了除了锅值之外的一些额外数据。什么可能是问题?能否请你帮忙?谢谢
嘿,检查一下两个模块和串口显示器的波特率是否相同,这可能是问题所在。
是的,我查了很多次,但还是一样。除了大麻价值,还能多赚点钱吗?
0253
048
050.
013
0254
050.
057.
010
049.
057.
010
050.
013
0254
050.
050.
我从串行监视器上复制了这个,罐子保持在最大位置,254是罐子的值,但我不知道其他值是什么。