(转载)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);
      }
  }
}

原文连接:https://combofish.github.io/2020/02/08/how-to-use-hc-05-bluetooth-module.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容