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

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

概述

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

HC 05蓝牙模块

在开始第一个示例(使用智能手机控制Arduino)之前,让我们仔细看看HC-05蓝牙模块。相比HC-06模块只能设置为Slave, 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板接受为高逻辑。

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应用程序

Arduino和Android蓝牙应用

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

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

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

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

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

一旦我们将笔记本设备管理器中的设备配对,在端口(COM和LPT)下,两个新的实体将出现,名为“标准串行蓝牙链接”。从这里我们可以看到串口的COM端口号,设备将通过串口进行通信。

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

我们将继续使用前面的例子,打开和关闭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和笔记本电脑通过处理IDE进行蓝牙通信

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

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

另外,请在下面的评论部分自由提问,不要忘记提问看看我收集的Arduino项目bet188me

38关于“Arduino和HC-05蓝牙模块完整教程”的思考

  1. 你好
    你能给我发一个链接到你的YouTube视频,是关于把连接到Arduinos的两个HC-05蓝牙模块配对成主从的吗?马歇尔认为,布鲁斯

    回复
  2. 你好,
    我试图做同样的,但我得到这个错误" error: ' import ' does not name a type import processing.serial.* "。

    我怎样才能修好它???

    谢谢。

    回复
  3. 我编写了HC-SR04来检测在它面前发生的任何动作。我也按照你的教程,做了一个应用程序,使用HC-05蓝牙模块控制Arduino。每次HC-SR04检测到移动时,我都想让安装了应用程序的人的手机上播放声音。我该怎么做呢?

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

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

    回复
  5. 嗨,我有个问题。我已经连接了BT模块并上传了代码,但是当我按下按钮时什么都没有发生。

    我是否有可能烧坏了BT模块?

    如果是,我要怎么检查?

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

    回复
  7. 你好,能否提供一下app的源代码?不仅仅是构建的apk…我需要为一个学校项目扩展你的简单apk的功能

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

    回复
  9. 你好,很好的介绍。我现在正在尝试重新创建它,但是我注意到Arduino图中两个电阻的标签似乎与图中电阻上的条带相反。我不是情感表达者,但这有关系吗?如果有关系,哪个电阻器在哪里?我猜这没什么关系,因为是我第一个注意到的。
    我只是碰巧注意到这一点,因为我正在寻找要使用的电阻器,并试图匹配图中频带上的颜色…碰巧有一个电阻器包,背面有频带说明。
    谢谢
    皮特

    回复
  10. 这就跟你问声好!伟大的教程!我想知道,尽管,我试图与我的学生做一个应用程序,将能够检测2对设备的蓝牙信号强度。你认为这可能吗?我们希望能够通过一个设备来检查我们是否接近了另一个设备。(就像捉迷藏游戏,当你们彼此靠近时就会“冷”和“热”)。
    谢谢你的指导。
    装置

    回复
  11. 为了让其他人知道我遇到的一个问题:并非所有HC05模块的默认速度都是38400。我的默认值为9600,因此在我更改该值之前,Arduino代码对我不起作用。
    也注意,Rx/Tx引脚0 & 1在一些板(即。列奥纳多)是Serial1,因此您需要适当地更改代码。

    回复
  12. 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.

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

    回复
  13. 你好,Dejan,本教程非常有用,非常感谢!我正在做一个项目,在这个项目中,使用麻省理工学院的应用程序发明家,你从你的智能手机中提供一个数字,然后一个4段显示这个数字。我依赖于本教程和你周围的其他教程。

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

    无论如何,再次感谢!

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

    回复
  15. 你好,德扬,
    感谢您的出色工作和教程。喜欢你的简单和详细的教程,容易理解。我53岁了,还在学习你们用当地语言免费教授学龄儿童机器人技术的教程。
    愿上帝保佑你。
    再次感谢。
    来自斯里兰卡的光栅

    回复

留言