延續上一篇貼文,本文將補充藍牙模組的AT命令模式與設定方法。
藍牙模組的兩種操作模式
- 自動連線(automatic connection),又稱為透通模式( transparent communication)。
- 命令回應(order-response),又稱為AT模式(AT mode)。
平時使用的「自動連線」模式只是把RxD腳傳入的資料,轉成藍牙無線訊號傳遞出去;或者將接收到的無線資料,從TxD腳傳給Arduino,模組本身不會解讀資料,也不接受控制。
操控藍牙模組的指令統稱AT命令(AT-command)。AT命令並非透過藍牙無線傳輸,而是模組的TxD和RxD接腳。藍牙模組只有在AT模式,才能接收AT命令。
HC-05與HC-06藍牙模組進入AT模式的方法
HC-06模組在與其他裝置連線之前,都處於AT模式狀態;換句話說,只要一通電,HC-06模組就進入AT模式。HC-06的AT命令,採用9600bps的速率傳送。
通電後,在尚未與裝置連線之前,HC-06板子上的LED將不停地閃爍;一旦與其他藍牙裝置連線(如:手機或電腦),LED將維持點亮狀態。
讓HC-05模組進入AT模式,需要在通電之前,先把KEY腳位(藍牙模組本身的34腳)接在高電位(通常指3.3V,但是接5V也行)。如此,一通電,它就進入AT模式。
在尚未與裝置連線之前,HC-05板子上的LED將快速閃爍;若進入AT模式,LED將慢速閃爍(兩秒閃爍一次)。HC-05的AT命令,採用38400bps的速率傳送。
筆者購買的HC-05板子上面有一個按鍵,根據廠商提供的電路,這個按鍵接在藍牙模組的34腳:
所以先按著板子上的開關,再通電,即可讓此藍牙模組進入AT模式(通電之後,即可放開開關)。
HC-06模組的AT命令
根據廠商提供的AT命令說明書,筆者購買的HC-06藍牙模組支援下列AT指令(這個模組規定,AT命令一定要大寫,有些模組不區分大小寫):
常用的AT指令有兩個:
- AT+NAME:設定模組的識別名稱。
- AT+PIN:更改配對密碼。假如你不想讓其他人輕易地連接到你的藍牙裝置,可以透過這個AT命令修改配對密碼。
HC-06模組的預設名稱就是“HC-06”,於多人、多組藍牙一起實驗的場合,在電腦或手機上探索藍牙裝置時,將會發現許多叫做“HC-06”的裝置。
為了方便實驗者連接到自己的藍牙設備,可以事先用AT命令替每一個模組設定不同的名字,例如,bt01, bt02, bt03,…(註:一般最多允許32個英∕數字)。
透過Arduino的序列埠設定藍牙模組的AT命令
除了使用現成的USB轉TTL序列模組來設定AT命令(請參閱「執行AT命令(AT-command)修改藍牙模組的資料傳輸速率」),也能使用Arduino板來操作。
本節將撰寫一個簡易程式,把我們在電腦上敲入的AT命令,轉發給接在Arduino上的藍牙模組。
同樣地,藍牙模組的回應訊息也會轉發到電腦的序列埠。請編譯底下的程式並上傳到Arduino板:
#include <SoftwareSerial.h> // 引用程式庫 // 定義連接藍牙模組的序列埠 SoftwareSerial BT(8, 9); // 接收腳, 傳送腳 char val; // 儲存接收資料的變數 void setup() { Serial.begin(9600); // 與電腦序列埠連線 Serial.println("BT is ready!"); // 設定藍牙模組的連線速率 // 如果是HC-05,請改成38400 BT.begin(9600); } void loop() { // 若收到「序列埠監控視窗」的資料,則送到藍牙模組 if (Serial.available()) { val = Serial.read(); BT.print(val); } // 若收到藍牙模組的資料,則送到「序列埠監控視窗」 if (BT.available()) { val = BT.read(); Serial.print(val); } }
在HC-05與HC-06藍牙模組上執行AT命令
程式上傳完畢後,開啟Arduino的「序列埠監控視窗」,HC-06模組的AT指令不需要加上行結尾字元,下圖是執行“AT+VERSION”命令,查看韌體版本的結果:
下圖是執行“AT+NAMEsix”,將模組的識別名稱改成“six”的結果:
HC-05模組的AT指令需要加上\n\r行結尾,下圖是執行“AT+VERSION”命令,查看韌體版本的結果:
根據廠商的AT命令參考手冊,此HC-05模組有個查閱識別名稱的命令:“AT+NAME?”,然而,我手上這個模組對此命令沒有反應。但是從Windows 7的藍牙「新增裝置」畫面看得出,此藍牙模組的預設名稱是“HC-05”:
HC-05模組修改識別名稱的AT命令是:”AT+NAME=識別名稱”,設定成功後,它將傳回“OK”,將模組識別名稱改成“five”的操作畫面如下:
再次於Windows 7系統執行藍牙「新增裝置」,可看到模組的名稱已經改變了:
老師您好..
我幾乎照著你的程式寫著,利用手機藍芽與電腦talk,都正常,但為何下任何AT COMMAND都無回覆結果出來,指是一樣畫葫蘆顯示我鍵入AT…,我確定我藍芽時模組是HC-05,5,終端機行結尾也設CRLF,就是得不到AT COMMAND回覆結果.我順便秀出程式碼如下:
//////////////////////////////////////////////////////////////////////////////////////////////////
//本程式 主要測試 HC-05 設備傳輸與接收
#include
// 定義連接藍牙模組的序列埠
SoftwareSerial BT(9, 10); // 接收腳, 傳送腳
void setup() {
Serial.begin(56700); // 與電腦序列埠連線
Serial.println(“BT is ready!”);
// 設定藍牙模組的連線速率
// 如果是HC-05,請改成38400 <=好像寫錯了.應該還是9600
BT.begin(9600);
}
void loop() {
// 若收到「序列埠監控視窗」的資料,則送到藍牙模組
char c; String s;
if (Serial.available()) {
/*s = Serial.readString(); BT.print(s);*/ //ok
/**/c = Serial.read();BT.print(c); //ok
}
// 若收到藍牙模組的資料,則送到「序列埠監控視窗」
if (BT.available()) {
/*s = BT.readString(); Serial.print(s);*/ //ok
/**/c = BT.read();Serial.print(c); //ok
}
}
抱歉,我找到問題了.原來我HC-05板上的按鈕是有作用的(設計好像太麻煩了).
在此也說明:
HC-05進入TA COMMAND.若遇有按鈕,則步驟如下
1:先拔掉 Arduino 的 USB 線,也拔掉 HC-05 VCC 和 Arduino 5V 相連的這條線。並將HC-05的KEY引腳接至Arduino 板上的3.3或5V電位.
2:將 Arduino 的 USB 線插入電腦。
3:先按下HC-05板上的按鈕不放.然行將HC-05 VCC 和 Arduino 5V 相連,
約1秒左右放掉HC-05板上的按鈕,此時HC-05板上的燈約2秒鐘閃一次.就代表進入TA COMMAND模式了.
感謝告知!
thanks,
jeffrey
老師你好,請問為甚麼我設定藍芽鮑率為9600但常常會跳到其他鮑率去?
如果不是其他程式造成的,那就用它預設的鮑率連線吧~
thanks,
jeffrey
老師你好:
我想做一個藍牙控制小車,當藍牙連接斷線的時候自動連接,請問大致應該怎麼編程?
配置是MEGA 2560,HC05模塊
藍牙小車屬於被控制的「客戶端」,偵測藍牙連線是否中斷以及重新發起連線的工作在手機App上。假設你採用PhoneGap/Cordova編程,Cordova的BluetoothSerial插件的connect(連接)方法最後一個參數是「連接失敗回調函數」,亦即,該函數被調用時,就代表連線中斷了,你可以在該函數裡面做相應的處置。
thanks,
jeffrey
老師你好 ,我照著你的程式範例操作 我的HC-05模組也進入AT模式,打開序列埠監控視窗後 輸入AT+NAME? 卻都沒反應。 為何用手機也無法搜尋到此藍芽模組
手機端我有去下載 Bluetooth SPP 用此程式搜尋 也都搜尋不到 請老師替我解答 謝謝
正常情況下,藍牙模組只要一通電,就能讓手機或電腦搜尋到。你方便跟同學或朋友借用另一個模組測試比對嗎?
thanks,
jeffrey
你hc05的後面是不是寫EN而不是Key 如果是的話代表你沒接EN
非常感謝kevin的補充~
thanks,
jeffrey
老師你好,看過您撰寫的書後,我們希望能夠改變藍芽模組聯結APP之間的傳輸距離,向老師您請教一下,我們該從手機程式著手還是藍芽模組著手呢?
藍牙主要是為了「個人區域網路」而被發明出來,原本的設計就是應用在短距離通訊,如果要長距離的話,藍牙5.0的理論通訊距離達300公尺,但多數裝置都不支援藍牙5.0。
若是為了長距離傳輸,你可以考慮Wi-Fi, 3G或其他無線通訊方案,像NRF24L01(通訊距離可達100公尺)或者LoRa(距離可達數公里)。
thanks,
jeffrey
我買副廠的HC 05的AT指令是這樣:
AT+NAME? 查看名字
AT+NAME=** 設名字
AT+PSWD? 查看密碼
AT+PSWD=**** 設密碼 ****
我試了一下才發現的~
感謝分享!
thanks,
jeffrey
老師你好我有看過你寫的書
所以我想做一個藍芽模組與手機app
結合的防盜裝置可是藍芽模組的連線範圍都超過3米
可是我們只需要1米的連線範圍
所以請問我們要怎麼把連線範圍超過3米的藍芽模組設定成我們需要的範圍呢?還是說要從手機app程式來設定?
藍牙電波訊號強弱跟無線電訊號放大電路和天線設計有關,藍牙模組本身應該沒有調整訊號強弱的指令。不過,削弱訊號總比增強訊號容易多了…用銼刀把藍牙板子上的天線磨掉一半看看…磨壞了不要怪我喔~
thanks,
jeffrey
老師您好^^
我是使用 arduino uno 接hc-05藍芽模組
uno以usb接到電腦
照著老師的方式 我能讓我的電腦搜尋到hc05並且能輸入密碼新增此裝置
新增完後 我用matlab 連接藍芽
我輸入 instrhwinfo(‘Bluetooth’) 到matlab裡
結果都是:
RemoteNames: {8×1 cell}
RemoteIDs: {8×1 cell}
BluecoveVersion: ‘BlueCove-2.1.1-SNAPSHOT’
JarFileVersion: ‘Version 3.9’
Access to your hardware may be provided by a support package. Go to the Support Package Installer to learn more.
我也去support package 找有沒有適合的藍芽模組package,安裝了幾個試試看,結果還是一樣,所以我就在想是不是因為電腦和藍芽根本沒有連接
所以我去查一下 我這組藍芽 可以新增裝置 但電腦跟此藍芽模組都會一直連不上
請問連不上是正常的嗎? 是可以新增裝置就好 還是還要連上呢?
不好意思打擾老師了 再麻煩老師了~~ 謝謝您~
小尹謹致
拍謝,我沒用過matlab,你可以先用序列通訊軟體測試藍牙模組是否能正常通訊。
thanks,
jeffrey
老師您好,我在嘗試對 HC-05 使用 AT 命令時遇到奇怪的問題。
首先我是 Arduino Pro Mini (5V) 连接 HC-05,定义 PIN 3 为 RX 连接 HC-05 的 TX,PIN 4 为 TX 连接 HC-05 的 RX,中间使用了一个 3.3V – 5V 的电平转换。我长按 EN 的按钮后给 HC-05 通电,让其进入 AT 模式,此时 LED 两秒一闪。
然后我用 Arduino IDE 开了个终端能看到 `BT is ready!` 的输出,输入 `AT\r\n` 能得到 `OK` 的返回,但是输入 `AT+VERSION?\r\n` 却得到了 `ERROR:(0)` 的返回。我又尝试了其他命令比如 `AT+ROLE?\r\n`或 `AT+NAME?\r\n` 都得到了相同的报错。但是在 PuTTY 中却可以通过输入 `AT+VERSION?` 而获得 `+VERSION:2.0-20100601
OK` 的结果,但结果会不停重复,只能手动停止。
代码如下:
#include
SoftwareSerial BT(3, 4);
char val;
void setup() {
Serial.begin(115200);
Serial.println(\”BT is ready!\”);
BT.begin(38400);
}
void loop() {
if (Serial.available()) {
val = Serial.read();
BT.print(val);
}
if (BT.available()) {
val = BT.read();
Serial.print(val);
}
}
望指教
老师您好,我想通过蓝牙模块将电脑上的程序无线导入到arduino里,可以实现吗
請參閱「HC-05藍牙模組補充說明(五):透過藍牙上傳Arduino程式碼」。
thanks,
jeffrey
老师您好,我AT+NAME输进去没有反应,怎么办?
如果输入AT,蓝牙模快有回应OK,AT+NAME没有反应的话,你可以向商家索取模块的文档,查阅它的AT命令集。
thanks,
jeffrey
老师,我AT输进去也没有反应
你确定蓝牙模块有进入AT模式吗?也请换个速率看看。
thanks,
jeffrey
老師您好
我是使用 arduino MEGA 2560 接hc-06藍芽模組
有配對可是沒有連線
手機是HTC A9
請問要怎麼解決
請問你有在mega 2560上實驗過有線序列埠通訊嗎?
thanks,
jeffrey
老师,请问想要实现一主多从的蓝牙模块间通讯该怎么编程比较好?
我目前想的是在程序中反复切换从机地址,与主机配对再断开,但这样会不会效率太低了?
嗯,根本原因是固件不支持一对多通信…
thanks,
jeffrey
老師您好:
我手機裝置一直搜尋不到藍芽,請問要怎麼確認我的藍芽有傳出?
藍牙模組只要通電,無需接其他電路就可以配對,請借用其他手機測試配對看看;如果還是不行,那恐怕是模組本身有問題。
thanks,
jeffrey
老師你好 我輸入程式arduino下面有Sketch uses 6,828 bytes (23%) of program storage space. Maximum is 28,672 bytes.
Global variables use 278 bytes (10%) of dynamic memory, leaving 2,282 bytes for local variables. Maximum is 2,560 bytes.
我用的是pro micro的arduino
打開查看的時候輸入AT 按 send的時候arduino就當掉了
我目前手邊沒有Pro Micro,不過,從Arduino Micro的說明文件看來(這一款和Pro Micro的處理器都是ATmega32U4),它的0 (RX)和1 (TX)腳是個獨立於USB的序列埠,叫做Serial1,所以你的程式並不需要使用SoftwareSerial。
修改後的程式如下,藍牙模組接在0和1腳:
thanks,
jeffrey
老師你好 想請問一下 我使用的是 藍芽4.0 DX-BT05 主從一體的藍芽模組
我把腳位設成PIN10跟P11,其他的程式都跟上面一樣
為什麼打了指令之後都沒有顯示什麼東西呢??
請老師解答一下 ,謝謝謝謝!
因為藍牙4.0和本文使用的藍牙2.1模組的通訊協定不同,請使用HC-05或HC-06模組來練習本文的實驗。
thanks,
jeffrey
老師, 您好!
請教一下, 我改用的也是 arduino DUE 這塊板子, 原本是用 Mega2560 因為需要 4 個 UART, 所以藍牙是使用 SoftwareSerial, 但此模組無法使用在 DUE (非 AVR), 是否在 DUE 有替代方案能使用第 5 個 UART 來用在藍牙?
我手邊沒有DUE,請使用soft_uart程式庫測試。
thanks,
jeffrey
感謝老師, 老師辛苦了!
測試 soft_uart 程式庫, 可用在 DUE 的藍牙傳輸. OK, thanks.
感謝告知!
thanks,
jeffrey
HI kennny,
can you share how soft_uart and HC 05 works together with DUE?
HC-06打「AT」有顯示「OK」 打「AT+VERSION」 也有顯示出「VERSION:3.0-20170609」
但是其他指令就只會顯示「ERROR:(0)」
求解QQ
新的HC-06韌體的AT命令語法,似乎改用HC-05語法。請在序列埠監控視窗的行結尾選項設定成”NL & CR”試試,更換鮑率的指令,改用「執行AT命令(AT-command)修改藍芽模組的資料傳輸速率」提到的 “AT+UART=鮑率,停止位元,同位(parity)位元” 語法。
另外,也請嘗試聯絡廠商提供3.0版韌體的AT命令文件。
thanks,
jeffrey
好的 謝謝
老師您好!
我是arduino nano 的板子,接完輸入AT+NAME?有出現HC-05的名字(這是我改的),但我的手機跟電腦通通都收尋不到HC-05藍芽,想請問如何解決?
如果接上電源,其他接腳都不接的情況下,電腦和手機都搜尋不到藍牙模組,我會假設它故障了…
thanks,
jeffrey
老師您好~我想要使用藍芽模組傳遞模擬鍵盤一個按鍵或者是滑鼠左鍵的訊號給電腦(UNITY)
在書中是不是有哪個章節可以參考?我該如何下手呢?
本文和書本提到的藍牙模組採用的是「序列通訊」協定,不支援鍵盤、滑鼠等人機介面。
之前有讀者提到Unity具有序列通訊的外掛,你可以嘗試用它來連接此藍牙模組。
thanks,
jeffrey
老師你好,我試著用手機的Serial Bluetooth Terminal這個App經藍芽傳值到Arduino並顯示在串列監控視窗上,基本上都跟老師的程式碼一樣,以下是loop中的程式
if (BT.available()) {
c = BT.read();
Serial.println(c);
}
但是當我傳送資料時,監控視窗都是�,我改宣告c為int,想看他的值,發現都是242,一直不知道哪裡出問題了,希望老師能指點一下QQ
處理藍牙序列資料的程式邏輯,和其他序列介面相同,請參閱《超圖解Arduino》書本10-9頁「透過序列埠調整燈光亮度」以及11-17頁的「在I2C介面上傳送整數資料」單元的解說和程式。
thanks,
jeffrey
老師您好 想請問為何 此程式無法執行AT指令
setup是一樣的 loop如下
void loop() {
int i=0;
data=digitalRead(7);
//delay(100);
if(data==HIGH)
{
i=1;
//Serial.println(i);
}else
{
//Serial.println(i);
}
BT.print(i);
// 若收到「序列埠監控視窗」的資料,則送到藍牙模組
if (Serial.available()) {
val = Serial.read();
BT.print(val);
}
// 若收到藍牙模組的資料,則送到「序列埠監控視窗」
if (BT.available()) {
val = BT.read();
Serial.print(val);
}
}
請問老師
BT.print(i);
代表什麼呢
我用藍芽連上後用port40監控視窗看
可以像serial.print一樣
關於序列埠的指令和操作說明,請參閱5-17頁。
thanks,
jeffrey
大神救命!!
我的06都不理我,我看了版子確定他有接收到訊息
可是他沒有回傳東西到窗口
P.S.我用的是MAGA 2560
PIN腳改成(19,18)也就是板子上寫的(RX1,TX1)
真的感謝您這種好人
現在很多人都只會打嘴砲了= =
關於MEGA 2560的序列埠通訊程式,請參閱這一篇以及這一篇留言。
thanks,
jeffrey
老師你好:
想請問一下如果想要利用藍芽撥放SD卡的音樂檔案,我們沒有大喇叭,只有藍芽的音響跟手機可以使用,想請問有什麼方式可以用?
不太理解你的問題…你是需要能夠透過藍牙播放音樂的模組?還是需要大功率輸出音樂?
thanks,
jeffrey
請問為甚麼有些指令下了會回覆OK 有些指令不會
到了隔天不管下甚麼指令都沒有回覆OK 連藍芽都連不到
藍牙模組的AT命令會因韌體版本而有所不同,請先確認版本,再搜尋相關AT命令規格書,或者跟經銷商索取。
thanks,
jeffrey
老師你好:
輸入AT+RESET ,回應OK後,會跳開AT模式,藍芽LED 變快閃,..底下設定就無法做了, ,不知怎回事?
咦?設定參數之前並不需要先Reset。
thanks,
jeffrey
老師您好,我想請教一下Hc08板應該如何進入at模式呢?
因為是有按鈕的,我跟著hc05的做法也不行。
HC-08和HC-05是完全不同的東西,請參閱「HC-08 蓝牙串口通信模块用户手册 V2.3」
thanks,
jeffrey
老師您好,我手頭有一片板子,已經進入at模式,你說要將EN PIN 接高電位,我把它接到3.3V去
上電前按住板子按鈕持續2sec,燈已由快閃變成慢閃,使用access port 軟體,執行AT+UART?
都沒有反應,老師你有HC05操作手冊嗎,我可以對一下問題出在那!!!
請搜尋關鍵字”HC-05 AT指令集”就能找到了。
thanks,
jeffrey
我有試過都無反應,問題可能在那
如果傳入AT,它有回應OK,但是其他命令沒有反應,那你應該跟賣家索取該模組的AT命令手冊。
假如連AT都沒有回應,請嘗試不同的連線速率,例如:9600, 38400和115200等等。
thanks,
jeffrey
老師您好,我用HC-05並將EN腳位接上3.3V,之後用AT+INIT命令再用AT+INQ命令後,為什我收到的RSSI值一直都是7FFF?
您好 請問要如何將藍芽設定成無密碼?
在透過AT命令連結(bind)兩個藍牙模組的情況下,連接時不需要設定密碼,其他情況我就沒測試過是否能不輸入密碼。
thanks,
jeffrey
老師您好,我使用的藍芽模組是HC05(有EN),我有成功進入AT模式,但總是無法在電腦和手機上搜尋到藍芽,請問要成功搜尋到藍芽需要哪幾個步驟? (需要更改主從端嗎)
請執行 AT+ORGL 命令,讓藍牙模組恢復到出廠的預設狀態值。若通電(只接電源腳)仍無法被搜尋,我會假設那個模組故障了。
thanks,
jeffrey
老師你好 ,我使用HC-05,電源是 2顆18650串聯>>兩組L298N馬達驅動器>>其中一組L298N的5V輸出接到HC05。為何使用10秒不等時會和手機斷線呢??
你有嘗試過其他電源接線方式嗎?例如,18650串聯後接降壓電路板再接藍牙模組。
thanks,
jeffrey
老師你好 我的藍芽模組hc-06
照著書(第二版)做後 有顯示bt is ready 並可以被手機連結 但輸入1,0都沒反應 燈快閃
後來照著以上網頁做 序列埠監控視窗可顯示BT is ready! 也可被手機連結 但輸入AT+VERSION等指令都音訊全無 燈快閃變常量
擔心會不會是一開始做時 接收端,輸出端弄反
請問老師可能要如何檢測或改進呢?
執行AT命令時,需要讓模組進入AT命令狀態,平時它是在「透傳」模式。
輸入1, 0沒有反應,請先把輸出1, 0字元的print()或println()改成write(),
或者TX和RX接腳對調試試。
thanks,
jeffrey
老師您好
在應用HC06做控制的時候
明明手機還沒傳輸但是就會有資料出現
然後試著從手機端傳輸會收不到訊息
藍芽讀取後接著要執行的code是比較長
如果註解掉所有剩下藍芽接收訊息的部分就可以順利讀取
所以是code執行時間太長的影響嗎?
這種問題想請問該怎麼解決
註解的長短不會影響程式碼,應該你的程式碼本身有問題。
thanks,
jeffrey
老師您好,想請教藍牙模組能否傳送指定的.jpg檔案到手機?
這個模組用於傳送文字訊息;若要傳送非文字訊息,你要自行將它編碼成文字,接收端再解碼還原。
thanks,
jeffrey
老師您好 我由app inventor設計app(4個按鈕 分別傳4個text)傳text到藍芽模組hc05上 arduino程式是照著老師的做但是在serial monitor中顯示了問號 每個text有不同長度的問號組成 可以請教為什麼會這樣嗎
請把這段程式:
改成底下這樣試試:
thanks,
jeffrey
老師您好,我在使用藍芽HC-06遇到了一些問題,例如:對AT指令毫無反應(已確認程式並無問題,並且嘗試過每種包率),常常在一連串指令後當機,並導致手機也跟著當機(已在程式裡加delay),或是容易斷線
請問是否有其他方式能檢測藍芽是否損壞?
若對藍牙設備有疑慮,我是直接換一個測試。
thanks,
jeffrey
老師您好,我已經買了另一個HC-06,但還是有非常容易斷線的問題,有甚麼解決方法嗎?
所以…應該不是藍牙模組的問題…請問你為何要頻繁寫入AT命令?
我用AT指令是來測藍芽好壞,我的藍芽用途只是接收字元而已
如果是傳送字元,我在使用上沒遇過問題…
thanks,
jeffrey
老師你好,我的裝置都沒什麼問題,但輸入AT就是沒回應,請問如何解決
沒事了,謝謝老師,忘記改鮑率