Arduino 藍芽控制LED,App inventor簡易教學。

arduino藍芽控制LED

要如何透過手機藍芽連線來控制LED呢? 本文中會教你如何使用App inventor來寫一個手機app,以及藍芽模組的使用,趕快來玩玩看吧。

學會用手機藍芽控制LED後,就可以更進階製作藍芽遙控車!!!

材料準備

材料名稱蝦皮連結
【傑森創工】Arduino Uno R3 開發板 原廠晶片 *限時特惠 附USB線
【傑森創工】Arduino HC-06 藍牙模組 帶底板 Bluetooth RS232 Module
【傑森創工】170孔 迷你 彩色 麵包板 六色 白黑藍黃綠紅 Arduino (顏色隨機出貨)
【傑森創工】5mm 超高亮度LED 白光 10個一組 可用於Arduino 單晶片 汽機車 無人機
【傑森創工】20個 1/4W 220Ω 電阻DIP 插板電阻 碳膜電阻,1%電阻 8051 Arduino
【傑森創工】杜邦線 公對母 20cm 10條 12股銅絲含膠殼 彩色線 (整排40條4單位) Arduino 專用

藍芽模組

藍芽模組有分主端從端,並且有HC-05、HC-06兩款,我們用的藍芽模組通常都是從端,因為大部分我們是用手機或其他裝置來當主端連線從端的藍芽模組。

HC-05與HC-06藍牙模組補充說明(一)

藍芽模組接腳功能
VCC電源輸入(5V)
RXD接收資料
TXD發送資料
GND接地
EN(KEY)高電位時,進入AT模式

電路連接

這邊要注意藍芽模組的RX要接Arduino 自定義的TX,反之藍芽模組TX接Arduino 自定義的RX。

RX表示接收數據,TX表示發送數據,故接收要對發送,才會傳輸成功。

藍芽模組及LED電路示意圖
藍芽控制LED實際電路連接
實際電路連接

延伸閱讀: 三用電錶使用教學,檢查電路必備工具!!

程式

手機app製作

我們使用app inventor這個網頁來製作簡易的app,新手也可以簡單上手。

app inventor 網站連結: https://appinventor.mit.edu/

1.左邊可以選擇一些物件,並且會顯示在中間模擬手機的畫面,這裡要選擇ListPicker(BT Iist)、Button(LEDTurnOn)、Button(Disconnect)。

2.右側欄位則是可以更改物件屬性,像是按鈕長寬高、顯示的字等等

3.左邊欄位要選Connectivity→BluetoothClient,右邊會顯示,代表有建立藍芽功能了。

4.常見的一些程式圖塊

5.針對所選擇的圖標按鍵有相關的動作程式,圖中為選取Screen1,顯示的相關圖塊。

大家可以都點看看邊摸索邊學習。

6.螢幕初始化時,會將BTlist按鈕開啟,另外兩個則是關閉。

7.在點擊BTlist前,會抓取Android之前配對過的藍芽,並以清單列出。

8.點擊BTlist後,會先判斷藍芽連線是否成功,成功會回傳ture,失敗回傳false,address是配對前面選擇的藍芽位置。

9.連線成功後,會將BTlist關閉,LEDTurnOn、Disconnect按鈕開啟。

10.當點擊LEDTurnOn,就會開始執行下面程式。

11.判斷該按鈕上的文字是否為LEDTurnOn。

12.如果為LEDTurnON,會先將文字改為LEDTurnOff,在手機上按鈕文字就會更新,接著透過藍芽傳送’a’字元,在藍芽模組那端就會接受到’a’。

如果按鈕文字為LEDTurnOff,則會執行按鈕文字更新為LEDTurnOn,並且傳送’b’到藍芽模組。

在藍芽模組接收到’a’,Arduino就會判斷要開啟led,反之收到’b’為關閉。

arduino藍芽程式

#include <SoftwareSerial.h>
#include <Wire.h>

int LED = 5;
char LEDstatus;
SoftwareSerial BT(10,11);
//定義Arduino PIN10及PIN11分別為RX及TX腳
void setup()
{
 Serial.begin(9600);
 BT.begin(9600); // 設定和 HC-06 通訊的速度 (預設 9600)
 pinMode(LED, OUTPUT);  
}
void loop()
{
 //讀取藍芽模組訊息,並傳送到電腦
 if (BT.available()){
    LEDstatus=BT.read();
    Serial.println(LEDstatus);  
 }
 //判斷LED開關條件
 switch (LEDstatus){ 
  case 'a':
  digitalWrite(LED,HIGH);
  break;
  case 'b':
  digitalWrite(LED,LOW);
  break;
  }
}

影片: 實際用手機控制led操作

