Arduino和HC-05蓝牙模块完整教程
在本 Arduino 蓝牙教程中,我们将学习如何使用 HC-05 模块通过蓝牙通信控制 Arduino。您可以观看以下视频或阅读下面的书面教程了解更多详情。
在本教程中,我做了两个示例,使用智能手机控制 Arduino 和使用笔记本电脑或 PC 控制 Arduino。为了不使本教程超载,在我的下一个教程中,我们将学习如何配置 HC-05 蓝牙模块并在两个单独的 Arduino 板作为主设备和从设备之间进行蓝牙通信。
在我们开始第一个示例之前,使用智能手机控制 Arduino,让我们仔细看看 HC-05 蓝牙模块。与只能设置为从机的 HC-06 模块相比,HC-05 也可以设置为主机,从而可以在两个单独的 Arduino 板之间进行通信。这个模块有几个不同的版本,但我推荐使用分线板上的那个,因为这样连接起来更容易。 HC-05模块是一个蓝牙SPP(Serial Port Protocol)模块,即通过Serial Communication与Arduino进行通信。
您可以从以下任何网站获取本 Arduino 教程所需的组件:
这是我们需要将模块连接到 Arduino 板的方法。
我拥有的特定模块可以从 3.6 到 6 伏供电,因为它位于包含稳压器的分线板上。但是,数据引脚的逻辑电压电平为 3.3V。因此,Arduino TX(Transmit Pin,5V输出)和蓝牙模块RX(Receive Pin,仅支持3.3V)之间的线需要通过分压器连接,以免烧毁模块。另一方面,蓝牙模块的TX pin和Arduino RX pin之间的线可以直接连接,因为蓝牙模块的3.3V信号足以被Arduino Board接受为高逻辑。
所以,现在我们准备好制作 Arduino 代码来实现 Arduino 板和智能手机之间的通信。我们将做一个简单的例子,只是打开和关闭一个 LED,但它足以理解通信。
说明: 首先,我们需要定义 LED 将连接到的引脚和一个变量,我们将在其中存储来自智能手机的数据。在设置部分,我们需要将 LED 引脚定义为输出并立即将其设置为低电平。如前所述,我们将使用串行通信,因此我们需要以 38400 波特率开始串行通信,这是蓝牙模块的默认波特率。在带有 Serial.available() 函数的循环部分,我们将检查串行端口中是否有可用数据可供读取。这意味着当我们将数据发送到蓝牙模块时,该语句将是正确的,因此使用 Serial.read() 函数我们将读取该数据并将其放入“状态”变量中。因此,如果 Arduino 接收到字符“0”,它将关闭 LED,并使用 Serial.println() 函数通过串行端口将字符串“LED:OFF”发送回智能手机。此外,我们将“状态”变量重置为 0,这样上述两行将只执行一次。注意这里的“state”变量是整数,所以当我们收到来自智能手机的字符“0”时,整数“state”变量的实际值为48,对应字符“0”,根据ASCII table.. 这就是为什么在“if”语句中我们将“state”变量与字符“0”进行比较。另一方面,如果接收到的字符为“1”,则 LED 会亮起并返回字符串“LED:ON”。
现在代码已准备好上传,但为了做到这一点,我们需要拔下 TX 和 RX 线,因为上传时 Arduino 使用串行通信,因此引脚 RX(数字引脚 0)和 TX(数字引脚 1)很忙。如果我们使用 Arduino Board 的其他 TX 和 RX 引脚,我们可以避免这一步,但在这种情况下,我们将不得不使用 SoftwareSerial.h 库进行串行通信。
相关:如何配置和配对两个 HC-05 蓝牙模块作为主从模块 | AT指令
现在我们准备将智能手机连接到蓝牙模块和 Arduino。我们这里需要做的是激活蓝牙,智能手机就会找到HC-05蓝牙模块。
然后我们需要配对设备,HC-05模块的默认密码是1234。配对设备后,我们需要一个控制Arduino的应用程序。 Play 商店中有许多应用程序可以用于此目的,它们将与我们编写的 Arduino 代码一起使用。但是,我使用 MIT App Inventor 在线应用程序为本教程制作了自己的自定义应用程序。这是一个用于构建 Android 应用程序的出色且易于使用的应用程序,在我的下一个教程中,您可以找到详细的分步指南,如何为您的 Arduino 项目构建您自己的自定义 Android 应用程序。
你可以在这里下载我为这个例子制作的应用程序:
使用连接按钮,我们将智能手机连接到蓝牙模块,按钮下方的状态文本将告诉我们是否已成功连接。使用“打开”和“关闭”按钮,我们可以打开和关闭 LED。按钮上方的文本是 Arduino 在按下特定按钮时发送回智能手机的文本。
让我们看看如何使用笔记本电脑或 PC 通过蓝牙控制 Arduino。因此,首先我们需要将笔记本电脑与 HC-05 蓝牙模块配对,我们可以从笔记本电脑蓝牙设置中进行配对。笔记本电脑将发现 HC-05 模块并使用“1234”密码配对设备。
一旦我们在笔记本电脑设备管理器中配对设备,在端口(COM 和 LPT)下,将出现两个名为“蓝牙链路上的标准串行”的新实体。从这里我们可以看到设备将通过其进行通信的串行端口的 COM 端口号。
我们将继续使用与之前相同的示例,打开和关闭 LED 并将字符串发送回笔记本电脑,因此我们将使用与之前描述的相同的 Arduino 代码。
现在使用 Processing IDE,我们将制作一个用于控制 Arduino 的程序。这是源代码。
说明: 我们需要包含串行库并创建一个串行对象以启用串行通信,并为 LED 状态定义一个字符串变量。在设置部分我们需要设置程序的窗口大小并启动串行通信。至于这里的 COM 端口号,我们需要尝试我们之前在设备管理器中注意到的两个 COM 端口号之一。下一行定义了串行端口的缓冲,在我们的例子中,直到有一个新行,实际上每次 Arduino 发送字符串“LED:OFF”或“LED ON”时都有一个新行,因为 println( ) 功能。接下来,使用 serialEvent() 函数我们检查串口中是否有可用数据可供读取。如果是这样,使用 readStringUntil() 函数,我们将从 Arduino 发送的串行端口读取该数据,在我们的例子中是字符串“LED:OFF”或“LED:ON”。
在不断重复的主 draw() 函数中,我们制作程序的所有图形和功能。所以首先我们需要设置背景颜色、填充颜色、笔触大小和颜色,然后使用 rect() 函数绘制两个按钮。使用 text() 函数,我们打印所有文本,包括来自 Arduino 的 ledStatus 字符串。现在剩下的就是让按钮发挥作用。因此,使用第一个“if”语句,我们限制了“打开”按钮的区域,因此当按下按钮时,字符“1”将通过串行端口发送到 Arduino,这将打开 LED。下一个 for 行用于在按下按钮时突出显示该按钮。 “关闭”按钮也是如此。
现在程序已经准备好了,所以当我们点击运行按钮时,程序会自动激活笔记本电脑和Arduino之间的蓝牙通信。 HC-05蓝牙模块每两秒开始闪烁一次,表示模块已连接,我们可以使用笔记本电脑控制LED。
这就是本教程的全部内容,但不要忘记查看我的下一个教程,我们将学习如何配置 HC-05 蓝牙模块并在两个单独的 Arduino 板之间进行蓝牙通信作为主设备和从设备。
另外,请随时在下面的评论部分提出任何问题,不要忘记查看我收集的 Arduino 项目。概览
电路原理图
Arduino蓝牙通信示例源码
#define ledPin 7
int state = 0;
void setup() {
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
Serial.begin(38400); // Default communication rate of the Bluetooth module
}
void loop() {
if(Serial.available() > 0){ // Checks whether data is comming from the serial port
state = Serial.read(); // Reads the data from the serial port
}
if (state == '0') {
digitalWrite(ledPin, LOW); // Turn LED OFF
Serial.println("LED: OFF"); // Send back, to the phone, the String "LED: ON"
state = 0;
}
else if (state == '1') {
digitalWrite(ledPin, HIGH);
Serial.println("LED: ON");;
state = 0;
}
}
Code language: Arduino (arduino)将智能手机连接到 HC-05 蓝牙模块和 Arduino
Arduino 蓝牙教程示例 Android 应用程序
1 个文件 1.38 MB 下载 通过蓝牙通信使用笔记本电脑或 PC 控制 Arduino
处理IDE源代码
import processing.serial.*;
Serial myPort;
String ledStatus="LED: OFF";
void setup(){
size(450, 500);
myPort = new Serial(this, "COM5", 38400); // Starts the serial communication
myPort.bufferUntil('\n'); // Defines up to which character the data from the serial port will be read. The character '\n' or 'New Line'
}
void serialEvent (Serial myPort){ // Checks for available data in the Serial Port
ledStatus = myPort.readStringUntil('\n'); //Reads the data sent from the Arduino (the String "LED: OFF/ON) and it puts into the "ledStatus" variable
}
void draw(){
background(237, 240, 241);
fill(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);
}
}
Code language: Arduino (arduino)
制造工艺