HC-05與HC-06藍牙模組補充說明(三):使用Arduino設定AT命令

延續上一篇貼文,本文將補充藍牙模組的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模組就進入AT模式。

通電後,在尚未與裝置連線之前,HC-06板子上的LED將不停地閃爍;一旦與其他藍牙裝置連線(如:手機或電腦),LED將維持點亮狀態。

讓HC-05模組進入AT模式,需要在通電之前,先把KEY腳位(藍牙模組本身的34腳)接在高電位(通常指3.3V,但是接5V也行)。如此,一通電,它就進入AT模式。

先把HC-05的KEY腳位(藍牙模組本身的34腳)接在高電位,進入AT模式。

在尚未與裝置連線之前,HC-05板子上的LED將快速閃爍;若進入AT模式,LED將慢速閃爍(兩秒閃爍一次)。HC-05的AT命令,採用38400bps的速率傳送。

筆者購買的HC-05板子上面有一個按鍵,根據廠商提供的電路,這個按鍵接在藍牙模組的34腳:

HC-05模組按鍵的電路

所以先按著板子上的開關,再通電,即可讓此藍牙模組進入AT模式(通電之後,即可放開開關)。

HC-06模組的AT命令

根據廠商提供的AT命令說明書,筆者購買的HC-06藍牙模組支援下列AT指令(這個模組規定,AT命令一定要大寫,有些模組不區分大小寫):

HC-06模組的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的序列埠設定藍牙模組的AT命令

同樣地,藍牙模組的回應訊息也會轉發到電腦的序列埠。請編譯底下的程式並上傳到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”命令,查看韌體版本的結果:

查看HC-06模組的韌體版本

下圖是執行“AT+NAMEsix”,將模組的識別名稱改成“six”的結果:

更改HC-06模組的識別名稱

HC-05模組的AT指令需要加上\n\r行結尾,下圖是執行“AT+VERSION”命令,查看韌體版本的結果:

查看HC-05模組的韌體版本

根據廠商的AT命令參考手冊,此HC-05模組有個查閱識別名稱的命令:“AT+NAME?”,然而,我手上這個模組對此命令沒有反應。但是從Windows 7的藍牙「新增裝置」畫面看得出,此藍牙模組的預設名稱是“HC-05”:

Windows 7的藍牙「新增裝置」畫面

HC-05模組修改識別名稱的AT命令是:”AT+NAME=識別名稱”,設定成功後,它將傳回“OK”,將模組識別名稱改成“five”的操作畫面如下:

更改HC-05模組的識別名稱

再次於Windows 7系統執行藍牙「新增裝置」,可看到模組的名稱已經改變了:

Windows 7的藍牙「新增裝置」畫面

延伸閱讀

Posts created 468

