HC-05蓝牙模块使用教程[Arduino]

BlueTooth HC-05蓝牙模块使用教程

模块简介

嵌入式蓝牙串口通讯模块(简称蓝牙模块)具有两种工作模式:命令响应工作模式和自动连接工作模式。

命令响应模式(AT模式)

首先按住蓝牙模块上的复位键然后再上电,看见蓝牙模块上的LED灯以2s间隔闪烁,就表示进入了AT模式 记住串口助手的波特率设置为38400,停止位1位,数据为8位,奇偶校验无,另外一定要勾上“发送新行”!

当模块处于命令响应工作模式(或者AT模式)时能才能执行 AT 命令,用户可向模块发送各种 AT指令,为模块设定控制参数或发布控制命令。(AT指令就是我们PC与一些终端设备(例如蓝牙,WiFi模块)之间进行通信的,配置这些终端设备参数的一套指令。)

自动链接模式

我们发送AT+RESET之后,当模块LED以0.5s间隔闪烁时表示进入自动连接模式。 在自动连接工作模式下模块又可分为主(Master)、从(Slave)和回环(Loopback)三种工作角色。 当模块处于自动连接工作模式时,将自动根据事先设定的方式连接的数据传输。

  • 主模式:该模块可以主动搜索并连接其它蓝牙模块并接收发送数据。
  • 从模式:只能被搜索被其它蓝牙模块连接进行接收发送数据。
  • 回环:蓝牙模块就是将接收的数据原样返回给远程的主设备。

连接串口通信模块

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

常用 AT 命令如下

AT+ORGL    # 恢复出厂模式
AT+NAME=<Name>    # 设置蓝牙名称
AT+ROLE=0    # 设置蓝牙为从模式
AT+CMODE=1    # 设置蓝牙为任意设备连接模式
AT+PSWD=<Pwd>    # 设置蓝牙匹配密码

## Other AT command
AT+VERSION? # 查看版本信息
AT+ADDR? # 查看蓝牙地址
AT+UART? # 查看串口参数
AT : Ceck the connection.
AT+ROLE: See role of bt module(1=master/0=slave)
AT+RESET : Reset and exit AT mode

正常情况下,命令发送后,会返回 OK ,如果没有返回任何信息,请检查接线是否正确, 蓝牙模块是否已经进入 AT 模式,如果上述两点都没有问题,可能是蓝牙模块的问题, 可以找蓝牙模块供应商咨询。设置完毕后,断开电源,再次通电, 这时,蓝牙模块指示灯会快速闪烁,这表明蓝牙已经进入正常工作模式。

从机设置的AT代码

AT returns OK
AT+NAME=HC05-Slave
AT+UART=9600,0,0
AT+ROLE=0

主机设置的AT代码

AT returns OK
AT+NAME=HC05-Master
AT+UART=9600,0,0
AT+ROLE=1

Arduino 通信示例代码

#include <SoftwareSerial.h> 
// Pin10为RX,接HC05的TXD
// Pin11为TX,接HC05的RXD
SoftwareSerial BT(10, 11);
char val;
void setup() {
  Serial.begin(38400);
  Serial.println("BT is ready!");
  // HC-05默认,38400
  BT.begin(38400);
}
void loop() {
  if (Serial.available()) {
    val = Serial.read();
    BT.print(val);
  }
  if (BT.available()) {
    val = BT.read();
    Serial.print(val);
  }
}

示例二:效果一样

#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3
#define baudrate 38400

String msg;
SoftwareSerial hc05(rxPin ,txPin);

void setup(){
  pinMode(rxPin,INPUT);
  pinMode(txPin,OUTPUT);
  Serial.begin(9600);
  Serial.println("ENTER AT Commands:");
  hc05.begin(baudrate);
}
void loop(){
  readSerialPort();
  if(msg!="") hc05.println(msg);
  if (hc05.available()>0){
    Serial.write(hc05.read());
  }
}
void readSerialPort(){
  msg="";
  while (Serial.available()) {
    delay(10);  
    if (Serial.available() >0) {
      char c = Serial.read();  //gets one byte from serial buffer
      msg += c; //makes the string readString
    }
  }
}

