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

在此Arduino蓝牙教程中,我们将学习如何使用HC-05模块通过蓝牙通信控制Arduino。您可以观看以下视频或阅读下面的书面教程以获取更多详细信息。

概述


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

HC 05蓝牙模块

在我们从第一个示例开始之前,使用智能手机控制Arduino,让我们仔细看看HC-05蓝牙模块。将其与HC-06模块进行比较,只能设置为从站,HC-05也可以设置为主设备,这使得能够在两个单独的Arduino板之间进行通信。这个模块有几种不同的版本,但我推荐出于突破板上的那个,因为这样它就会更容易连接。HC-05模块是蓝牙SPP(串行端口协议)模块,这意味着它通过串行通信与Arduino通信。

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

必威外围提钱披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。

电路原理图


以下是我们如何将模块连接到Arduino板。

Arduino和HC 05蓝牙模块电路示意图 -  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,输出);DigitalWrite(LEDPIN,低);Serial.Begin(38400);//蓝牙模块的默认通信率} void循环(){if(serial.available()> 0){//检查数据是否从串行端口状态= serial.read();//从串行端口读取数据}如果(state =='0'){digitalwrite(LEDPIN,LED);//关闭LED elfial.println(“LED:OFF”);//发送回电话,字符串“LED:ON”状态= 0;}如果(state =='1'){digitalwrite(LEDPIN,高);serial.println(“LED:ON”);; state = 0; } }

描述:首先,我们需要定义LED将连接到的pin和一个用于存储来自智能手机的数据的变量。在设置部分,我们需要将LED引脚定义为输出,并将其设置为低电平。如前所述,我们将使用串行通信,因此我们需要以38400波特率开始串行通信,这是蓝牙模块的默认波特率。在loop部分使用serial .available()函数,我们将检查串口中是否有可用的数据要读取。这意味着当我们将数据发送到蓝牙模块时,此语句将为真,因此使用Serial.read()函数将读取数据并将其放入“state”变量中。因此,如果Arduino接收到字符' 0 ',它将关闭LED,并使用serial .println()函数,它将通过串口向智能手机发送字符串" LED: off "。另外,我们将把“state”变量重置为0,以便以上两行只执行一次。注意,这里的“state”变量是整数,所以当我们接收到来自智能手机的字符' 0 '时,整数“state”变量的实际值是48,它对应于字符' 0 ',根据ASCII.表。这就是为什么在“如果”语句中,我们正在将“状态”变量与字符“0”进行比较。另一方面,如果收到的字符为“1”,则LED将亮起并将串“LED:ON”发送回来。

现在,代码已准备好上传,但是为了做到我们需要拔下TX和RX线路,因为在上传Arduino时使用串行通信,因此引脚Rx(数字引脚0)和TX(数字PIN1)正忙。如果我们使用Arduino Board的其他TX和RX引脚,我们可以避免此步骤,但在这种情况下,我们必须使用Softwareserial.h库进行串行通信。

相关:如何配置和配对两个HC-05蓝牙模块作为主设备和奴隶|在命令

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


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

智能手机蓝牙设置

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

Arduino和Android蓝牙应用程序

您可以在此下载我在此示例中为此的应用程序:

使用“连接”按钮,我们将智能手机连接到蓝牙模块,按钮下方的状态文本将告诉我们我们是否已成功连接。使用“开启”和“关闭”按钮,我们可以打开和关闭LED。按钮上方的文本是按下特定按钮时Arduino在智能手机发送回智能手机的文本。

使用笔记本电脑或个人电脑通过蓝牙通信控制Arduino


让我们看看如何通过蓝牙控制Arduino使用笔记本电脑或个人电脑。因此,首先我们需要将笔记本电脑与HC-05蓝牙模块配对,我们可以通过笔记本电脑的蓝牙设置实现这一点。笔记本电脑将发现HC-05模块,并使用“1234”密码将设备配对。

Arduino和HC-05蓝牙模块 - 笔记本电脑设置1

一旦我们将在Ports(Com&LPT)下会将设备配对,在端口(COM&LPT)下,两个新实体将出现名为“标准串行的蓝牙链接”。从这里我们可以看到设备将通信的串口的COM端口号。

