|
在本篇文章中,我们将学习如何使用HC-05模块通过蓝牙通信控制Arduino开发板。在文章中,我列举了两个示例,使用智能手机控制Arduino开发板,以及使用笔记本电脑或PC控制Arduino开发板。在我的上一篇文章中,我们已经学习了如何配置HC-05蓝牙模块,并且作为主设备和从设备,在两个独立的Arduino开发板板之间进行蓝牙通信。
在我们开始使用智能手机控制Arduino开发板的第一个示例之前,先仔细看看HC-05蓝牙模块。将它与只能设置为从机的HC-06模块相比较,HC-05也可以设置为主机,这样可以在两个独立的Arduino开发板之间进行通信。这个模块有几个不同的版本,但我推荐一个分线板的版本,因为以这种方式连接起来要容易得多。 HC-05模块是蓝牙SPP(串行端口协议)模块,这意味着它通过串行通信与Arduino通信。
本示例所需的组件如下: ● HC-05蓝牙模块 ● Arduino开发板 ● 面包板和跳线
电路原理图 以下是我们将模块连接到Arduino开发板的方法。
我使用的这个模块可以在3.6到6V的电压下工作,因为它带有一个包含电压调节器的分线板。但是,数据引脚的逻辑电压电平为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, 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;
- }
- }
复制代码代码描述:首先,我们需要定义LED连接的引脚和一个变量,我们将存储来自智能手机的数据。在setup函数部分,我们需要将LED引脚定义为输出并立即将其设置为低电平。如前所述,我们将使用串行通信,因此我们需要以38400波特率开始串行通信,这是蓝牙模块的默认波特率。在loop函数中,使用Serial.available()函数,我们将检查串口中是否有可读数据。这意味着当我们将数据发送到蓝牙模块时,此语句将为真,然后使用Serial.read()函数,我们将读取该数据并将其置于“state”变量中。因此,如果Arduino收到字符'0',它将熄灭LED并使用Serial.println()函数,它将通过串口发送回智能手机,字符串“LED:OFF”。另外,我们将“state”变量重置为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蓝牙模块和Arduino 现在我们准备将智能手机连接到蓝牙模块和Arduino。我们需要做的是激活蓝牙,智能手机将找到HC-05蓝牙模块。
然后我们需要配对设备,HC-05模块的默认密码是1234。在我们配对设备后,我们需要一个控制Arduino的应用程序。 Play商店中有许多应用程序用于此目的,它将与我们编写的Arduino代码一起使用。但是,我使用MIT App Inventor在线应用程序为本教程制作了自己的自定义应用程序。这是一个非常易于使用的应用程序,用于构建Android应用程序。
您可以在此处下载我为此示例制作的应用:
Arduino Bluetooth Tutorial Example.rar
(1.37 MB, 下载次数: 108)
使用连接按钮,我们将智能手机连接到蓝牙模块,按钮下方的状态文本将告诉我们是否已成功连接。使用“打开”和“关闭”按钮,我们可以打开和关闭LED。按钮上方的文本是Arduino在按下特定按钮时发送回智能手机的文本。
通过蓝牙通信使用笔记本电脑或PC控制Arduino 让我们来看看如何使用笔记本电脑或PC通过蓝牙控制Arduino。因此,首先我们需要将笔记本电脑与HC-05蓝牙模块配对,我们可以通过笔记本电脑蓝牙设置进行配置。笔记本电脑将发现HC-05模块,并使用'1234'密码,我们将配对设备。
一旦我们将笔记本电脑设备管理器中的设备配对,在端口(COM和LPT)下,将出现两个名为“蓝牙链接标准串行”的新实体。从这里我们可以看到设备通信的串口的COM端口号。
我们将坚持使用与之前相同的示例,打开和关闭LED并将一个字符串发送回笔记本电脑,因此我们将使用与前面描述的相同的Arduino代码。
处理IDE源代码 现在使用Processing IDE,我们将制作一个控制Arduino的程序。以下是源代码。 - 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);
- }
- }
复制代码代码描述:我们需要包含串行库并创建一个串行对象,以便启用串行通信,以及为led状态定义一个String变量。在setup()部分,我们需要设置程序的窗口大小并启动串行通信。至于COM端口号,我们需要尝试我们之前在设备管理器中注意到的两个COM端口号中的一个。下一行代码定义了串口的缓冲,在我们的例子中,每次Arduino使用println()函数发送字符串“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蓝牙模块将开始每两秒闪烁一次,表示模块已连接,我们将能够使用笔记本电脑控制LED。
以上就是本篇文章的全部内容。如果遇到任何问题,请随时在本帖下面进行回复。 |