示例三:主从机通信

  • Arduino 连接蓝牙主机代码

    #include <SoftwareSerial.h>
    SoftwareSerial ArduinoSlave(2,3);
    String answer;
    String msg;
    void setup(){
      Serial.begin(9600);
      Serial.println("ENTER Commands:");
      ArduinoSlave.begin(9600);
    }
    void loop(){
      //Read command from monitor
      readSerialPort();
      //Read answer from slave
      while (ArduinoSlave.available()) {
        delay(10);  
        if (ArduinoSlave.available() >0) {
          char c = ArduinoSlave.read();  //gets one byte from serial buffer
          answer += c; //makes the string readString
        }
      }
      //Send data to slave
      if(msg!=""){
        Serial.print("Master sent : ");
        Serial.println(msg);
        ArduinoSlave.print(msg);
        msg="";
      }
      //Send answer to monitor
      if(answer!=""){
        Serial.print("Slave recieved : ");
        Serial.println(answer);
        answer="";
      }
    }
    void readSerialPort(){
      while (Serial.available()) {
        delay(10);  
        if (Serial.available() >0) {
          char c = Serial.read();  //gets one byte from serial buffer
          msg += c; //makes the string readString
        }
      }
      Serial.flush();
    }
    
    • Arduino 连接蓝牙从机代码
    #include <SoftwareSerial.h>
    SoftwareSerial ArduinoMaster(2,3);
    String msg;
    void setup(){
      Serial.begin(9600);
      ArduinoMaster.begin(9600);    
    }
    void loop(){
      readSerialPort();
      // Send answer to master
      if(msg!=""){
        Serial.print("Master sent : " );
        Serial.println(msg);
        ArduinoMaster.print(msg);
        msg=""; 
      }
    }
    void readSerialPort(){
      while (ArduinoMaster.available()) {
        delay(10); 
        if (ArduinoMaster.available() >0) {
          char c = ArduinoMaster.read();  //gets one byte from serial buffer
          msg += c; //makes the string readString
        }
      }
      ArduinoMaster.flush();
    }
    

使用步骤

将 Arduino 断电,然后按着蓝牙模块上的黑色按钮,再让 Arduino 通电, 如果蓝牙模块指示灯按2秒的频率闪烁,表明蓝牙模块已经正确进入 AT 模式。 打开 Arduino IDE 的串口监视器,选择正确的端口,将输出格式设置为 Both: NL & CR , 波特率设置为 38400 ,可以看到串口监视器中显示 BT is ready! 的信息。 然后,输入 AT ,如果一切正常,串口显示器会显示 OK。接下来,我们即可对蓝牙模块进行设置。

示例:蓝牙控制小灯

#include <SoftwareSerial.h>

// Pin3为RX,接HC05的TXD
// Pin2为TX,接HC05的RXD
SoftwareSerial BT(3, 2);
char val;
int ledPin=5;

void setup() {
  Serial.begin(38400);
  Serial.println("BT is ready!");
  // HC-05默认,38400
  BT.begin(38400);

  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (Serial.available()) {
    val = Serial.read();
    BT.print(val);
  }
  if (BT.available()) {
    val = BT.read();
    Serial.print(val);

    if (val == '1')
      {
	// 返回到手机调试程序上
	Serial.write("Serial--ledPin--high");
	digitalWrite(ledPin, HIGH);
      }
    if (val == '2')
      {
	Serial.write("Serial--ledPin--low");
	digitalWrite(ledPin, LOW);
      }
  }
}
步骤: 1. 两个蓝牙模块必须一个作为主机,另一个作为从机才能建立连接(上电后,从机一直处于接受状态,等待被连接。而主机则主动发出信号,寻找目标从机,前提是该目标从机的mac地址事先被写入到主机的flash芯片中储存) 2. 蓝牙模块上电前一直按住key按键不放,上电后松开,此时LED灯处于慢闪状态(每秒闪1次),提示已经进入AT指令响应状态,可以进行接收AT指令控制 3. PC端打开安可信串口助手(带AT指令),打开相应的串口,发送AT+ROLE?\n查询该模块的主从角色,如果为0,则为从机,如果为1则为主机。本例中,此模块(图中左边的HC-05模块)设为主机,则发送AT+ROLE=1\n,设为主机,成功返回OK 4. 发送AT+ADDR?\n查询此模块的mac地址,本例中为98d3:33:80ebdf,记下来稍后为从机的地址绑定用。同样的方法将另一个模块(图中右边的HC-05模块)设置为从机(AT+ROLE=0\n),并且查询到mac地址为98d3:36:aac2 5. 向主机串口中发送AT+BIND=98d3,36,aac2\n绑定从机的mac地址,成功则返回OK。发送AT+CMODE=0\n将主机设为指定蓝牙地址连接模式(即只允许主机向绑定好mac地址的蓝牙从机设备发起连接) 6. 同样地,向从机串口发送AT+BIND=983d,33,80ebdf\n绑定主机的mac地址,成功则返回OK。发送AT+CMODE=0\n将从机也设为指定蓝牙地址连接模式(即只允许从机接受绑定好mac地址的蓝牙主机设备发起的连接) 7. 至此,主从机均设置完毕。主从两模块松开key键重新上电,LED都快闪(每秒闪2次),表明均处于等待配对状态,随后大约几秒钟后,LED闪烁频率发生变化(不确定),表明已经侦测到目标设备,正在建立连接。随后大约一秒钟,很快 LED变成慢双闪状态(每2秒闪一次,每次连闪2下),提示已经配对成功,可以通过蓝牙协议传输数据了 8. 此时,在串口助手中发送一串字符,如果另一个蓝牙模块的串口助手里收到了同样的字符,且回送的字符,对方亦能收到,则通信成功。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值