在本Arduino蓝牙教程中,我们将学习如何使用HC-05模块通过蓝牙通信来控制Arduino。你可以观看下面的视频或阅读下面的书面教程了解更多细节。
在本教程中,我做了两个例子,使用智能手机控制Arduino和使用笔记本电脑或个人电脑控制Arduino。为了不超载本教程,在我的下一个教程中,我们将学习如何配置HC-05蓝牙模块,并使两个单独的Arduino板之间的蓝牙通信作为主从设备。
在我们开始第一个例子,使用智能手机控制Arduino之前,让我们仔细看看HC-05蓝牙模块。与只能设置为Slave的HC-06模块相比,HC-05也可以设置为Master,可以实现两个独立的Arduino板之间的通信。这个模块有几个不同的版本,但我推荐一个出现在突破板上,因为这样它更容易连接。HC-05模块是一个蓝牙SPP (Serial Port Protocol)模块,通过串口通信与Arduino进行通信。
你可以从下面的任何一个网站获得这个Arduino教程所需的组件:
- HC-05蓝牙模块................亚马逊/Banggood/阿里巴巴全球速卖通
- Arduino电路板 .................................亚马逊/Banggood/阿里巴巴全球速卖通
- 面包板和跳跃电线.........亚马逊/Banggood/阿里巴巴全球速卖通
必威外围提钱披露:这些是附属链接。作为一名亚马逊助理,我从合格的购买中获得收入。
电路示意图
下面是我们需要如何将模块连接到Arduino板。
我有一个特殊的模块可以从3.6伏到6伏供电,因为它是在包含一个电压调节器的接线板上。然而,数据管脚的逻辑电压电平是3.3V。因此,为了不烧坏模块,Arduino TX(发送引脚,有5V输出)和蓝牙模块RX(接收引脚,只支持3.3V)之间的线路需要通过分压器连接。另一方面,蓝牙模块TX引脚和Arduino RX引脚之间的线可以直接连接,因为来自蓝牙模块的3.3V信号在Arduino Board上已经足够被接受为一个高逻辑。
Arduino蓝牙通信示例源代码
所以,现在我们已经准备好制作Arduino代码,用于Arduino板和智能手机之间的通信。我们将做一个简单的例子,只是打开和关闭一个LED,但它将足以理解通信。
#定义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);// Turn LED OFF Serial。println(“领导:”);//发送回,到电话,字符串“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板的其他TX和RX引脚,我们可以避免这一步,但在这种情况下,我们将不得不使用SoftwareSerial.h库进行串行通信。
连接智能手机到HC-05蓝牙模块和Arduino
现在我们准备好将智能手机连接到蓝牙模块和Arduino。我们需要做的是激活蓝牙智能手机就会找到HC-05的蓝牙模块。
然后我们需要配对设备,HC-05模块的默认密码是1234。配对设备后,我们需要一个应用程序来控制Arduino。在Play Store中有许多应用程序是为了这个目的,它们将与我们编写的Arduino代码一起工作。但是,我为本教程使用麻省理工学院应用程序发明家在线应用程序。这是一个伟大的和易于使用的应用程序构建Android应用程序,在我的下一个教程,你可以找到一个详细的步骤指南如何构建自己的定制Android应用程序为您的Arduino项目。
你可以下载我为这个例子制作的应用程序:
通过连接按钮,我们将智能手机连接到蓝牙模块,按钮下方的状态文本将告诉我们是否已成功连接。使用“打开”和“关闭”按钮,我们可以打开和关闭LED。按钮上面的文字是Arduino在特定按钮被按下时发送回智能手机的文字。
使用笔记本电脑或PC机通过蓝牙通信控制Arduino
让我们看看如何使用笔记本电脑或个人电脑通过蓝牙来控制Arduino。因此,首先,我们需要将笔记本电脑与HC-05蓝牙模块配对,我们可以通过笔记本电脑蓝牙设置完成这一操作。笔记本电脑将发现HC-05模块,并使用“1234”密码,我们将对设备进行配对。
一旦我们将在笔记本设备管理器中的设备配对,在端口(COM和LPT)下,两个新的实体将出现名为“标准串行蓝牙链接”。从这里我们可以看到串口的COM端口号,设备将通过串口进行通信。
我们将继续使用前面的示例,打开和关闭一个LED并将一个字符串返回给笔记本电脑,因此我们将使用前面描述的相同的Arduino代码。
处理IDE源代码
现在使用Processing IDE,我们将制作一个控制Arduino的程序。这是源代码。
进口processing.serial。*;串行myPort;字符串ledStatus = "领导:”;Void setup(){size(450, 500);myPort = new Serial(this, "COM5", 38400);//启动串行通信myPort.bufferUntil('\n');//定义从串口读取数据的字符。字符'\n'或'New Line'} void serialEvent (Serial myPort){//检查串口中可用的数据ledStatus = myPort. readstringuntil ('\n');//读取Arduino发送的数据(字符串“LED: OFF/ON”),并将其放入“ledStatus”变量}填充(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库并创建一个串行对象,以便启用串行通信,同时,还需要为led状态定义一个String变量。在设置部分中,我们需要设置程序的窗口大小并启动串行通信。至于COM端口号这里,我们需要尝试两个COM端口号之一,我们之前在设备管理器中注意到。下一行定义了串行端口的缓冲,在我们的例子中,直到有新的行,实际上,由于println()函数,Arduino每次发送字符串“LED: OFF”或“LED ON”时,都会有新的行。接下来,使用serialEvent()函数检查串口中是否有可用数据需要读取。如果是,使用readStringUntil()函数,我们将从串口读取数据,从Arduino发送,在我们的情况下,这是字符串“LED: OFF”或“LED: ON”。
在不断重复的主draw()函数中,我们制作了程序的所有图形和函数。因此,首先我们需要设置背景色、填充色、描边大小和颜色,并使用rect()函数绘制两个按钮。使用text()函数,我们打印所有文本,包括来自Arduino的ledStatus字符串。现在剩下的就是让按钮发挥作用。因此,使用第一个“if”语句,我们限制了“Turn ON”按钮的区域,所以当按钮被按下时,字符“1”将通过串口发送到Arduino,这将打开LED。下一行用于在按下按钮时突出显示按钮。同样的程序也适用于“关闭”按钮。
现在程序准备好了,当我们点击运行按钮时,程序会自动激活笔记本电脑和Arduino之间的蓝牙通信。HC-05蓝牙模块将开始每2秒闪一次,这表明模块已连接,我们将能够使用我们的笔记本控制LED。
这就是本教程的全部内容,但不要忘记检查我的下一个教程,在那里我们将学习如何配置HC-05蓝牙模块,并使两个单独的Arduino板之间的蓝牙通信作为主从设备。
另外,请在评论区提出任何问题,不要忘记看看我收集的Arduino项目bet188me。
你好,
你能发给我一个你的YouTube视频的链接吗?这个视频是关于将两个HC-05蓝牙模块连接到Arduinos上,演示你是如何使它们成为master和slave的。马歇尔认为,布鲁斯
嗨。那篇文章还没发表,但几天后就会发表了。
你好,
我试图做出相同的,但我得到这个错误"错误:' import '不命名类型import processing.serial.* "。
我怎么能修好它?
谢谢。
什么相同吗?这听起来像你正在使用一个处理IDE代码到Arduino IDE。
在这个例子中,我如何将LED连接到Arduino ?
我编写了一个HC-SR04来检测它前面发生的任何运动。我也跟随你的教程,制作了一个应用程序来控制Arduino使用HC-05蓝牙模块。每次HC-SR04检测到运动时,我希望在手机上安装了该应用程序的人的手机上播放一种声音。我该怎么做呢?
做得很好教程-你可以分享你做的简单的应用程序的android代码。谢谢你!
谢谢!这个程序可以下载,你可能已经错过了。
嗨,德扬,
如果您能链接到您的源代码,将会非常有帮助。
提前谢谢!
源代码是什么?源代码已经附在本文中。
Nedekovki先生,为什么我的蓝牙HC-05模块有两个led同时闪烁(红色和蓝色)?
因为我给“on”逻辑,led是不亮的。
能告诉我你的邮箱地址吗?我想发给你一张关于我的问题的照片/视频
拜托,我的智能手机没有检测到蓝牙模块。
从Arduino给HC-05蓝牙模块5V。如果你给小于5V,可能是,它不工作。
你好,我有个问题。我已经连接了BT模块并上传了代码,但是当我按下按钮时没有任何反应。
是否我已经烧坏了BT模块?
如果是,我该如何核实?
你好,
非常感谢你的这个教程,我尝试了这个,它是工作的。
只有一个问题:当led是亮的,它显示led:关,反之亦然。你能帮我纠正一下吗?
这也将是有帮助的,如果应用程序自动打开蓝牙!
谢谢你的指导。我得把波特率设为9600。似乎HC05的默认值是9600
对我来说也是一样。改成9600,一切正常。
你编译或者你只是把源代码发送到arduino蓝牙?您使用哪个平台编写代码?
Arduino IDE。
你好,能否提供一下应用程序的源代码?不仅仅是构建的apk,我需要扩展你的简单apk的功能,用于一个学校项目
抱歉,我现在没有,但你可以很容易地重新创建它,如果你按照视频中的步骤,你可以看到我使用的所有块。
我在mega 2650上使用了pin 13,波特率为9600。此外,与应用程序,我必须改变从文本的红色和蓝色块上的文本颜色,一切显示正确。
非常酷的介绍无线arduino控制。
你好,非常好的介绍。我正在尝试重新创建它,但我注意到Arduino图中的2个电阻的标签似乎与图中电阻上的带相反。我不是情感表达者,但这有关系吗?如果有关系,哪个电阻去哪?我猜这也没什么关系,因为我是第一个注意到它的人。
我只是碰巧注意到这一点,因为我在寻找电阻使用,并试图匹配的颜色上的波段在图表中…碰巧有一个电阻包与波段描述在它的背面。
谢谢
皮特
嘿,这是一个很棒的评论。虽然图中电阻器的值是正确的,但是颜色标示是错误的。因此,考虑将电阻器按所述值连接起来。Arduino引脚> 1K > 2K > GND。
这就跟你问声好!伟大的教程!然而,我想知道,我尝试与我的学生做一个应用程序,将能够检测两个配对设备的蓝牙信号强度。你认为这可能吗?我们希望能够从一个设备检查我们是否接近另一个设备。(就像捉迷藏和“冷”和“热”的游戏,当你们靠近的时候)。
谢谢你的指导。
装置
谢谢!我认为您不能将这些模块用于这样的应用程序。
谢谢你帮我节省了时间……非常感谢。
为了让其他人知道我所遇到的一个问题:并不是所有的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,这个教程非常有用,谢谢!我正在做一个项目,使用麻省理工学院的App Inventor,你从你的智能手机中提供一个数字,一个4段显示器显示该数字。我依赖于这个教程和你周围的其他教程。
我需要更多的应用程序发明者方面的帮助,我想呵呵。
无论如何,再次感谢!
在电路原理图中,您已经正确地写出了电阻器的值,但是它们的颜色是相反的。
谢谢你提供的信息。
感谢收看本期视频!
你好,德扬,
感谢您的伟大工作和教程。像你的简单和详细的教程容易理解。我53岁了,还在学习你的教程,用当地语言免费教孩子们机器人。
愿上帝保佑你。
再次感谢。
来自斯里兰卡的格栅
谢谢,我很高兴听到这个!