在此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蓝牙模块................亚马逊/伯格多德/aliexpress.
- Arduino Board .................................亚马逊/伯格多德/aliexpress.
- 伺服电机.................................. ......亚马逊/伯格多德/aliexpress.
- 电位仪............... .. ......... ...... ......亚马逊/伯格多德/aliexpress.
- 3x 220欧姆电阻.....................亚马逊/伯格多德/aliexpress.
- 面包板和跳线.........。亚马逊/伯格多德/aliexpress.
yaboAG娱乐城披露:这些是附属链接。作为一名亚马逊助理,我从合格的购买中获得收入。
Arduino源代码
描述:因此,首先我们需要定义程序所需的引脚和一些变量。在“设置”部分,在主设备上,我们将LED引脚设置为输出并立即将其设置为低,以及以38400波特率启动串行通信。类似,在从机处,我们将按钮引脚设置为输入,定义连接引脚的伺服,并以相同的波特率启动串行通信。
在循环部分中,在两个代码中,使用serial.available()函数,我们将检查是否有串行端口中有可用的数据才能读取和使用Serial.read()函数,我们将读取和存储数据“州”变量。因此,如果主机接收从从站发送的字符'1',当按钮状态为高电平时,或按下按钮,则LED将打开。否则如果字符为“0”,LED将关闭。
至于伺服电机的控制,首先在主控,我们读取电位器的值,并将其映射到一个适合的范围,为伺服从0到255。这个值被发送给从机,从机使用它来相应地旋转伺服电机。这就是我们需要的,下面是这个例子的演示。
主代码:
/* * How to configure and pair two HC-05 Bluetooth Modules * by Dejan Nedelkovski, www.亚搏手机版官方下载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.亚搏手机版官方下载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草图发送到HC-05的命令。我有HC-05引脚#32&#34连接到UNO,所以我可以通过UNO控制HC-05电源和状态。现在我使用uno将HC-05的状态更改为AT命令模式,然后通过Serial.print向HC-05发送命令。但是,HC-05不会反应或响应。我不确定是否没有响应,或者如果我无法阅读响应。通过将其传递给串行监视器,我正在阅读响应(调试)。你可以看看我的代码来帮助我做这项工作吗?谢谢。
抱歉,但不能说这一点,因为我没有尝试制作这样的沟通,我没有这样的代码。抱歉,但是当有人向我询问时,我无法查看或做自定义代码,因为需要很长一次,并且有很多其他工作要做。
好的,关于如何在hc-05上设置睡眠模式的信息呢?我想应该有嗅嗅命令,但我没有找到任何文档。
谢谢
尝试从其数据表中找到信息。
嘿,我一直在想做同样的事情,但我仍然不能这样做。你有什么成功吗?
Tnx Dejan,很棒的教程!对我来说,它没有分压器,波特率为9600。
谢谢,很高兴听到这个!
无论你做什么,不要取出分压器。当我这样做时,它会抽烟。它可能工作了一秒钟,但最终它无法锻炼。
对,那是正确的。HC-05模块的RX引脚适用于3.3V,需要一个分压器。
你好,
这次写作的伟大工作!!极好的!
我想知道,如果master HC-05已经和另一个HC-05配对了,一个蓝牙手机可以和master连接吗?
大家好,谢谢!
好吧,我没有尝试过,但我不认为它会在主人忙碌的时候工作。
如果我使用HC-05 Master并控制HC-6从站?
它应该以同样的方式工作。
你能告诉我这个项目的蓝牙范围吗?我的意思是,我能够用锅命令伺服的距离?
大约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的任何经验。
谢谢!
但我有一个问题。
当我将数据从一个Arduino传递给另一个HC05,我得到了两秒的延迟。当我改变锅时,两秒钟(约)后,伺服电机旋转。
我该如何减少这种延迟?
那很奇怪。您是否在谈论本教程中的相同示例代码,或者,如视频中所示,这应该正常工作。
我只是修改了一下接收码。我将' state '声明为String,因为它从Serial.read()中获取值,因此它将在String中。然后使用toInt()函数将其转换为整数值。
谢谢帮助我很多,在大学里我要做一个PICONET和这个例子帮助我。
您好,我的名字是迈克,我是Arduino世界的新手。您的教程非常有用!但是我可以让我的HC 05和HC 05对(从快速闪烁到每秒左右闪烁),但我可以看到它们之间没有串行通信。我想知道你对像我这样的傻瓜写下教程是不是很麻烦,因为我不能因为我做错了!,即使是如何让他们说“嗨!”的东西。对彼此。感谢您与您的教程一起帮助像我这样的人,这很欣赏!
大家好,谢谢。我确实有一些其他的基本教程,教如何使用各种引脚,串行通信,电机等。首先,您可以浏览这些其他教程,您应该能够学习足够多的内容。
你好!!我是1月。我正在研究基于Arduino的蓝牙游戏手柄,用于我的Arduino的机器人。我打算连接它们,以便我可以使用我的游戏手柄控制机器人。我已经制作了硬件,但在编写代码时遇到麻烦。我的游戏手柄上有一个操纵杆和4个按钮。总而言之,我认为有至少169条条件。蓝牙是否能够处理这些?或者它可以从Char'0'到'9'处理10条条件?例如,第12号将被发送到机器人作为char'1'和char'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.
你好呀。实际上你可以发送即使是“更长”的消息,但是当您收到时必须一次接受一个字节。For example, if you send “Test”, you will receive, ‘T’, ‘e’, ‘s’, ‘t’, so you can add these values into a single String or something, and do what ever you want with them.
您还可以通过串行端口查看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是罐子的值,但我不知道其他值是什么。