在〈Arduino 藍芽控制LED,App inventor簡易教學。〉中有 38 則留言

  1. 無知的孩子 回覆

    你好 請問假如我在APP inventor 的第一個螢幕連接藍芽 之後我按下按鈕跳到第二個螢幕,然後再用第二個螢幕的按鈕操作但手機卻顯示error 不知道是什麼問題

  2. K 回覆

    請問 我要如何在手機看到 arduino LED亮/滅 回饋的狀態? 感謝!感謝!

    • Derek Wu 文章作者回覆

      1.以本篇文章中,當LED未亮時,APP上面的按鈕會顯示”LEDTurnOn”;
      若是點擊按鈕後,LED會亮起,按鈕上的顯示會變成”LEDTurnOff”。
      手機可以透過這個來看到LED亮/滅的狀態,你也可以改成你所希望的提示字元。
      這裡是以按鈕動作做判斷來改變提示。

      2.或是你希望從arduino那邊回傳led狀態,要從case a 跟 b 裡面寫一個回傳狀態,app端也要寫一個接收並且判斷led狀態,再透過文字或是其他方式顯示led狀態。

      以第一個方式來做更改會比較快一點,但不曉得你是想要哪一種。

  3. K 回覆

    非常感謝 ! 在下依著 您的回復嘗試著第2種方式 將其 arduino 腳位實際狀態(H or L) 回傳 至 android 畫面顯示狀態. 再次由衷感謝 您撥冗回復指導 ! 感謝 ! 感謝 !

  4. lolo 回覆

    想請教的問題是畫面只有BTlist按鈕可以按,按下BTlist按鈕後就黑屏沒動了><"
    使用的是app inventor的模擬器,畫面及程式如下連結https://drive.google.com/drive/folders/1CeAQK60WqvaZbppaf7QZfNlr9RUbzSex?usp=sharing

    感謝您

    • Derek Wu 文章作者回覆

      用app inventor的模擬器,也就是用電腦執行是嗎?
      會不會是電腦沒有藍芽功能,所以沒辦法掃描到配對的藍芽。

      可以試看看把app用手機執行,看會不會是一樣的狀況?

  5. SHUAN 回覆

    請問一下,我接好之後的LED會亮。不過它很常延遲一段時間才突然亮或滅,不知道有可能是什麼問題呢?

    • Derek Wu 文章作者回覆

      是說可以用手機正確的控制LED亮滅,但會有延遲的狀況嗎?
      還是說LED沒有照著手機控制亮滅,而是突然亮或滅?
      方便的話可以貼個程式碼及接線照片~

      • SHUAN 回覆

        有照著手機指令來控制亮滅喔,基本上連線之後第一次開和關都會很順利反應也很快,不過之後再次按下按鈕它就會間隔很久或甚至愛理不理的。除了文中的接線之外我有將電池兩端接A0跟GND,打算把它的電壓輸出同時顯示在手機上。

        以下附上程式碼:

        #include
        #include

        int LED = 5;
        char LEDstatus;
        SoftwareSerial BT(10,11);
        //定義Arduino PIN10 及PIN11分別為RX及TX腳
        void setup()
        {
        Serial.begin(9600);
        BT.begin(9600); // 設定和 HC-06 通訊的速度 (預設 9600)
        pinMode(LED, OUTPUT);
        float temp;
        }
        void loop()
        {
        //讀取藍芽模組訊息,並傳送到電腦
        if (BT.available()){
        LEDstatus=BT.read();
        Serial.println(LEDstatus);
        }
        //判斷LED開關條件
        switch (LEDstatus){
        case ‘a’:
        digitalWrite(LED,HIGH);
        break;
        case ‘b’:
        digitalWrite(LED,LOW);
        break;
        case ‘c’:
        int V1=analogRead(A0);
        float vol=V1*(2.0/1023.0);
        float temp=vol;
        BT.write(temp);
        }
        }

        • Derek Wu 文章作者回覆

          如果你完全照著文中做單純控制led是不會延遲的對吧?

          但是你想做一個可以控制led跟從手機顯示電池電壓的小專題就會發生上述的問題嗎?

          從你的程式碼中可以看出一個問題,手機透過藍芽接收arduino傳送的資料不能直接用float,會是以類似封包的方式傳送,可以參考下列這篇文章
          https://blog.cavedu.com/2014/01/02/appinventorandarduinowithbluetooth3/

          建議先做手機顯示電池電壓就好,比較單純,最後再做結合。

          希望對你有幫助~

          (不然我改天也來寫一篇類似的文章好了哈哈哈~)

  6. EVAN 回覆

    android手機未連接過此藍芽裝置,在BT List中就跑不出欲連接的藍芽裝置(AddrassesAndNames),請問該如何處理?

  7. 黃柏翔 回覆

    我在安卓13,Android MIT App Inventor 中使用藍牙block會有Requesting Permission to enable bluetooth權限問題,官網討論區同樣有人問。
    https://community.appinventor.mit.edu/t/requesting-permission-to-enable-bluetooth/13690

    我參考官網討論區提供的方法,在 Screen1.Initialize block放入BluetoothClient1中可指定HC-05藍牙 connect address 的block, 藍牙位址可在手機【藍牙與裝置連接】看到,即可解決。
    http://www.martyncurrey.com/android-mit-app-inventor-auto-connect-to-bluetooth/

  8. 人類 回覆

    請問一下,自製的app是只適用安卓嗎?還是ios也可以?

  9. cwlyu 回覆

    請問發生錯誤 need android.permission.BLUETOOTH_CONNECT permission for AttributionSource 該怎麼辦

  10. 回覆

    顯示 Error 507: unablue to connect. is the device turn on?

  11. Koen 回覆

    在手機執行app後,點選BTlist,就變黑屏不會動。

發佈留言

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