217 thoughts on “HC-05與HC-06藍牙模組補充說明(三):使用Arduino設定AT命令

  1. 你好,我想請問:我用的是arduino DUE這塊板子,不過似乎相容的IDE 1.5.8 BETA ,似乎無法使用 SoftwareSerial這個程式庫,請問有甚麼可以解決的辦法嗎?

    1. hi 小施:

      Arduino Due控制板內建4個序列埠(請參閱Arduino Due的官方產品頁說明),因此不太需要用到SoftwareSerial程式庫。內建的序列埠識別名稱與腳位分別是:

      • Serial: 0(接收)和1(傳送)
      • Serial1: 19(接收)和18(傳送)
      • Serial2: 17(接收)和16(傳送)
      • Serial3: 15(接收)和14(傳送)

      序列埠程式的寫法都一樣,只是更換識別名稱罷了,例如,底下的敘述將能初始化Serial2,並輸出 “hello”字串:

      Serial2.begin(9600);
      Serial2.println("hello");
      

      thanks,
      jeffrey

    2. 你好,我了解老師的意思了,謝謝老師~
      我是arduino的新手,想請問如果把老師提供的範例code使用在DUE這塊板子上,要如何修改呢?

    3. 假設藍牙模組接在Arduino Due的Serial 2(16和17腳),請上傳底下的程式測試看看:

      char val;  // 儲存接收資料的變數
      
      void setup() {
        Serial.begin(9600);   // 與電腦序列埠連線
        Serial.println("BT is ready!");
      
        // 設定藍牙模組的連線速率
        // 如果是HC-05,請改成38400
        Serial2.begin(9600);
      }
      
      void loop() {
        // 若收到「序列埠監控視窗」的資料,則送到藍牙模組
        if (Serial.available()) {
          val = Serial.read();
          Serial2.print(val);
        }
      
        // 若收到藍牙模組的資料,則送到「序列埠監控視窗」
        if (Serial2.available()) {
          val = Serial2.read();
          Serial.print(val);
        }
      }
      

      thanks,
      jeffrey

    4. 赵老师,您好,我同样是采用的ARDUINO DUE这款板子,HC 05模组同您的是一样的,按住按钮进去AT MODE.之前找了很多资料,但AT MODE仍旧还是调试不通,输入AT 指令什么都不能返回。请问大约是哪方面的问题呢?

    5. 有没有可能是蓝牙模块,连接34脚和Vcc的按键故障或者焊接不良呢?不知你是否有用电表测量过,当按键按下时,第34脚和Vcc是相连的;倘使Key脚有和Vcc相连,但却无法进入AT模式,那我就不知问题出在哪儿了…

      thanks,
      jeffrey

  2. 你好!!
    首先先稱讚你這本書寫的真的粉好~~

    再來就是我遇到的問題了~~
    我手邊有的藍芽模組與課本上的不一樣
    是HM-12系列的~~
    但我就是不知道該怎麼進入AT模式~~
    在網路上我是有找到相關的規格說明書~~
    但還是沒有用~~

    不知大大是否有相關的方法可協助~~

    1. hi 小宇:

      感謝你的讚賞~

      我找到的HM-12藍牙模組資料來自這一家公司,根據他們的技術文件說明,模組的預設鮑率是115200,KEY腳位於模組的23腳、AT指令需大寫、指令後面不加 \r\n 字元。

      我手邊沒有這個模組,所以無法實際測試…

      thanks,
      jeffrey

  3. 請問我用可變電阻輸入UNO藍牙送出PWM,
    再用另一片UNO藍牙接收PWM輸出LED.
    接收會顯示ascii為什麼?

    1. hi lin:

      PWM的數值範圍是0~1023,請問你有將PWM數據拆成兩個byte傳送嗎?你可以參閱11-16頁「動手做11-3」傳送整數資料的說明,並改寫程式碼。

      have fun!
      jeffrey

  4. 你好:

    想請問一下,我買的也是與你相同型號HC-06,當我在Arduino的「序列埠監控視窗」,下達“AT+VERSION”命令,查看韌體時,監控視窗沒有任何回應,其他命令也都沒有任何回應.

    請問這是那理要注意的呢!

    1. hi chen:

      若只輸入”AT”也沒反應嗎?請跟廠商索取規格書,確認進入AT命令模式的方法。

      thanks,
      jeffrey

    2. 謝謝老師的回覆,

      請問老師會再出進階的應用書籍嗎?
      如果有或計劃中是否能告知.
      謝謝.

  5. 老師你好:
    我有個問題,老師能幫我解下列疑惑
    關於第一板書中10-40頁,表10-7頁,我從網路下載TIP120 DataSheet

    Symbol Parameter Test Condition Min. Typ. Max. Units
    VBE(on) * Base-Emitter On Voltage VCE = 3V, IC = 3A 2.5 V

    我理解的當:VCE=3V,IC=3A, VBE最大MAX=2.5V, 如果VCE不是此條件時,VBE還會是2.5V?
    我不知我這樣理解有錯?

    1. hi jxchen:

      TIP120電晶體的規格書第3頁的「典型特性(Typical characteristics)」單元,右上角有一張這樣的圖表:

      TIP120 Vce, Vbe, Ic

      垂直線條是Vbe和Vce的電壓值,水平線條是Ic的電流值,從中可看出Vbe和Vce會隨著Ic電流值增減。例如,當Ic為3A時,Vce約1V;Ic為0.4A時,Vce約0.75V。

      thanks,
      jeffrey

  6. 趙老師您好:

    在本範例中,我使用UNO板時,測試都正常.
    但當我換成MEGA2560時,程式為什麼就不能用呢?

    1. 趙老師:

      MEGA2560 port number如下:
      Serial 1: 19 (RX) and 18 (TX); Serial 2: 17 (RX) and 16 (TX); Serial 3: 15 (RX) and 14 (TX).

      所以我有改寫成以下設定值:
      SoftwareSerial BT(19, 18); // 接收腳, 傳送腳

      其他沒變,但仍是無法運作,是否還有那裡要修正呢?

    2. hi chen:

      MEGA2560板子上的serial1, serial2和serial3,並不需要透過SoftwareSerial程式庫引用。
      就像UNO預設的Serial一樣,直接引用即可:

      void setup() {
        Serial1.begin(9600);  // 初始化Serial1
        Serial1.println("hello");  // 透過Serial1傳出字串
      }
      

      thanks,
      jeffrey

  7. 趙老師:

    您在書本第十二章中有提到irsend.sendRaw()的使用,
    我依書中所提的方式,搖控家中DVD播放器時可順利開關機.

    但當我想搖控家中HITACHI冷氣時,卻無法順序啟動,這是那裡出現問題呢?

    unsigned int AIRpowerRec[]={3400,1650,500,1200,450,450,500,400,500,450,450,500,450,450,450,450,500,450,450,450,500,450,450,450,500,450,450,1200,450,450,500,450,450,450,500,450,450,450,500,450,450,450,450,450,500,450,450,450,500,450,450,450,500,400,500,450,500,450,450,450,450,450,500,1200,450,450,500,1150,500,1200,500,1200,450,1200,450,1200,500,1150,500,450,500,1200,450,1200,500,1200,450,1200,500,1150,500,1200,450,1200,500,1200,450,1200,500};

    irsend.sendRaw(AIRpowerRec,99,38);
    是載波頻率指定錯了嗎?

    1. 因為各家廠商採用的紅外線載波頻率和通訊格式都不盡相同,我也不確定,但是你可以參考一下這個留言

      good luck!
      jeffrey

  8. 老師您好

    剛開始接觸Arduino,也拜讀了老師的書,寫得很好受益良多。
    關於藍芽的應用有些問題想請教。
    裝置:
    Arduino UNO板
    Microchip提供的藍芽模組 Arduino擴充板 APP-ESS14-2
    (datasheet :http://www.microchip.com.tw/Data_CD/EVM%20Board/APP-ESS14-2.zip )
    廠商有提供一段code是用在uC32的板子上 如下。
    看書上提到UNO板只有一個序列埠,使用這塊APP-ESS14-2擴充板是否需要使用SoftwareSerial程式庫?
    老師可以指導一下,如何寫一個簡單個code與這塊APP-ESS14-2板子溝通嗎?
    感謝老師!

    #define KitLED 2 // APP-ESS14-2 : D8
    #define KitWakeupHardware 11 // APP-ESS14-2
    #define KitWakeupSoftware 12 // APP-ESS14-2
    #define CMD_MLDP 13 // APP-ESS14-2

    void setup()
    {
    pinMode(PIN_LED1, OUTPUT);
    pinMode(PIN_LED2, OUTPUT);
    pinMode(KitLED, OUTPUT);
    pinMode(KitWakeupHardware, OUTPUT);
    pinMode(KitWakeupSoftware, OUTPUT);
    pinMode(CMD_MLDP, OUTPUT);
    Serial1.begin(115200);
    }

    void loop()
    {
    digitalWrite(KitWakeupHardware, HIGH);
    digitalWrite(KitWakeupSoftware, HIGH);
    digitalWrite(CMD_MLDP, LOW);
    Serial1.print(“SF,2\r\n”);
    Serial1.print(“SR,30000800\r\n”);
    Serial1.print(“R,1\r”);
    digitalWrite(CMD_MLDP, HIGH);

    while(1)
    {
    digitalWrite(PIN_LED2, HIGH);
    digitalWrite(KitLED, HIGH);
    delay(500);

    digitalWrite(PIN_LED2, LOW);
    digitalWrite(KitLED, LOW);
    delay(500);
    Serial1.print(“This Message from ChipKIT uC32!\r\n”);
    }
    }

    1. hi percent:

      我看了那塊藍牙板的電路圖,藍牙晶片的RX和TX接腳,分別位在CON1插座的5和6腳,所以你可以透過SoftwareSerial程式庫連接這兩個腳位,進行藍牙序列通訊。

      thanks,
      jeffrey

    2. 老師您好
      謝謝您的回覆。
      剛剛有詢問廠商,廠商說這塊擴充板的工作電壓為3V,無法直接搭接在UNO板上,而要搭接在UNO 32的板子上。

      如果我還是想要使用UNO板去控制這塊藍芽擴充板,可以直接從UNO的3.3V輸出給藍芽擴充板的CON4插座上的2腳,UNO板的GND給藍芽擴充板的CON4插座上的3腳嗎?
      然後再把藍牙晶片的RX和TX接腳 接給UNO,這樣進行藍芽序列通訊嗎?

    3. 你購買的藍牙擴充板的工作電壓是3.3V,可以接UNO的3.3V接腳;TX腳建議串接一個1K歐姆電阻。

      thanks,
      jeffrey

  9. 請問老師有E-MAil嗎?
    我把你網路上的程式寫到我arduino內部去然後再com8內輸入AT他會出現OK
    但是我控制的程式加入你給的程式輸入AT他就不顯示OK了~~請問何解呢?

    1. AT命令僅用於設定藍牙模組的參數;進行序列通訊時,藍牙模組無法接收AT命令,而且HC-05的AT模式和透通模式採用的傳輸速率不一樣,透通模式通常是用9600bps速率。

      thanks,
      jeffrey

  10. 老師您好:
    我的Mega2560板子上接了很多感應模組,如DHT22 / 人體紅外線感應模組 / 超音波距離感應模組等等,這些感應器的程式碼常會為了取得正確的電壓值或必要的需求,須要使用到delay()的function();這様的結果造成Loop中會有很多段程式碼(感應模組)都在使用delay(),雖然每一段時間都不長,但產生了一個問題.因板子上我有裝一個輕觸按鈕,
    boolean SWbutton1=digitalRead(SW1);
    每當按鈕被按下時, (它的作用為relay on或off),結果都須要在長時間的按下而Loop中的程式碼剛好執行到這行程式碼才會被觸發,是否能像電腦鍵盤輸入一樣,每個被按下的按鍵不管按下的時間長短都不會因Loop尚未執行到而被漏掉的方法呢?

    謝謝

    1. hi chen:

      你可以用比較時間差的方式來避免這個問題,詳細請參閱13-39頁的程式說明。

      thanks,
      jeffrey

  11. 老師您好︰
    我是用MEGA 2560 跟HC-06 (四腳版本) 的,不知為何我的手機寫著已配對,但想按下連線卻沒有反應,HC-06上的LED只是一直在閃…早陣子還是成功連線並以APP傳輸資料…可是現在卻不行,朋友試過用類似Bluetooth Terminal之類的APP卻成功連上,請問老師您知道原因嗎?

    1. hi catherine:

      我覺得要先釐清問題出在哪個環節,如果也可以用電腦連結HC-06並傳送數據,那就得檢查Android端的程式碼;如果可能,也請替換另一個模組測試看看……抱歉沒幫上忙。

      thanks,
      jeffrey

  12. 您好,
    我照著教學步驟來操作
    但是當我輸入AT指令時
    回傳的卻是

    AT 得到回應是 �
    AT+VERSION 回應 �+�˽�Y�.8
    AT+NAMEsix 回應 }�ѹ����
    AT+PIN1234 回應��A%9�

    等等都是亂碼….
    我用電腦藍芽看得到此藍芽裝置
    但是輸入密碼連結後
    一開始電腦顯示已連結,可是HC-06還是一直在閃燈,過幾秒後電腦就顯示未連結了
    使用arduino UNO
    接腳:RXD連第9接腳 TXD連第8接腳
    請問該如何解決呢?

    1. hi yan:

      序列埠監控視窗顯示亂碼,通常是資料傳輸速率錯誤所導致:但是你的藍牙控制板在與電腦連線後,無故斷線,如果不是電腦驅動程式的問題(註:我以前在電腦上連接Wii把手時,就出現過連線問題),那也許是藍牙模組本身是不良品,遇到這種情況,只好拿另一款同規格的模組執行同樣的程式來比對結果。

      thanks,
      jeffrey

  13. 筆者您好:
    敝人是以藍芽HC-06與Arduino UNO連接,
    線路也照文中描述所配置,
    在將Arduino以usb線插入電腦通電後,
    HC-06的LED燈開始閃爍紅燈,
    並且Arduino已上傳您文中所提供的code,
    code中的連線速率均為9600,
    而敝人用Android手機開啟藍芽並搜尋裝置時,
    確實有在清單中看到”HC-06″;
    然而以win7 電腦在”新增裝置”那裡卻一直無法搜尋到HC-06;
    簡而言之就是手機搜的到,電腦卻搜不到的情況,
    請問此問題該怎麼解決,感謝

    1. hi luckycrow:

      假如你的Win7系統無法搜尋到任何藍牙裝置,請嘗試這個老外提供的方法

      1. 按下「開始」,在搜尋欄位輸入”services.msc”。
      2. 按下Enter鍵之後,系統將開啟「服務」工具程式。
      3. 從「服務」程式的主畫面,找到並雙按”Bluetooth Support Service”。
      4. 如果藍牙的「服務狀態」不是「執行中」,請按下「啟動」。
      5. 「啟動類型」選項,選擇「自動」。
      6. 按一下「登入」頁籤,「登入身份」選擇「本機系統帳戶」。

      thanks,
      jeffrey

  14. 我是Arduino超級新手
    有點笨沒有任何基礎,也看不懂原文手冊
    目前在做大學專題,其中一個部分卡住,已經爬了許多文
    還是看不懂或找不到想要的資訊,已經束手無策了,希望
    可以幫忙我一下,雖然問題可能
    很低級哈哈….
    我用Arduino 做藍芽接收
    主是用HC-05 從是HC-06都設定好了 BAUD都是9600
    問題是在我用兩塊Uno傳值接收都正常
    用uno的板和nano的板傳值也正常,唯獨
    把一塊uno改成leonardor(“接收端”)就接收不到了
    有用超極終端機Accessport RS-232 接第三pin Tx接腳
    接一條電線出來插在leonardo的Rx接腳,用監控看一樣收不到值
    因為我要做滑鼠的功能,用uno要進入DFU改韌體那邊我完全不會
    爬文也看不懂,所以找到leonardo 有Mouse的參數,對我來說比較
    好上手,所以我一塊一定要用leonardo的板
    我傳值的程式碼:uno,nano的板子
    ‪#‎include‬
    SoftwareSerial BT(0,1);

    void setup()
    {
    Serial.begin(9600); // 啟動serial通訊埠
    BT.begin(9600);
    }
    void loop()
    {
    BT.println(‘t’);
    //delay(1000);
    Serial.println(‘q’);
    // delay(1000);
    }
    接收端的程式碼:leonardo的板子
    #include
    SoftwareSerial BT(0, 1);
    void setup()
    {
    Serial.begin(9600); // 啟動serial通訊埠
    BT.begin(9600);
    }
    void loop()
    {
    if (BT.available())
    {
    h=(BT.read());
    Serial.println(h);
    }
    }
    }
    有去查過uno跟leonardo的差異
    可是只看到什麼新舊差別或硬體差異
    uno沒有Serial1之類的
    可是也不知道那個是幹嘛的
    希望可以幫我解決
    uno可以藍芽傳值到leonardo的問題
    硬體跟軟體可以詳細地告訴我
    硬體

    1. hi 阿豪:

      1. SoftwareSerial不要設在0和1腳。
      2. Leonardo板子的序列埠通訊程式,請在setup()函式加入底下的while迴圈:

      void setup()
      {
        Serial.begin(9600);
        while (!Serial) {
          ; // 等待序列埠連線
        }
      
        : 其餘的程式碼
      }
      

      thanks,
      jeffrey

    2. 我今天有把接腳改在8,9過了
      至於那個while迴圈我也有試過,只不過我是打while(!Serial1){;}
      不知道有沒有差別,同時我有把leonardo那塊的程式每個有Serial的字都改成Serial1,我是參考這個網站的http://www.geek-workshop.com/forum.php?mod=viewthread&tid=8732
      老師的方法我明天再去實驗室試一次看看
      謝謝老師😁😁

    3. while(!Serial1){;}

      以及

      while(!Serial1){
      ;
      }

      是完全相同的敘述,只是分成數行來寫。Leonardo的Serial1用在序列連接數位0和1腳的場合。

      good luck!
      jeffrey

  15. 今天試了在setup()函式加入底下的while(!Serial1){;}
    可以讓nano,uno成功傳值給leonardo了,萬分感激老師>.<"
    不過還有兩個小疑問

    第一個問題是:
    我傳值的程式碼:uno,nano的板子
    ‪#‎include‬
    SoftwareSerial BT(0,1);

    void setup()
    {
    Serial.begin(9600); // 啟動serial通訊埠
    BT.begin(9600);
    }
    void loop()
    {
    BT.println(‘t’);
    //delay(1000);
    Serial.println(‘q’);
    // delay(1000);
    }

    我void loop()那邊裡面是打BT.println(‘t’);和Serial.println(‘q’);
    為什麼leonardo藍芽接收到的值是q,而不是t呀,照理說Serial.println(‘q’);這段程式碼不是給自己在監控看的嗎,BT.println(‘t’);這段才是藍芽發送的資料

    第二個問題是:
    我傳值的部分要傳的數據是超音波接收到的值
    可能會有3位數或2位數或一位數:(Ex:257,93,3,等……..(單位公分))
    可是聽說藍芽一次只能傳送一個字元
    要怎麼解決。

    我接收端那塊版子
    要根據超音波的值動作,
    例如
    大於100cm要做動作1
    小於100cm要做動作2
    所以可能會接收到1~3位數的值

    問題是要怎麼讓接收端接收到1~3位數去動作

    1. 1. 那是因為你的藍牙序列通訊模組是接在UNO板的0和1腳,如同我昨天的回覆,SoftwareSerial不應該使用0和1腳;如果你要使用0和1腳,那就不需要使用SoftwareSerial程式庫了,詳細說明請參閱書本5-18頁的「動手做5-1」以及14-10頁的「動手做14-1」。

      2. 你可以把接收到的字元組成字串並轉換成數字,相關說明請參閱10-10頁「動手做10-3」,以及11-16頁「動手做11-3」。

      thanks,
      jeffrey

  16. 老師您好:
    我目前在嘗試將兩塊arduino 以藍芽連接
    因此我希望能夠用arduino 自己的code來進入at mode
    不知道這樣的要求是可行的嗎?

    1. 可行,但是如上文所述,藍牙板在通電之前,KEY腳必須處於高電位。所以你可能需要設計一個電路來切換藍牙的電源,請參閱我之前的這一篇留言

      thanks,
      jeffrey

  17. 老師我現在做專題遇到困難我用的是Colorduino,這塊板子上面有ATMega328可以獨立運作,他身上也有接出RX、TX 接角,我想用他連接藍芽,請問我該怎麼設定連結。(這是我參考的網站https://123led.wordpress.com/colorduino/、http://wiki.iteadstudio.com/Colorduino_V1.4)

    1. hi yen:

      我大致瀏覽你提供的網頁文件,Colorduino提供序列埠和I2C介面,所以你可以把藍牙模組接在序列埠,程式就不需要使用SoftwareSerial,直接透過Serial物件通訊即可。

      thanks,
      jeffrey

    2. 老師請問大概要怎麼寫Serial

      我要一次連結4個Colorduino要怎麼用1對多連線

    3. 我看了一下Itead Studio的簡體中文產品說明頁,Colorduino控制板採用的點矩陣驅動IC是點晶科技的DM163,根據它的技術文件,它有Serial Out接腳,所以可以串接多個顯示器。

      因為每個驅動IC的運作方式以及資料格式都不太一樣,最好是問問廠商有沒有現成的程式庫可用,否則你可能要自己研讀技術文件和Colorduino的線路圖,才能明瞭如何控制它。

      thanks,
      jeffrey

  18. 老師你好:
    抱歉請問一下
    我都接通也可以利用MAC去連接到ARDUINO的藍芽了
    可是為什麼 他無法長時間連結?
    大約過個10秒左右就會自動斷聯了

    1. hi vincent:

      我在Mac上也遇過類似的問題,Apple的原廠藍牙鍵盤在持續使用數小時或者睡眠之後喚醒,連線就中斷了,後來執行這個Script就解決藍牙鍵盤的問題。但是HC-05模組的問題我就不清楚了。

      thanks,
      jeffrey

  19. 謝謝老師

    我查些資料 發現很多人都有這種問題 MAC配對藍芽後 過不久在藍牙配對的視窗會自動跳回未連線
    但是燈號不變 所以可能是MAC藍芽使用者介面那邊的問題

    非常謝謝老師

  20. 老師你好

    我使用的電腦是MAC,作業系統是OSX。沒有另外裝windows系統。
    使用的開發版是Arduino UNO,藍芽模組是HC-10
    程式碼都是依照老師網站上的,也成功寫入到板子裡面。
    序列軸監控視窗也有出現「BT is ready!」
    不過輸入任何AT指令都沒有反應,完全沒有頭緒問題是出在哪裡…

    麻煩老師幫我解答了…謝謝老師

    1. hi peter:

      我沒有接觸過HC-10,請跟廠商索取相關技術文件,確認讓藍牙模組進入AT命令所需連接的腳位(如:Key接高電位),以及通訊速率。

      thanks,
      jeffrey

  21. 您好,由於我們做專題用到Seeeduino ADK板子,搭配用Seeed BLE shield
    照您上面說的打了一樣的程式碼卻沒有回應?

    可以教我如何修正嗎?

  22. 老師您好,我已經完成上面所說的步驟,在序列埠設定也可以設定藍牙模組的AT命令,但是用手機一直收尋不到我的藍芽模組,請問老師:有可能是什麼原因造成收尋不到。我的藍芽模組是HC-05 手機是ZENFONE。

    1. hi lin:

      手機探索不到藍牙模組,跟AT命令設定沒有太大關聯,請將模組的工作模式改成Slave,如果再無法被手機探索,請換支手機或者用電腦測試。

      thanks,
      jeffrey

  23. 老師您好
    我目前剛接觸HC06,想請問老師一個問題
    HC06可否使用AT指令改變EDR呢?
    我想利用AT指令改Class1、 Class2或 Class3可行嗎?
    或是利用其他方式改變傳輸距離。
    請老師給點建議,感謝老師

    1. hi kora:

      我所購買的HC-06模組,只有上述的AT命令可用。
      提高傳輸距離,主要是要改變天線和訊號放大器電路設計,跟AT指令沒什麼關係。

      thanks,
      jeffrey

  24. 老師您好,請問您我想做一個用藍芽控制的家電中心,而我在這位作者的網站上找到這一串程式
    (附上網址)
    http://blog.xuite.net/chycahock/EDA/225989778-%E7%94%A8%E6%89%8B%E6%A9%9FApp%E9%81%99%E6%8E%A7%E5%AE%B6%E9%9B%BB%E9%96%8B%E9%97%9C

    程式如下:
    #include
    #define MAX_BTCMDLEN 128
    #define BTSW_TV 7 // pin7 當 BlueTooth Switch for TV
    #define BTSW_Sound 6 // pin6 當 BlueTooth Switch for Sound
    #define BTSW_Room 5 // pin5 當 BlueTooth Switch for Room
    #define BTSW_Fan 4 // pin4 當 BlueTooth Switch for Fan

    // 建立一個軟體模擬的序列port
    SoftwareSerial BT(10,11); // HC-06/TX–>PIN10(Arduino/RX), HC-06/RX–>PIN11(Arduino/TX);
    byte btCmdBuff[MAX_BTCMDLEN]; // up to 128 bytes BT command received from the Android system
    int btCmdLen = 0; // received BT command length
    void setup() {
    //Serial.begin(38400); // serial port for debugging
    BT.begin(38400); // 建立藍芽軟體串列埠
    pinMode(BTSW_TV,OUTPUT); // 設定電視開關
    pinMode(BTSW_Sound,OUTPUT); // 設定音響開關
    pinMode(BTSW_Room,OUTPUT); // 設定房間開關
    pinMode(BTSW_Fan,OUTPUT); // 設定風扇開關
    digitalWrite(BTSW_TV,LOW);
    digitalWrite(BTSW_Sound,LOW);
    digitalWrite(BTSW_Room,LOW);
    digitalWrite(BTSW_Fan,LOW);
    }
    void loop() {
    listenBTCmd();
    //showBTCmd(); // for debugging
    executeBTCmd();
    }
    void executeBTCmd() {
    char cmd[MAX_BTCMDLEN];
    if ( btCmdLen>0 ) {
    sprintf(cmd,”%s”,btCmdBuff);
    //Serial.println(cmd);
    if ( strcmp(“tv,on”,cmd)==0 ) {
    digitalWrite(BTSW_TV,HIGH);
    }
    if ( strcmp(“tv,off”,cmd)==0 ) {
    digitalWrite(BTSW_TV,LOW);
    }
    if ( strcmp(“sound,on”,cmd)==0 ) {
    digitalWrite(BTSW_Sound,HIGH);
    }
    if ( strcmp(“sound,off”,cmd)==0 ) {
    digitalWrite(BTSW_Sound,LOW);
    }
    if ( strcmp(“room,on”,cmd)==0 ) {
    digitalWrite(BTSW_Room,HIGH);
    }
    if ( strcmp(“room,off”,cmd)==0 ) {
    digitalWrite(BTSW_Room,LOW);
    }
    if ( strcmp(“fan,on”,cmd)==0 ) {
    digitalWrite(BTSW_Fan,HIGH);
    }
    if ( strcmp(“fan,off”,cmd)==0 ) {
    digitalWrite(BTSW_Fan,LOW);
    }
    }
    }
    void listenBTCmd() {
    char tmp;
    btCmdLen = 0;
    memset(btCmdBuff,0,MAX_BTCMDLEN);
    while( BT.available()>0 ) {
    if( (tmp=BT.read())==’O’ ){
    btCmdLen = 0;
    }
    btCmdBuff[(btCmdLen++)%MAX_BTCMDLEN] = tmp;
    }
    }
    void showBTCmd() {
    char cmd[MAX_BTCMDLEN];
    if ( btCmdLen>0 ) {
    sprintf(cmd,”%s”,btCmdBuff);
    Serial.println(cmd);
    }
    }

    這位作者是用APP連接藍芽,我也依樣畫葫蘆,但發生了一些問題
    我是使用UNO板,但我的藍芽模組是HC-05 (34腳有按鈕的),也照老師上面做AT指令(但不知道改甚麼,幾乎都原廠設定)
    我連接手機的時候也都OK,配對成功,HC-05有變成慢速閃爍,但我在APP端輸入tv,on之類的指令,LED就是不會亮
    我是想連接繼電器做一個家電控制中心在家裡玩(家裡很小,想說無聊),也讓父母驚奇一下
    但我的程式底子並不是非常好,我找了很多文章也不知道怎麼改或是哪裡有錯
    我是使用麵包板跟杜邦線連接Arduino,但沒有公對母的杜邦線,所以藍芽是插在麵包版上
    可不可以麻煩老師協助我,謝謝

    1. 1. 除非你要修改藍牙的參數(例如:藍牙的識別名稱或連線速率),否則買回來就能直接安裝使用,不需要執行AT命令。
      2. 剛開始練習程式設計時,建議先從簡單、容易解決的問題下手。像你提到的App,那是別人寫好的,程式碼究竟如何運作,我們可能摸不著頭緒;Arduino部份也是一堆控制碼。

      書本第14章的用手機藍牙操控機械昆蟲,其實也可以改成燈光或其他電器的藍牙開關控制器。書本裡的App範例包含前進、後退、左轉、右轉和停止等「開關」控制,你可以先從控制單一開關著手,了解整個程式的運作邏輯之後,再嘗試加入其他開關控制。

      have fun!
      jeffrey

  25. 老師您好,
    最近正在做學校的專題,內容是使用app inventor 2 經由藍芽控制arduino的led,不過遇到一些瓶頸,希望能夠透過你們的專業來幫我解答。

    我們有最主要的兩個功能
    基本的開關燈以及使用slider調整led燈的亮度
    總共有3個slider,2顆led燈
    slider1是用來同步控制2顆led燈亮度
    slider2是用來控制第一顆
    slider3是用來控制第二顆
    使用UNO 板 HC-05藍芽模組

    程式碼如下

    #include

    SoftwareSerial BT(8, 9);
    String mystring;

    void setup() {
    Serial.begin(9600);
    Serial.println(“BT is ready!”);
    pinMode(13, OUTPUT);
    pinMode(12, OUTPUT);

    BT.begin(9600);
    }

    void loop() {

    while (BT.available())
    mystring = BT.readString();
    {
    if (mystring==”O”){
    digitalWrite(13, HIGH);
    digitalWrite(12, HIGH);
    }
    else if (mystring==”P”){
    digitalWrite(13, LOW);
    digitalWrite(12, LOW);
    }
    else if (mystring==”Q”){
    digitalWrite(12, HIGH);
    }
    else if (mystring==”S”){
    digitalWrite(12, LOW);
    }
    else if (mystring==”T”){
    digitalWrite(13, HIGH);
    }
    else if(mystring==”U”){
    digitalWrite(13, LOW);
    }
    }
    }

    ↑這是控制開關的程式碼,但使用起來會有大約1秒的延遲,原先是使用char、switch case來寫,不會有延遲也一切正常,不過為了配合slider的使用所以改用string、if else,就開始會延遲。

    #include

    SoftwareSerial BT(8, 9);
    String mystring,val;
    int value = -1;

    void setup() {
    Serial.begin(9600);
    Serial.println(“BT is ready!”);
    pinMode(10, OUTPUT);
    pinMode(11, OUTPUT);

    BT.begin(9600);
    }

    void loop() {

    while (BT.available())
    mystring = BT.readString();
    val=mystring.substring(0,1);
    value=mystring.substring(1).toInt();
    Serial.println(val) ;
    Serial.println(mystring) ;
    if (value >= 0)
    {
    if (val==”A”){
    analogWrite(10,value);
    analogWrite(11,value);
    value = -1;
    }
    if (val==”L”){
    analogWrite(10,value);
    value = -1;
    }
    if (val==”R”){
    analogWrite(11,value);
    value = -1;
    }
    }
    }

    ↑這是參考網路上的程式碼,也是我們整個環節很大的問題,一樣會延遲,雖然會依照著%數越大led就越亮的規律,但在0%時led燈不會全滅,會微亮,slider也只能使用點按的方式調整而不能使用拖拉的方式,否則傳入的數字會亂跳。

    有參考過http://blog.cavedu.com/programming-language/appinventor/appinventorandarduinowithbluetooth2/,但礙於看不太懂程式碼內容,所以不知道怎麼樣從1顆led變成3顆led,只好尋找其他方式試試看。

    至於AI2經藍芽傳送的資料如下
    slider1是傳送A(%) EX:slider調為50%的時候會接收到A50的數值
    slider2是傳送L(%) EX:slider調為50%的時候會接收到L50的數值
    slider3是傳送R(%) EX:slider調為50%的時候會接收到R50的數值

    之後把兩個程式碼組合起來之後會有種衝突的感覺,卡在這部分好幾天了,不知道是否有哪裡需要修改或是需要使用其他的函式去執行?

  26. 想請問,我有兩個 HC-06 ,打AT+NAMEOOO可以修改名稱,兩個都有回傳OKsetname。
    可是打AT+PIN1111,一個有更改成功、有回傳值,一個沒有任何回傳值,密碼也沒有被更改成功,這到底是什麼原因呢?

    1. hi vivian:

      相同的模組,一個可以更改成功,另一個不行…呃…我會把另一個給忘了,我覺得它是不良品。

      thanks,
      jeffrey

  27. 請問如果要使用手機上的app與自己組的其他晶片做藍芽傳輸,
    而不使用Arduino,
    不知道有推薦哪款Android app嗎?
    因為自己有找了幾款,
    只是不太知道app是怎麼做傳輸的,
    也找不到使用教學,不知道是不是還要輸入什麼指令。

    1. hi sky:

      我不太了解你的用意,你是說在兩個Android設備(如:手機和平板)之間,傳遞資料嗎?還是要透過藍牙控制另一個Android裝置?

      thanks,
      jeffrey

    2. 想利用Android設備去控制另一個藍芽裝置,
      那個藍芽裝置只是要接收資料,送到晶片裡而已,
      後續的晶片接收部份是寫好了,
      只是我不知道怎麼利用Android設備將資料送到HC-06上讓他接收傳輸出去,
      例如我可以在手機上輸入1,利用HC-06讓他傳送到晶片內,
      晶片接收到之後就由其他裝置顯示1 之類的,
      目前是卡在接好了RX TX等等腳位,
      不過不知道怎麼通過手機藍芽,
      將資料傳到HC-06讓他傳送到晶片內,謝謝。

    3. 了解,請在Google Play上搜尋”Bluetooth Terminal”(藍牙終端機)。安裝之後,即可透過它向已經配對連線的藍牙序列裝置發送訊息。

      thanks,
      jeffrey

    4. 因為我本來是用 RS232 的UART模組,將資料從電腦送到晶片,
      想說改用手機藍芽傳輸,目前使用的是HC-06的藍芽模組,
      本來接RS232傳輸的地方就改接 HC-06的4個腳,
      不過去下載了app 看起來是有連接到藍芽上,
      只是在app輸入資料傳送後好像沒反應,
      像是去下載的這幾種app
      https://goo.gl/4qxYBO
      https://goo.gl/PqdrVq
      https://goo.gl/vV0WPe 之類的,
      大概就是想要將資料從手機利用藍芽傳送到HC-06裝置上。

    5. 我有下載”Bluetooth Terminal”(藍牙終端機),
      上面好像也有好幾種版本,
      我有設定只要有收到資料,就算資料錯誤也會顯示,
      所以可能應該不是格式錯誤,
      感覺是資料都沒有傳輸過去,
      那些Bluetooth Terminal 的app是還要另外打指令才能傳送,
      或是想傳1 就直接輸入1 發送就好?

    6. 不知道在手機app上是不是也要打AT+…等等的指令,
      雖然我也有試過不過也沒反應,
      還是AT+…的指令是Arduino用的,
      手機的app不用?

    7. 測試藍牙序列模組最簡單的方法,就是將模組的TxD和RxD腳相連,然後再開啟手機上的Bluetooth Terminal(我用的是這個App)。

      當你發送字元或字串之後,App下半部的視窗將會顯示相同的訊息,代表藍牙模組有將收到的訊息返送回來。

      除非你要設置藍牙模組的參數,否則並不需要進入AT模式。

      thanks,
      jeffrey

    8. 照您說的方法試了一下,
      的確有接收到傳回來的訊息,
      所以想說可能是不是因為HC-06傳送的訊號和我用 RS232所傳的訊號模式或格式不同,
      所以無法接收到正確資料,
      我目前用的晶片主要是HIN232接RS232的,
      然後將資料傳送到dspic30f4011,
      是想要將RS232連接電腦的改成使用藍芽傳輸,
      不知道您對這晶片了不了解,可能是什麼原因晶片接收不到藍芽傳輸的資料?
      謝謝。

    9. 問題不在硬體(請確認藍牙的TxD是接在dspic30f4011單晶片的RxD腳),請調整藍牙的傳輸速率試試看。

      have fun!
      jeffrey

    10. 調整設定有辦法用手機app直接改嗎?
      還是一定要從電腦上安裝那個軟體才能?
      我試過直接從app打AT之類的好像都沒反應,
      不知道有什麼方法可以比較快速的直接調整速率設定?
      謝謝。

    11. 請參閱上文說明,讓藍牙進入AT命令模式。AT命令一定要從藍牙的TxD和RxD連線輸入,不能透過無線傳輸。

      thanks,
      jeffrey

  28. 老師您好
    請問HC-06設定完成後
    是否還需要接Uno版呢?
    想把HC-06獨立出來
    單獨接Power supply
    靠手機傳輸訊號
    由TxD傳輸邏輯訊號

  29. 請問一下,這個送出的資料型態是哪種?
    char float 還是其他的?
    是8 bits 32 bits之類的?
    謝謝解答?

  30. SoftwareSerial BT(2,4); // 接收腳, 傳送腳(自己做的arduino板子,所以不是10,11)

    void setup() {
    Serial.begin(9600);
    BT.begin(38400); //HC-05
    }

    void loop() {
    int insize,i=0;
    if (BT.available()) {
    insize = (BT.available()); //接收多少訊息
    Serial.print(“availible_size=”);
    Serial.print(sizeof(BT.available()));
    Serial.print(“\\”);
    Serial.print(insize);
    Serial.print(” read_size=”);
    Serial.println(sizeof(BT.read()));

    for (i=0;i<insize;i++) {
    Serial.print(cmmd[i]=char(BT.read()));
    Serial.print("\\");
    Serial.print(cmmmd[i]=char(BT.read()));
    Serial.print(",");
    }
    Serial.print(strlen(cmmd));
    Serial.print("\n");

    for(i=0;i<insize;i++){
    Serial.print(cmmd[i]);
    Serial.print(",");
    }
    Serial.print("\n");

    監控視窗:
    availible_size=2\5 read_size=2
    \0, \0,正方形\255,正方形\255,正方形\255,0 //(0是strlen)
    , , ,正方形,正方形,

    想請問老師,傳的值是不固定長度的字串,可是cmmd都是看不見或框框、cmmmd有數字可是不是英文字母
    這樣是因為(2,4)腳位的問題,還是監控視窗顯示不出來,還是HC-05壞掉
    然後每次insize都不一樣大小(假設傳的都是"P,"),sizeof永遠都是2(可是"PA,"也是2),不知道為什麼?

    1. \0, \0, \255,正方形\255,正方形\255,0 //(0是strlen)
      , , ,正方形,正方形,

      監控視窗打錯,更正

  31. 運用了課本的範例程式做了一個藍芽遙控車的程式, 卻出現不常見的 ERROR, 希望老師可以協助
    cArduino: 1.6.8 (Windows 7), Board: “Arduino Robot Control”

    E:\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.cpp: In member function ‘void SoftwareSerial::begin(long int)’:

    E:\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.cpp:319:36: error: ‘digitalPinToPCICR’ was not declared in this scope

    if (digitalPinToPCICR(_receivePin)) {

    ^

    In file included from e:\arduino\hardware\tools\avr\avr\include\avr\io.h:99:0,

    from e:\arduino\hardware\tools\avr\avr\include\avr\interrupt.h:38,

    from E:\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.cpp:41:

    E:\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.cpp:360:76: error: ‘digitalPinToPCICRbit’ was not declared in this scope

    *digitalPinToPCICR(_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin));

    ^

    E:\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.cpp:363:51: error: ‘digitalPinToPCMSK’ was not declared in this scope

    _pcint_maskreg = digitalPinToPCMSK(_receivePin);

    ^

    In file included from e:\arduino\hardware\tools\avr\avr\include\avr\io.h:99:0,

    from e:\arduino\hardware\tools\avr\avr\include\avr\interrupt.h:38,

    from E:\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.cpp:41:

    E:\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.cpp:364:60: error: ‘digitalPinToPCMSKbit’ was not declared in this scope

    _pcint_maskvalue = _BV(digitalPinToPCMSKbit(_receivePin));

    ^

    exit status 1
    Error compiling for board Arduino Robot Control.

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.

    原始檔案下載連結 : https://drive.google.com/file/d/0B6XPU7Xyt3NnSjNVM0lfbVF1YTg/view?usp=sharing

    1. hi steven:

      從錯誤訊息最後一部份看來,是因為你的開發板是Arduino Robot Control,看樣子SoftwareSerial程式庫不支援這個板子。

      thanks,
      jeffrey

  32. 您好老師, 我使用了網上一個範例關於用Bluetooth Terminal 來控制led 開關, 但輸入任何指令都沒有回應. 希望老師幫忙 指導 哪些地方出現問題
    以下是範例及出現問題的情況.

    #include
    SoftwareSerial BT(15, 14);
    void setup()
    {
    pinMode(9, OUTPUT);
    BT.begin(9600);
    }
    char a;
    void loop()
    {
    if (BT.available())
    {
    a=(BT.read());
    if (a==’1′)
    {
    digitalWrite(9, HIGH);
    BT.println(“LED on”);
    }
    if (a==’2′)
    {
    digitalWrite(9, LOW);
    BT.println(“LED off”);
    }

    }
    }

    C:\Users\user\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.7\libraries\SoftwareSerial\SoftwareSerial.cpp:375:6: warning: always_inline function might not be inlinable [-Wattributes]

    void SoftwareSerial::setRxIntMsk(bool enable)

    ^

    C:\Users\user\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.7\libraries\SoftwareSerial\SoftwareSerial.cpp:121:6: warning: always_inline function might not be inlinable [-Wattributes]

    void SoftwareSerial::recv()

    1. 請問你用的是什麼板子?建議安裝最新版(目前是1.16.11)再測試看看,它改善了一些軟體bug。

      thanks,
      jeffrey

    2. 根據SoftwareSerial程式庫裡的註解,Mega 2560只有這些能用於「接收」:

      Not all pins on the Mega and Mega 2560 support change interrupts,so only the following can be used for RX:
      10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

      請把你程式中的15改成13試試看。

      也請參閱這一篇留言,Mega 2560板子並不需要使用SoftwareSerial程式庫。

      thanks,
      jeffrey

    3. 老師您好, 感謝你之前的指導, 再想向老師請教 如何在Bluetooth Terminal 輸入 password= 1234 來控制led 開關

      char pass [4]={‘1′,’2′,’3′,’4’};
      void loop()
      {
      if (BT.available())
      {
      for(int i=0; i<4; i++)
      {
      pass [i] = BT.read();
      }

      if (pass == 1234)
      {
      digitalWrite(9, HIGH);
      BT.println("LED on");
      }

      }
      }

    4. 不敢當~我之前也沒講什麼…透過序列埠數值控制開關的例子,請參閱書本17-23頁的調光器程式碼。

      thanks,
      jeffrey

  33. 您好:
    請問藍芽模組(HC-06)連結到arduino板上接電之後,也確定可以執行AT command得相關設定,但無法與手機(安卓)連結,手機顯示拒絕配對要求,請問這是哪裡出了問題,再請您幫忙指導,謝謝!

    1. 可能是Android系統軟體或App的問題,請問你有在電腦上配對成功過嗎?也請用不同的手機嘗試看看。

      thanks,
      jeffrey

  34. 老師您好,看完後尚未實作,但想請問如果將arduino上的接腳改成0,1用tx, rx是否可行?

  35. 老师你好!
    我使用的是HC05系列,按照您的指点成功进入了AT模式,灯慢闪,但是在串口检测器中写入 AT指令却无法得到反馈,我的结束符也选到 Both NL and CR.请问可能的原因是什么呢?

    1. hi vincent:

      請檢查傳送和接收腳是否接對,也許換個速率試試看。

      thanks,
      jeffrey

    1. 我是用Adobe Flash軟件,搭配鼠標(偶爾用Surface Pro平板的Wacom筆)徒手繪製的。

      thanks,
      jeffrey

  36. 老師您好

    我的HC-05有成功進入AT系統

    傳輸指令 藍芽系統也都有回應

    但手機藍芽遲遲都搜尋不到

    請問要怎麼解決 謝謝

    1. 呃…聽起來是換新手機的好藉口…請問用其他手機也是同樣的情況嗎?

      thanks,
      jeffrey

  37. 老师您好!想问下您有没有HC-06蓝牙模块休眠或者说省电的资料,我是利用的Arduino UNO R3单片机控制的。
    麻烦老师了~~谢谢您!

    1. 藍芽模塊的省電功能,應該由藍牙芯片自行控制,Arduino無法介入,或許可以替模塊做一個電源開關,從Arduino開啟或切斷模塊的電源。

      thanks,
      jeffrey

  38. 趙老師你好
    我目前在做藍芽跟溫溼度感測器的連接
    因為我真的是新手
    我目前卡在我不太會寫
    把溫溼度感測器所得到的數據傳到藍芽的程式

    有請老師解救

    1. 你所謂卡在不太會寫,是指哪個環節的程式?因為藍牙有傳送端和接收端,按照你的描述,傳送端是Arduino;接收端可能是手機App、電腦或者另一個Arduino。

      你應該釐清問題,先解決一小部份,像讀取溫濕度值,接著處理序列埠通訊,如此,你的問題就解決大半了。

      have fun!
      jeffrey

  39. 老師你好
    可以請教個問題嗎
    最近在做專題 藍芽喇叭
    不太了解Arduino的寫法
    我做完了藍芽控制 而且也可以正常使用
    還要寫個音頻模塊的程式
    可是找不到相關資料
    請問可以教一下如何寫嗎 謝謝

    1. 控制音頻模塊指的是下一首、上一首、播放、暫停…之類的功能嗎?
      這些控制功能模塊不是都有提供嗎?為何還需要Arduino?

      thanks,
      jeffrey

  40. 老师你好 我想问一下 昨天hc-05模块进入at模式还能修改 今天进入at模式就什么都不能修改了 是哪里出了问题呢

  41. 老師你好
    我想要用HC-05藍芽模組透過SPP經由Arduino Uno與windows 系統連結
    系統架構如下敘述
    1. Sensor 模組,經由控制晶片,透過I2C bus, 與Arduino Uno連結(Pin A4, A5)
    2. 而在Arduino Uno與windows 系統連結部分,則是經藍芽的SPP(serial port profile)做無線連結
    3. windows 端則有一個App透過藍芽SPP與arduino連結
    可我目前遇到一點小問題,就是HC-05藍芽模組無法與windows 系統連結
    基本上,如果用USB上的Virtual Com port, Windows 端的App則可收到Sensor 模組傳來的控制訊號
    可是用HC-05藍芽模組卻無法成功,相關訊息如下:
    1. HC-05藍芽模組的設定為 slave, baudrate 等為9600, 1, 0, 且可與系統配對成功並產生兩組 Virtual Com port(com10 連出, com11 連入)
    2. 在用藍芽連結時,將windows 端App的PortName改為com11,執行App時,com port可成功被打開(無錯誤訊息),但卻接收不到任何訊號
    3. 程式碼如下:
    Windows端

    myport = new SerialPort();
    myport.BaudRate = 9600;
    myport.PortName = “com11”; //port_name_tb.Text;
    myport.Parity = Parity.None;
    myport.DataBits = 8;
    myport.StopBits = StopBits.One;
    myport.DataReceived += myport_DataReceived;
    try
    {
    myport.Open();
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message, “Error”);
    }

    Arduino 端

    SoftwareSerial BTSerial(10, 11); // Bluetooth Rx Tx on Arduino
    void setup() {
    // Open serial communication
    Serial.begin(9600); //usb virtual com port
    BTSerial.begin(9600);//BT virtual com port

    // initial I2C
    Wire.begin();

    // initial color sensor
    WriteByte(COLOR_SENSOR_DEVICE_ID, SYSTEM_CONTROL, SW_RESET);
    WriteByte(COLOR_SENSOR_DEVICE_ID, MODE_CONTROL2, RGBC_EN);
    WriteByte(COLOR_SENSOR_DEVICE_ID, MODE_CONTROL3, FUNCTION_EN);
    WriteByte(INTERRUPT, MODE_CONTROL3, INT_ENABLE);
    delay(200);
    }

    void loop() {
    if(GetBTNStatus())
    getRGB();
    }

    int GetBTNStatus()
    {
    int reading = digitalRead(BUTTON);

    // If the switch changed, due to noise or pressing:
    if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
    }
    if ((millis() – lastDebounceTime) > debounceDelay) {
    // if the button state has changed:
    if (reading != buttonState) {
    buttonState = reading;
    }
    }

    // save the reading. Next time through the loop,
    // it’ll be the lastButtonState:
    // Serial.println(String(“”)+ “ButtonState: ” + lastButtonState);
    lastButtonState = reading;
    return lastButtonState;
    }

    void getRGB()
    {
    RGB[0] = ReadByte(COLOR_SENSOR_DEVICE_ID, RED_DATA_MSB);
    RGB[1] = ReadByte(COLOR_SENSOR_DEVICE_ID, GREEN_DATA_MSB);
    RGB[2] = ReadByte(COLOR_SENSOR_DEVICE_ID, BLUE_DATA_MSB);
    Serial.println(String(“”)+ RGB[0] + “,” + RGB[1] + “,” + RGB[2]);//送給USB Uart的控制訊號,可被Winapp接收
    BTSerial.println(String(“”)+ RGB[0] + “,” + RGB[1] + “,” + RGB[2]);//送給BT Uart的控制訊號,無法被Win app接收
    delay(200);
    }

    1. 請問你有先使用其他序列通訊軟體,例如AccessPort或者Android手機的Serial Terminal,測試能與藍牙模組通訊嗎?

      thanks,
      jeffrey

  42. 老師您好,不好意思我想跟您請教一下,我目前使用的hc-05在剛買回來的時候輸入AT,都會正常回傳OK,但自從我改變了他的鮑率,它回傳的OK都會少O或是少K,這樣在操作上還能正常運作嗎?要如何才能讓輸入AT時回傳的值變回OK。

    1. 請問修改鮑率之後,你有修改Arduino程式中的序列連線設定,用新的鮑率連接嗎?你可以參考這篇回應提到的AT命令規格書,將HC-05重設為出廠設定值。

      thanks,
      jeffrey

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top