Arduino和HC-05蓝牙模块 - 笔记本电脑设置2

我们将坚持像以前一样的例子,打开和关闭LED并将字符串发送到笔记本电脑,因此我们将使用相同的Arduino代码,如前所述。

处理IDE源代码


现在我们使用处理IDE来制作一个Arduino的控制程序。这是源代码。

导入处理。*;串行MyPort;字符串LEDSTATUS =“LED:OFF”;void setup(){大小(450,500);MyPort = New Serial(这,“Com5”,38400);//启动串行通信myport.bufferuntil('\ n');//定义向上读取串口中数据的字符。字符'\ n'或'new line'} void serialevent(串行myport){//检查串行端口LEDSTATUS = MYPORT.READSTRingUNTIL('\ n')中的可用数据;//读取从Arduino发送的数据(字符串“LED:OFF / ON),它进入”LEDSTATUS“变量} void draw(){背景(237,240,241);填充(20,160,133); //绿色中风(33);行程重量(1);矩形(50,100,150,50,10); //打开按钮矩形(250,100,150,50,10); //转弯关闭按钮填充(255); TextSize(32);文本(“打开”,60,135);文本(“关闭”,255,135); TextSize(24);填充(33);文本(“状态:", 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); } }

描述:我们需要包含串行库并创建串行对象,以便启用串行通信,以及为LED状态定义字符串变量。在“设置”部分中,我们需要设置程序的窗口大小并启动​​串行通信。至于这里的COM端口号我们需要尝试我们之前在设备管理器中注意到的两个COM端口号之一。The next line defines the buffering of the serial port and in our case that’s until there is a new line and actually there is a new line each time the Arduino sends the String “LED: OFF” or “LED ON” because of the println() function. Next, using the serialEvent() function we check whether there is available data in the serial port to be read. If so, using the readStringUntil() function we will read that data from the serial port which has been sent from the Arduino and in our case that’s the String “LED: OFF” or “LED: ON”.

在不断重复的主绘制()函数中,我们制作程序的所有图形和功能。所以首先,我们需要设置背景颜色,填充颜色,笔划大小和颜色以及使用rect()函数我们绘制两个按钮。使用Text()函数我们打印所有文本,包括来自Arduino的LEDStatus字符串。现在留下了什么是使按钮功能突出。所以使用第一个“如果”声明我们限制了“打开”按钮的区域,所以当按下按钮时,字符'1'将在串行端口上发送到Arduino,这将打开LED。下一个线用于在按下时突出显示按钮。“关闭”按钮相同的过程。

Arduino与笔记本电脑通过处理IDE进行蓝牙通信

现在程序已准备就绪,因此当我们选择单击“运行”按钮时,程序将自动激活笔记本电脑和Arduino之间的蓝牙通信。HC-05蓝牙模块每两秒钟将开始闪烁,这表示模块连接,我们将能够使用我们的笔记本电脑控制LED。

静态所有本教程,但别忘了检查我的下一个教程,我们将学习如何配置HC-05蓝牙模块,并在两个单独的Arduino板之间成为主设备和从设备之间的蓝牙通信。

还有,请在下面的评论部分提出任何问题,不要忘记查看我的Arduino项目集合bet188me

38回应

  1. 布鲁斯·马歇尔

    你好,
    请在配对两台HC-05蓝牙模块上向我发送给您的YouTube视频的链接吗?连接到Arduinos,以展示如何使它们掌握和奴隶?问候,布鲁斯马歇尔

    回复
  2. MAC

    你好,
    我正在尝试制作相同,但我收到这个错误“错误:'导入'不命名为类型导入处理。*”。

    我怎么能修好它??

    thanx。

    回复
  3. Rishi.

    我给HC-SR04编了个程序来检测它前面的任何动作。我也跟着您的教程做了一个app,使用HC-05 bleutooth模块来控制Arduino。每当HC-SR04检测到动作,我就想让手机上安装了该应用程序的人的手机上播放声音。我该怎么做呢?

    回复
  4. 佛法KC

    做得很好教程-你能分享你所做的简单应用程序的android代码吗?谢谢你!

    回复
  5. Anggi

    Nidekovki先生,为什么我的蓝牙HC-05模块有2个LED在同一时间闪烁(红色和蓝色)?

    由于我给出“ON”逻辑LED未开启。

    回复
    • Anggi

      我可以要求您的电子邮件地址吗?我想发给你一张关于我的问题的照片/视频

      回复
    • 穆罕默德奥萨马

      将5V从Arduino到HC-05蓝牙模块。如果您将少于5V,可能是,它不起作用。

      回复
  6. 拉扎尔

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

    我有可能烧掉了BT模块吗?

    如果是的话,那么我怎么能检查一下?

    回复
  7. Sanjeeban maji.

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

    回复
  8. 姓名

    谢谢你的教程。我不得不将波特率设置为9600.似乎它是默认为9600 for hc05

    回复
  9. 艾德里安

    嗨,您能否提供应用程序的源代码?不仅仅是建成的APK ......我需要扩展您简单APK的功能,以便为学校项目

    回复
    • 德扬Nedelkovski

      对不起,此刻我没有它,但如果您按照视频中的步骤操作,您可以轻松地重新创建它,您可以看到我使用的所有块。

      回复
  10. 杰夫

    我在Mega 2650上使用了PIN 13,9600用于波特率。同样使用应用程序,我必须从文本到红色和蓝色块上的TextColor,以便正确显示。
    非常酷的介绍无线Arduino控制。

    回复
  11. 皮特

    嗨,非常好的介绍。我现在正在尝试重新创建它,但我注意到Arduino图中的2个电阻的标签似乎从图表中的电阻器上的频段逆转。我不是ee,但这件事吗?如果它确实很重要,哪个电阻会在哪里?我猜这并不重要(?),因为我是第一个注意到它的东西。
    我只是碰巧注意到这,因为我正在寻找电阻使用,并试图匹配颜色的带子在图表中…和碰巧有一个电阻包与带子的描述在它的背面。
    谢谢
    皮特

    回复
    • 德扬Nedelkovski

      嘿,这是一个很好的评论。虽然图中电阻的值是正确的,但颜色标签是错误的。因此,请考虑使用值所述连接电阻。Arduino Pin> 1K> 2K> GND。

      回复
  12. sotiris fotiou.

    这就跟你问声好!伟大的教程!我想知道,尽管,我试图与我的学生做一个应用程序,将能够检测两个配对设备的蓝牙信号强度。你觉得这可能吗?我们希望能够从一个设备来检查我们是否正在接近另一个。(比如捉迷藏、“冷”和“热”,当你们靠得很近的时候)。
    谢谢你的教程。
    装置

    回复
  13. 保罗•卡罗尔

    只是让其他人知道我遇到的一个问题:不是所有HC05模块的默认速度都是38400。我的默认值是9600所以Arduino代码在我更改之前无法工作。
    另请注意,某些板上的Rx / TX引脚0&1(即Leonardo)是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一起工作吗?你为什么选择mega?

    回复
  16. Luis Rivas.

    你好Dejan,这个教程非常有用,非常感谢!我正在研究一个项目,其中,使用MIT应用程序发明家,您可以从智能手机提供一个数字,4个段显示显示该数字。我依靠这个教程和你躺着的另一个教程。

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

    无论如何,再次感谢!

    回复
  17. 乌米特

    在电路原理图中,您可以正确写入电阻的值,但它们的颜色颠倒。
    感谢您的信息。

    回复
  18. Nagarajah Shankar.

    你好,德扬,
    谢谢你伟大的工作和教程。喜欢你简单的&细节教程容易理解。我今年53岁,还在学习你的教程,用当地语言免费教授学生机器人。
    愿上帝保佑你。
    再次感谢。
    来自斯里兰卡的光栅

    回复

留下一个回复

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

受到推崇的

2019年初学者和爱好者的最佳进入级示波器

最好的示波器为初学者和爱好者

受到推崇的

8个最好的Arduino入门工具包,适合2019年初学者

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

受到推崇的

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

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