Arduino和HC-05蓝牙模块完整教程

在本Arduino蓝牙教程中,我们将学习如何使用HC-05模块通过蓝牙通信来控制Arduino。你可以观看下面的视频或阅读下面的书面教程了解更多细节。

概述


在本教程中,我做了两个例子,使用智能手机控制Arduino和使用笔记本电脑或个人电脑控制Arduino。为了不超载本教程,在我的下一个教程中,我们将学习如何配置HC-05蓝牙模块,并使两个单独的Arduino板之间的蓝牙通信作为主从设备。

hc05蓝牙模块

在我们开始第一个例子,使用智能手机控制Arduino之前,让我们仔细看看HC-05蓝牙模块。与只能设置为Slave的HC-06模块相比,HC-05也可以设置为Master,可以实现两个独立的Arduino板之间的通信。这个模块有几个不同的版本,但我推荐一个出现在突破板上,因为这样它更容易连接。HC-05模块是一个蓝牙SPP (Serial Port Protocol)模块,通过串口通信与Arduino进行通信。

你可以从下面的任何一个网站获得这个Arduino教程所需的组件:

必威外围提钱披露:这些是附属链接。作为一名亚马逊助理,我从合格的购买中获得收入。

电路示意图


下面是我们需要如何将模块连接到Arduino板。

Arduino和HC 05蓝牙模块电路原理图- 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蓝牙模块| AT命令如何配置并配对

连接智能手机到HC-05蓝牙模块和Arduino


现在我们准备好将智能手机连接到蓝牙模块和Arduino。我们需要做的是激活蓝牙智能手机就会找到HC-05的蓝牙模块。

智能手机蓝牙设置

然后我们需要配对设备,HC-05模块的默认密码是1234。配对设备后,我们需要一个应用程序来控制Arduino。在Play Store中有许多应用程序是为了这个目的,它们将与我们编写的Arduino代码一起工作。但是,我为本教程使用麻省理工学院应用程序发明家在线应用程序。这是一个伟大的和易于使用的应用程序构建Android应用程序,在我的下一个教程,你可以找到一个详细的步骤指南如何构建自己的定制Android应用程序为您的Arduino项目

Arduino和Android蓝牙应用

你可以下载我为这个例子制作的应用程序:

通过连接按钮,我们将智能手机连接到蓝牙模块,按钮下方的状态文本将告诉我们是否已成功连接。使用“打开”和“关闭”按钮,我们可以打开和关闭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和笔记本蓝牙通过Processing IDE通信

现在程序准备好了,当我们点击运行按钮时,程序会自动激活笔记本电脑和Arduino之间的蓝牙通信。HC-05蓝牙模块将开始每2秒闪一次,这表明模块已连接,我们将能够使用我们的笔记本控制LED。

这就是本教程的全部内容,但不要忘记检查我的下一个教程,在那里我们将学习如何配置HC-05蓝牙模块,并使两个单独的Arduino板之间的蓝牙通信作为主从设备。

另外,请在评论区提出任何问题,不要忘记看看我收集的Arduino项目bet188me

