风筝
发表于: 2018-11-21 22:52:45 | 显示全部楼层

在本篇文章中,我们将学习如何使用HC-05模块通过蓝牙通信控制Arduino开发板。在文章中,我列举了两个示例,使用智能手机控制Arduino开发板,以及使用笔记本电脑或PC控制Arduino开发板。在我的上一篇文章中,我们已经学习了如何配置HC-05蓝牙模块,并且作为主设备和从设备,在两个独立的Arduino开发板板之间进行蓝牙通信。

HC-05-Bluetooth-Module.jpg


在我们开始使用智能手机控制Arduino开发板的第一个示例之前,先仔细看看HC-05蓝牙模块。将它与只能设置为从机的HC-06模块相比较,HC-05也可以设置为主机,这样可以在两个独立的Arduino开发板之间进行通信。这个模块有几个不同的版本,但我推荐一个分线板的版本,因为以这种方式连接起来要容易得多。 HC-05模块是蓝牙SPP(串行端口协议)模块,这意味着它通过串行通信与Arduino通信。


本示例所需的组件如下:

●    HC-05蓝牙模块

●    Arduino开发板

●    面包板和跳线


电路原理图

以下是我们将模块连接到Arduino开发板的方法。

Arduino-and-HC-05-Bluetooth-Module-Circuit-Schematics.png

我使用的这个模块可以在3.6到6V的电压下工作,因为它带有一个包含电压调节器的分线板。但是,数据引脚的逻辑电压电平为3.3V。因此,Arduino的TX(具有5V输出的发送引脚)和蓝牙模块RX(仅支持3.3V的接收引脚)之间的线路需要通过分压器连接,以免烧毁模块。另一方面,蓝牙模块TX引脚和Arduino RX引脚之间的线路可以直接连接,因为来自蓝牙模块的3.3V信号足以被Arduino开发板上的高逻辑识别。


Arduino蓝牙通信示例源代码

现在我们准备制作Arduino代码,以实现Arduino板和智能手机之间的通信。我们将举一个简单的例子,只需打开和关闭LED,但它足以理解通信。

  1. #define ledPin 7
  2. int state = 0;
  3. void setup() {
  4.   pinMode(ledPin, OUTPUT);
  5.   digitalWrite(ledPin, LOW);
  6.   Serial.begin(38400); // Default communication rate of the Bluetooth module
  7. }
  8. void loop() {
  9.   if(Serial.available() > 0){ // Checks whether data is comming from the serial port
  10.     state = Serial.read(); // Reads the data from the serial port
  11. }
  12. if (state == '0') {
  13.   digitalWrite(ledPin, LOW); // Turn LED OFF
  14.   Serial.println("LED: OFF"); // Send back, to the phone, the String "LED: ON"
  15.   state = 0;
  16. }
  17. else if (state == '1') {
  18.   digitalWrite(ledPin, HIGH);
  19.   Serial.println("LED: ON");;
  20.   state = 0;
  21. }
  22. }
复制代码

代码描述:首先,我们需要定义LED连接的引脚和一个变量,我们将存储来自智能手机的数据。在setup函数部分,我们需要将LED引脚定义为输出并立即将其设置为低电平。如前所述,我们将使用串行通信,因此我们需要以38400波特率开始串行通信,这是蓝牙模块的默认波特率。在loop函数中,使用Seri​​al.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蓝牙模块。

Smartphone-Bluetooth-Settings.jpg

然后我们需要配对设备,HC-05模块的默认密码是1234。在我们配对设备后,我们需要一个控制Arduino的应用程序。 Play商店中有许多应用程序用于此目的,它将与我们编写的Arduino代码一起使用。但是,我使用MIT App Inventor在线应用程序为本教程制作了自己的自定义应用程序。这是一个非常易于使用的应用程序,用于构建Android应用程序。

Android-Bluetooth-App.jpg


您可以在此处下载我为此示例制作的应用: Arduino Bluetooth Tutorial Example.rar (1.37 MB, 下载次数: 108)


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


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

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

Arduino-and-HC-05-Bluetooth-Module-Laptop-Settings-1.jpg


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

Arduino-and-HC-05-Bluetooth-Module-Laptop-Settings-2.jpg


我们将坚持使用与之前相同的示例,打开和关闭LED并将一个字符串发送回笔记本电脑,因此我们将使用与前面描述的相同的Arduino代码。


处理IDE源代码

现在使用Processing IDE,我们将制作一个控制Arduino的程序。以下是源代码。

  1. import processing.serial.*;
  2. Serial myPort;
  3. String ledStatus="LED: OFF";
  4. void setup(){
  5.   size(450, 500);
  6.   myPort = new Serial(this, "COM5", 38400); // Starts the serial communication
  7.   myPort.bufferUntil('\n'); // Defines up to which character the data from the serial port will be read. The character '\n' or 'New Line'
  8. }
  9. void serialEvent (Serial myPort){ // Checks for available data in the Serial Port
  10.   ledStatus = myPort.readStringUntil('\n'); //Reads the data sent from the Arduino (the String "LED: OFF/ON) and it puts into the "ledStatus" variable
  11. }
  12. void draw(){
  13.   background(237, 240, 241);
  14.   fill(20, 160, 133); // Green Color
  15.   stroke(33);
  16.   strokeWeight(1);
  17.   rect(50, 100, 150, 50, 10);  // Turn ON Button
  18.   rect(250, 100, 150, 50, 10); // Turn OFF Button
  19.   fill(255);
  20.   
  21.   textSize(32);
  22.   text("Turn ON",60, 135);
  23.   text("Turn OFF", 255, 135);
  24.   textSize(24);
  25.   fill(33);
  26.   text("Status:", 180, 200);
  27.   textSize(30);
  28.   textSize(16);
  29.   text("Program made by Dejan Nedelkovski,\n     www.HowToMechatronics.com", 80, 320);
  30.   text(ledStatus, 155, 240); // Prints the string comming from the Arduino
  31.   
  32.   // If the button "Turn ON" is pressed
  33.   if(mousePressed && mouseX>50 && mouseX<200 && mouseY>100 && mouseY<150){
  34.     myPort.write('1'); // Sends the character '1' and that will turn on the LED
  35.     // Highlighs the buttons in red color when pressed
  36.     stroke(255,0,0);
  37.     strokeWeight(2);
  38.     noFill();
  39.     rect(50, 100, 150, 50, 10);
  40.   }
  41.   // If the button "Turn OFF" is pressed
  42.   if(mousePressed && mouseX>250 && mouseX<400 && mouseY>100 && mouseY<150){
  43.     myPort.write('0'); // Sends the character '0' and that will turn on the LED
  44.     stroke(255,0,0);
  45.     strokeWeight(2);
  46.     noFill();
  47.     rect(250, 100, 150, 50, 10);
  48.   }
  49. }
复制代码

代码描述:我们需要包含串行库并创建一个串行对象,以便启用串行通信,以及为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-and-Laptop-Bluetooth-Communication-via-Processing-IDE.jpg


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


以上就是本篇文章的全部内容。如果遇到任何问题,请随时在本帖下面进行回复。

跳转到指定楼层
ll6303
发表于: 2019-7-27 21:05:15 | 显示全部楼层

烧入蓝牙的代码好像不对哦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1483



手机版|

GMT+8, 2024-5-8 10:10 , Processed in 0.040106 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表