Arduino---HC-05 藍牙模塊

藍牙基礎知識回顧:

(一)Arduino和HC-05鏈接

注意:Arduino經過TX與HC-05進行通訊,而Arduino的電壓爲5V,HC-05的容許電壓爲3.3V。短期通訊無妨(長時間可能燒燬HC-05)<接分壓電路>

U = 5*20/30 = 3.3V
I = 5V/(10K+20K) = 0.16mA

(二)Arduino和HC-05和手機通訊

1.手機發送信息給藍牙
2.藍牙將信息經過TX口發送給Arduino的串口緩衝區(Arduino能夠接收)
3.Arduino只須要Serial.read()操做就能夠取出藍牙傳過來的數據

 

缺點:使用Serial.read()讀取數據,可能也會讀取到電腦串口發送的數據(致使數據混亂)html

因此推薦使用SoftwareSerial.h頭文件進行藍牙操做(操做方法下面有使用)--------軟件串行接口

補充:串口透傳---透明傳輸

藍牙傳輸數據使用透明傳輸:在傳輸過程當中數據不發生任何形式的變化,彷彿傳輸過程是透明的,數據原封不動的從發送方傳輸到接收端

補充:硬件串行接口和軟件串行接口

Serial---硬件串行接口 SoftwareSerial---軟件串行接口

一:問題

(一)出如今AT模式下只有第一個命令能夠正確返回OK,其餘返回ERROR(0)

(二)出現手機和藍牙相連發送數據始終亂碼,不正確問題

二:解決問題1:進入AT模式

(一)HC-05在AT模式下的頻率必須是38400

(二)注意在命令結束後面都須要咱們加上回車符

(三)arduino下設置代碼,進入AT模式

//HC-05進入設置AT模式
#include <SoftwareSerial.h>

SoftwareSerial BT(8,9);

void setup()
{
  //開啓電腦通訊串口,由於HC-05的波特率爲38400,二者通訊保持一致
  Serial.begin(38400);
 //開啓藍牙,設置波特率38400,進入AT模式 BT.begin(
38400); //告訴電腦,藍牙準備好了 Serial.println("BT is ready!"); } char AT_Cmd,AT_Rec; void loop() { //如果電腦發送信息 if(Serial.available()>0) { //讀取信息,而且將信息發送給藍牙,進行AT設置 AT_Cmd = Serial.read(); BT.print(AT_Cmd); } //如果接收到藍牙返回的信息:通常設置後返回OK if(BT.available()>0) { AT_Rec = BT.read(); Serial.print(AT_Rec); } }
疑惑:爲何在BT.available下,電腦依舊會一直顯示藍牙回收的信息(難道藍牙在一直髮送響應信息)?

(四)重點:解決問題一(除了第一個之外的其餘命令返回error)

HC-05的EN腳先接3.3V,接着按着KEY鍵不放,而後給模塊上電(供5V)後,這一瞬間模塊進入了AT命令響應狀態,
你才能夠在串口調試助手裏面輸入一條AT命令;
若是想再輸入一條AT命令,你必須重複剛纔的過程(斷電後再按KEY鍵再上電),
也就是說模塊在進入了AT命令響應狀態後只能響應一條AT命令(緣由不明,不知道是否是隻有個人這樣)

按住先斷開HC-05的vcc接線(斷電),而後一直按住Key,再接上vcc進行通電,通電後1s能夠鬆開Key。 每當須要發送一條AT數據,都須要重複上面操做

(五)其餘方法解決問題1

1.使用其餘串口工具(未使用)

2.在調試代碼中直接寫入AT指令(測試可用)

#include <SoftwareSerial.h>

SoftwareSerial BT(8,9);

void setup()
{
  //開啓電腦通訊串口,由於HC-05的波特率爲38400,二者通訊保持一致
  Serial.begin(38400);
  BT.begin(38400);

  //告訴電腦,藍牙準備好了
  Serial.println("BT is ready!");
  
  BT.println("AT");
  delay(100);
  BT.println("AT+NAME=HC-05");//命名模塊名
  delay(100);
  BT.println("AT+ROLE=0");//設置主從模式:0從機,1主機
  delay(100);
  BT.println("AT+PSWD=1233");//設置配對密碼,如1234
  delay(100);
  BT.println("AT+UART=9600,0,0");//設置波特率9600,中止位1,校驗位無
  delay(100);
  BT.println("AT+RMAAD");//清空配對列表
}
只須要開始先斷電一次,才能夠進入AT模式,後面不須要斷電操做

注意:只有當藍牙模塊沒有和其餘設備(除了開發板以外)鏈接AT指令纔會執行給藍牙模塊自己,不然會被當成數據發送給其餘設備

三:解決問題2:手機鏈接藍牙後傳輸數據亂碼

(一)緣由:HC-05的默認頻率多是38400,而手機的頻率爲9600,兩種的頻率不一樣,數據傳輸出錯

(二)解決方法:進入AT模式,設置頻率爲9600(如上面的設置)

BT.println("AT+UART=9600,0,0");//設置波特率9600,中止位1,校驗位無

(三)補充部分AT指令(注意:不一樣模塊AT指令不一樣05,06就有所差異)

AT+UART?  查詢波特率
AT+UART=參數1,參數2,參數3 設置波特率,中止位,校驗位

四:案例使用---藍牙點亮小燈

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(11,OUTPUT);
}

char ch;

void loop() {
  // put your main code here, to run repeatedly:
  if(Serial.available()>0)
  {
    ch = Serial.read();
    if(ch=='1')
        digitalWrite(11,HIGH);  //開啓小燈
    else
        digitalWrite(11,LOW); //關閉小燈
    Serial.print(ch);
  }
}
代碼推薦使用SoftwareSerial實現
#include <SoftwareSerial.h>

SoftwareSerial BT(8,9);
char ch;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(11,OUTPUT);
  BT.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  if(Serial.available()>0)
  {
    ch = Serial.read();
    BT.print(ch);
  }

  if(BT.available()>0)
  {
    ch = BT.read();
    Serial.print(ch);
    if(ch=='1')
    {
      digitalWrite(11,HIGH);
      BT.println("Command: LED ON");
      delay(5);
    }
    else
    {
      digitalWrite(11,LOW);
      BT.println("Command: LED OFF");
      delay(5);
    }
  }
}

五:Arduino無線藍牙模塊HC06安卓應用Arduino Bluetooth Controller下載(百度網盤)《或者手機應用下載藍牙串口》

相關文章
相關標籤/搜索