38岁的反应

  1. 布鲁斯·马歇尔

    你好,
    你能发给我一个你的YouTube视频的链接吗?这个视频是关于将两个HC-05蓝牙模块连接到Arduinos上,演示你是如何使它们成为master和slave的。马歇尔认为,布鲁斯

    回复
  2. MAC

    你好,
    我试图做出相同的,但我得到这个错误"错误:' import '不命名类型import processing.serial.* "。

    我怎么能修好它?

    谢谢。

    回复
  3. 圣人

    我编写了一个HC-SR04来检测它前面发生的任何运动。我也跟随你的教程,制作了一个应用程序来控制Arduino使用HC-05蓝牙模块。每次HC-SR04检测到运动时,我希望在手机上安装了该应用程序的人的手机上播放一种声音。我该怎么做呢?

    回复
  4. 佛法KC

    做得很好教程-你可以分享你做的简单的应用程序的android代码。谢谢你!

    回复
  5. Anggi

    Nedekovki先生,为什么我的蓝牙HC-05模块有两个led同时闪烁(红色和蓝色)?

    因为我给“on”逻辑,led是不亮的。

    回复
    • Anggi

      能告诉我你的邮箱地址吗?我想发给你一张关于我的问题的照片/视频

      回复
    • 穆罕默德奥萨马

      从Arduino给HC-05蓝牙模块5V。如果你给小于5V,可能是,它不工作。

      回复
  6. 拉扎尔

    你好,我有个问题。我已经连接了BT模块并上传了代码,但是当我按下按钮时没有任何反应。

    是否我已经烧坏了BT模块?

    如果是,我该如何核实?

    回复
  7. Sanjeeban Maji

    你好,
    非常感谢你的这个教程,我尝试了这个,它是工作的。
    只有一个问题:当led是亮的,它显示led:关,反之亦然。你能帮我纠正一下吗?
    这也将是有帮助的,如果应用程序自动打开蓝牙!

    回复
  8. 的名字

    谢谢你的指导。我得把波特率设为9600。似乎HC05的默认值是9600

    回复
  9. 艾德里安

    你好,能否提供一下应用程序的源代码?不仅仅是构建的apk,我需要扩展你的简单apk的功能,用于一个学校项目

    回复
  10. 杰夫

    我在mega 2650上使用了pin 13,波特率为9600。此外,与应用程序,我必须改变从文本的红色和蓝色块上的文本颜色,一切显示正确。
    非常酷的介绍无线arduino控制。

    回复
  11. 皮特

    你好,非常好的介绍。我正在尝试重新创建它,但我注意到Arduino图中的2个电阻的标签似乎与图中电阻上的带相反。我不是情感表达者,但这有关系吗?如果有关系,哪个电阻去哪?我猜这也没什么关系,因为我是第一个注意到它的人。
    我只是碰巧注意到这一点,因为我在寻找电阻使用,并试图匹配的颜色上的波段在图表中…碰巧有一个电阻包与波段描述在它的背面。
    谢谢
    皮特

    回复
    • 德扬Nedelkovski

      嘿,这是一个很棒的评论。虽然图中电阻器的值是正确的,但是颜色标示是错误的。因此,考虑将电阻器按所述值连接起来。Arduino引脚> 1K > 2K > GND。

      回复
  12. 装置Fotiou

    这就跟你问声好!伟大的教程!然而,我想知道,我尝试与我的学生做一个应用程序,将能够检测两个配对设备的蓝牙信号强度。你认为这可能吗?我们希望能够从一个设备检查我们是否接近另一个设备。(就像捉迷藏和“冷”和“热”的游戏,当你们靠近的时候)。
    谢谢你的指导。
    装置

    回复
  13. 保罗•卡罗尔

    为了让其他人知道我所遇到的一个问题:并不是所有的HC05模块都有一个默认的38400速度。我的默认值是9600,所以Arduino代码不会为我工作,直到我改变它。
    也注意到一些板上的Rx/Tx引脚0和1。都是Serial1,所以您需要适当地更改代码。

    回复
  14. 鲍里斯

    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.

    德扬,伟大的教程。继续做好工作

    回复
  15. 乔治Papasotiriou

    你好,

    这个项目能和arduino uno一起工作吗?你为什么选择百万?

    回复
  16. 路易斯·里瓦斯

    你好,Dejan,这个教程非常有用,谢谢!我正在做一个项目,使用麻省理工学院的App Inventor,你从你的智能手机中提供一个数字,一个4段显示器显示该数字。我依赖于这个教程和你周围的其他教程。

    我需要更多的应用程序发明者方面的帮助,我想呵呵。

    无论如何,再次感谢!

    回复
  17. 乌米特

    在电路原理图中,您已经正确地写出了电阻器的值,但是它们的颜色是相反的。
    谢谢你提供的信息。

    回复
  18. Nagarajah Shankar

    你好,德扬,
    感谢您的伟大工作和教程。像你的简单和详细的教程容易理解。我53岁了,还在学习你的教程,用当地语言免费教孩子们机器人。
    愿上帝保佑你。
    再次感谢。
    来自斯里兰卡的格栅

    回复

留下一个回复

您的电子邮件地址将不会被公布。

推荐

2019年最佳入门级示波器为初学者和爱好者

最适合初学者和爱好者的示波器

推荐

2019年针对初学者的8个最佳Arduino入门工具包

8个最好的arduino初学者工具包

推荐

最佳3D打印机初学者和爱好者- 3D打印

最好的3d打印机初学者和爱好者