在本Arduino蓝牙教程中,我们将学习如何使用HC-05模块通过蓝牙通信来控制Arduino。你可以观看下面的视频或阅读下面的书面教程了解更多细节。
概述
在本教程中,我做了两个例子,使用智能手机控制Arduino和使用笔记本电脑或PC控制Arduino。为了不超载本教程,在我的下一个教程中,我们将学习如何配置HC-05蓝牙模块,并使两个独立的Arduino板之间的蓝牙通信作为主设备和从设备。
在开始第一个示例(使用智能手机控制Arduino)之前,让我们仔细看看HC-05蓝牙模块。相比HC-06模块只能设置为Slave, HC-05也可以设置为Master,可以在两个独立的Arduino板之间进行通信。这个模块有几个不同的版本,但我推荐一个出现在接线板上的版本,因为这样更容易连接。HC-05模块是蓝牙SPP (Serial Port Protocol)模块,通过串口通信与Arduino进行通信。
您可以从以下任何网站获得本Arduino教程所需的组件:
- HC-05蓝牙模块................亚马逊/邦古德/阿里巴巴全球速卖通
- Arduino电路板 .................................亚马逊/邦古德/阿里巴巴全球速卖通
- 面包板和跳线.........亚马逊/邦古德/阿里巴巴全球速卖通
必威外围提钱披露:这些是附属链接。作为一个亚马逊助理,我从合格的购买中赚取。
电路示意图
下面是我们需要如何连接模块到Arduino板。
我拥有的特殊模块可以从3.6伏到6伏供电,因为它安装在包含电压调节器的分接板上。然而,数据引脚的逻辑电压电平为3.3V。因此,Arduino TX(传输引脚,具有5V输出)和蓝牙模块RX(接收引脚,仅支持3.3V)之间的线路需要通过分压器连接,以避免烧毁模块。另一方面,蓝牙模块TX引脚和Arduino RX引脚之间的线路可以直接连接,因为来自蓝牙模块的3.3V信号足以被Arduino板接受为高逻辑。
Arduino蓝牙通信示例源代码
现在,我们已经准备好制作Arduino代码,用于实现Arduino板和智能手机之间的通信。我们将举一个简单的例子,只需打开和关闭LED,但这将足以理解通信。
#define ledPin 7 int state = 0;void setup() {pinMode(ledPin, OUTPUT);digitalWrite (ledPin、低);Serial.begin (38400);//蓝牙模块默认通信速率}void loop() {if(serial .available() > 0){//检查数据是否来自串口状态= serial .read();//从串口读取数据}if (state == '0') {digitalWrite(ledPin, LOW);//关闭LEDprintln(“领导:”);//发送回电话,字符串"LED: ON"的状态= 0;} else if (state == '1') {digitalWrite(ledPin, HIGH);系列。println("LED: ON");; state = 0; } }
描述:首先,我们需要定义LED连接的引脚和一个变量,我们将在其中存储来自智能手机的数据。在设置部分,我们需要定义LED引脚作为输出,并立即设置低。如前所述,我们将使用串行通信,因此我们需要以38400波特率开始串行通信,这是蓝牙模块的默认波特率。在使用serial .available()函数的循环部分中,我们将检查串口中是否有可用的数据可供读取。这意味着当我们将数据发送到蓝牙模块时,该语句将为真,然后使用Serial.read()函数,我们将读取数据并将其放入“state”变量中。因此,如果Arduino接收到字符' 0 ',它将关闭LED,并使用serial .println()函数,它将通过串口将字符串" LED: off "发送回智能手机。另外,我们将把“state”变量重置为0,这样上面的两行代码只执行一次。注意,这里的“state”变量是整型的,所以当我们从智能手机接收到字符“0”时,整型“state”变量的实际值是48,对应字符“0”,根据美国信息交换标准代码表格这就是为什么在" if "语句中我们将" state "变量与字符' 0 '进行比较。另一方面,如果接收到的字符是' 1 ',LED将点亮,字符串“LED: On”将被发送回。
现在代码已经准备好上传了,但是为了做到这一点,我们需要拔掉TX和RX线,因为当上传Arduino使用串行通信时,RX(数字引脚0)和TX(数字引脚1)引脚都很忙。如果我们使用Arduino Board的其他TX和RX引脚,我们可以避免这个步骤,但在这种情况下,我们将不得不使用SoftwareSerial.h库进行串行通信。
相关的:如何配置和配对两个HC-05蓝牙模块作为主和从| AT命令
将智能手机连接到HC-05蓝牙模块和Arduino
现在我们准备将智能手机连接到蓝牙模块和Arduino。我们这里需要做的是激活蓝牙,智能手机就会找到HC-05蓝牙模块。
然后我们需要配对设备,HC-05模块的默认密码是1234。配对设备后,我们需要一个应用程序来控制Arduino。Play Store中有许多应用程序用于此目的,它们将与我们编写的Arduino代码一起工作。但是,我使用麻省理工学院应用程序发明家在线申请。这是一个用于构建Android应用程序的优秀且易于使用的应用程序,在我的下一篇教程中,您可以找到详细的分步指南如何为您的Arduino项目构建自己的自定义Android应用程序.
你可以在这里下载我为这个例子制作的应用程序:
通过连接按钮,我们将智能手机连接到蓝牙模块,按钮下方的状态文本将告诉我们是否连接成功。使用“打开”和“关闭”按钮,我们可以打开和关闭LED。按钮上方的文本是Arduino在按下特定按钮时发送回智能手机的文本。
通过蓝牙通信使用笔记本电脑或PC控制Arduino
让我们看看如何使用笔记本电脑或PC通过蓝牙控制Arduino。因此,首先我们需要将笔记本电脑与HC-05蓝牙模块配对,我们可以通过笔记本电脑的蓝牙设置来实现这一点。笔记本电脑将发现HC-05模块,并使用“1234”密码将设备配对。
一旦我们将笔记本设备管理器中的设备配对,在端口(COM和LPT)下,两个新的实体将出现,名为“标准串行蓝牙链接”。从这里我们可以看到串口的COM端口号,设备将通过串口进行通信。
我们将继续使用前面的例子,打开和关闭LED并向笔记本发送字符串,因此我们将使用前面描述的相同的Arduino代码。
处理IDE源代码
现在使用处理IDE,我们将制作一个控制Arduino的程序。这是源代码。
进口processing.serial。*;串行myPort;字符串ledStatus = "领导:”;Void setup(){size(450, 500);myPort = new Serial(this, "COM5", 38400);//启动串口通信myPort.bufferUntil('\n');//定义从串行端口读取数据到哪个字符。void serialEvent (Serial myPort){//检查Serial Port中是否有可用数据ledStatus = myPort. readstringuntil ('\n');//读取从Arduino发送的数据(字符串"LED: OFF/ON),并将其放入"ledStatus"变量}void draw(){background(237, 240, 241);填充(20、160、133); // Green Color stroke(33); strokeWeight(1); rect(50, 100, 150, 50, 10); // Turn ON Button rect(250, 100, 150, 50, 10); // Turn OFF Button fill(255); textSize(32); text("Turn ON",60, 135); text("Turn OFF", 255, 135); textSize(24); fill(33); text("Status:", 180, 200); textSize(30); textSize(16); text("Program made by Dejan Nedelkovski,\n www.HowToMechatronics.com", 80, 320); text(ledStatus, 155, 240); // Prints the string comming from the Arduino // If the button "Turn ON" is pressed if(mousePressed && mouseX>50 && mouseX<200 && mouseY>100 && mouseY<150){ myPort.write('1'); // Sends the character '1' and that will turn on the LED // Highlighs the buttons in red color when pressed stroke(255,0,0); strokeWeight(2); noFill(); rect(50, 100, 150, 50, 10); } // If the button "Turn OFF" is pressed if(mousePressed && mouseX>250 && mouseX<400 && mouseY>100 && mouseY<150){ myPort.write('0'); // Sends the character '0' and that will turn on the LED stroke(255,0,0); strokeWeight(2); noFill(); rect(250, 100, 150, 50, 10); } }
描述:我们需要包含Serial库并创建一个Serial对象,以便启用串行通信,以及为led状态定义一个String变量。在设置部分,我们需要设置窗口大小的程序和启动串行通信。至于这里的COM端口号,我们需要尝试之前在设备管理器中注意到的两个COM端口号中的一个。下一行定义了串行端口的缓冲,在我们的例子中,直到有一个新行,实际上每次Arduino发送字符串“LED: OFF”或“LED ON”时都有一个新行,因为println()函数。接下来,使用serialEvent()函数检查串口中是否有可用的数据要读取。如果是,使用readStringUntil()函数,我们将从串口读取从Arduino发送的数据,在我们的情况下,这是字符串" LED: OFF "或" LED: ON "。
在不断重复的draw()主函数中,我们制作了程序的所有图形和函数。首先我们需要设置背景颜色,填充颜色,描边大小和颜色然后使用rect()函数绘制两个按钮。使用text()函数,我们打印所有的文本,包括来自Arduino的ledStatus字符串。现在剩下的就是让按钮发挥作用。因此,使用第一个“if”语句,我们限制了“Turn ON”按钮的区域,因此,当按钮被按下时,字符“1”将通过串口发送到Arduino,这将打开LED。下一个for行用于在按下按钮时突出显示按钮。同样的程序也适用于“关闭”按钮。
现在程序已经准备好了,所以当我们点击运行按钮时,程序会自动激活笔记本电脑和Arduino之间的蓝牙通信。HC-05蓝牙模块会开始每两秒闪一次,表示模块已经连接,我们可以用笔记本电脑控制LED了。
这是本教程的全部内容,但不要忘记查看我的下一个教程,在那里我们将学习如何配置HC-05蓝牙模块,并使两个独立的Arduino板作为主设备和从设备之间的蓝牙通信。
另外,请在下面的评论部分自由提问,不要忘记提问看看我收集的Arduino项目bet188me.
你好
你能给我发一个链接到你的YouTube视频,是关于把连接到Arduinos的两个HC-05蓝牙模块配对成主从的吗?马歇尔认为,布鲁斯
你好。那本书还没有出版,但几天后就会出版。
你好,
我试图做同样的,但我得到这个错误" error: ' import ' does not name a type import processing.serial.* "。
我怎样才能修好它???
谢谢。
什么相同吗?这听起来就像你在Arduino IDE中使用Processing IDE代码。
在本例中,如何将LED连接到Arduino?
我编写了HC-SR04来检测在它面前发生的任何动作。我也按照你的教程,做了一个应用程序,使用HC-05蓝牙模块控制Arduino。每次HC-SR04检测到移动时,我都想让安装了应用程序的人的手机上播放声音。我该怎么做呢?
做得好的教程-你可以分享你制作的简单应用程序的android代码吗。非常感谢。
谢谢!这个程序可以下载,你可能错过了。
嗨,德扬,
如果您能链接到您的源代码,将会非常有帮助。
提前谢谢!
什么源代码?源代码已经附在本文中。
Nedekovki先生,为什么我的蓝牙HC-05模块有两个led同时闪烁(红色和蓝色)?
因为我给“开”的逻辑,led是不开的。
我可以要你的邮箱地址吗?我想给你发一张关于我的问题的照片/视频
请不要检测到我的智能手机蓝牙模块。
从Arduino给5V到HC-05蓝牙模块。如果你给小于5V,可能是,它不工作。
嗨,我有个问题。我已经连接了BT模块并上传了代码,但是当我按下按钮时什么都没有发生。
我是否有可能烧坏了BT模块?
如果是,我要怎么检查?
你好
非常感谢这个教程……我尝试了这个,它是有效的。
只有一个问题:当led亮时,它显示led: OFF,反之亦然。你能帮我改正吗?
如果应用程序自动打开蓝牙,也会很有帮助!
谢谢你的指导。我得把波特率设为9600。似乎HC05的默认值是9600
这对我来说也是一样。改为9600,一切正常。
你编译或你只是发送源代码arduino蓝牙?您使用哪个平台进行编码?
Arduino IDE。
你好,能否提供一下app的源代码?不仅仅是构建的apk…我需要为一个学校项目扩展你的简单apk的功能
抱歉,我现在没有,但你可以很容易地重建它,如果你遵循视频中的步骤,你可以看到我使用的所有块。
我在我的mega 2650上使用pin 13,波特率为9600。此外,在应用程序中,我必须改变红色和蓝色块上的文本到文本颜色,以使一切显示正确。
非常酷的介绍无线arduino控制。
你好,很好的介绍。我现在正在尝试重新创建它,但是我注意到Arduino图中两个电阻的标签似乎与图中电阻上的条带相反。我不是情感表达者,但这有关系吗?如果有关系,哪个电阻器在哪里?我猜这没什么关系,因为是我第一个注意到的。
我只是碰巧注意到这一点,因为我正在寻找要使用的电阻器,并试图匹配图中频带上的颜色…碰巧有一个电阻器包,背面有频带说明。
谢谢
皮特
嘿,这是一个伟大的评论。虽然图中电阻器的数值是正确的,但是颜色标注是错误的。因此,考虑按所述的值连接电阻。Arduino引脚> 1K > 2K > GND。
这就跟你问声好!伟大的教程!我想知道,尽管,我试图与我的学生做一个应用程序,将能够检测2对设备的蓝牙信号强度。你认为这可能吗?我们希望能够通过一个设备来检查我们是否接近了另一个设备。(就像捉迷藏游戏,当你们彼此靠近时就会“冷”和“热”)。
谢谢你的指导。
装置
谢谢我不认为您可以将这些模块用于这样的应用程序。
感谢您节省时间…非常感谢。
为了让其他人知道我遇到的一个问题:并非所有HC05模块的默认速度都是38400。我的默认值为9600,因此在我更改该值之前,Arduino代码对我不起作用。
也注意,Rx/Tx引脚0 & 1在一些板(即。列奥纳多)是Serial1,因此您需要适当地更改代码。
谢谢你的评论!
Paul Carrol, you save me . I use HC-06 and spent few hour before I find Paul reply about HC speed. Also HC-06 working only with speed 9600.
德扬,伟大的教程。继续做好工作
你好,
这个项目能与arduino uno合作吗?你为什么选择了超大型?
当然,它适用于任何Arduino板。
你好,Dejan,本教程非常有用,非常感谢!我正在做一个项目,在这个项目中,使用麻省理工学院的应用程序发明家,你从你的智能手机中提供一个数字,然后一个4段显示这个数字。我依赖于本教程和你周围的其他教程。
我想在应用程序发明家方面需要更多的帮助,呵呵。
无论如何,再次感谢!
在电路原理图中,你正确地写出了电阻的值,但是它们的颜色是相反的。
谢谢你提供的信息。
感谢收看本期视频!
你好,德扬,
感谢您的出色工作和教程。喜欢你的简单和详细的教程,容易理解。我53岁了,还在学习你们用当地语言免费教授学龄儿童机器人技术的教程。
愿上帝保佑你。
再次感谢。
来自斯里兰卡的光栅
谢谢,我很高兴听到你这么说!