(轉載)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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容