【雙A計劃】Part2:App Inventor 經由藍牙控制 Arduino LED 漸明漸暗

本篇將簡單介紹如何用手機的 Slider 滑桿元件來控制Arduino上的LED燈漸明漸暗,當然就是用到 analogWrite的 PWM效果囉。

雙A計畫文章總覽:

中文系列文章

English version

 

作者/攝影   偉和
難度

★★★☆☆

材料表

【推薦套件】自學者的天堂|Arduino 入門到雲端基本套件包

下載

範例影片如下:

先由下圖將藍牙發射器及LED接上Arduino (藍牙RX – Arduino D10, 藍牙TX – Arduino D11腳位)

App Inventor 編寫簡易的藍牙訊息發送程式

畫面元件很簡單,點選 BT List 之後,會顯示藍牙配對裝置清單,點選您已經配對好的藍牙裝置之後,就可藉由畫面中間的滑桿元件(自定義數值範圍為0~80,您也可以偷懶直接就定義為0~255)。App Inventor 會每隔按鈕就可點選。反覆點選就會送出不同的字元給Arduino 來控制LED亮滅。

螢幕快照 2014-04-04 上午12.28.35

 

程式說明:

STEP1:在 ListPicker1.BeforePicking事件中,將 BluetoothClient.AddressAndNames指令為 ListPicker1內容,代表點選將其內容連結到手機的已配對藍牙裝置清單。 

STEP2:在 ListPicker1.AfterPicking事件中,確認連線成功之後,設定相關按鈕為 enabled/ disabled。

螢幕快照 2014-04-04 上午12.29.00

STEP3:本程式重點在於使用 CLock.Timer事件每 0.01 秒將 Slider 的當下數值透過 BluetoothClient元件的 SendText 指令送出。最後按下 Disconnect 斷線按鈕則中止藍牙連線,並將個畫面元件回復到初始狀態等候下一次連線。

ffff

Arduino的CODE

App Inventor PWM LED
#include <SoftwareSerial.h>
#include <Wire.h>//引用二個函式庫SoftwareSerial及Wire

SoftwareSerial I2CBT(10,11);//定義PIN10及PIN11分別為RX及TX腳位

byte cmmd[20];
int insize, a;

void setup() {

   Serial.begin(9600); //Arduino起始鮑率:9600

   I2CBT.begin(57600); //藍牙鮑率:57600(注意!鮑率每個藍牙晶片不一定相同,請務必確認

   pinMode(9, OUTPUT);  //請注意您使用的Arduino 該腳位是否支援 PWM (會有~符號),否則會看不到效果

}

void loop() {

while(1){

   //讀取藍牙訊息
   if ((insize=(I2CBT.available()))>0){
      Serial.print("input size = ");
      Serial.println(insize);
      for (int i=0; i<insize; i++){
          Serial.print(cmmd[i]=char(I2CBT.read()));
          Serial.print(" ");
      }//此段請參考上一篇解釋

   }

if(insize==4){
a = (cmmd[0]-48)*10;
a=a+(cmmd[1]-48);
}
if(insize==3){
a=(cmmd[0]-48);
}
Serial.println(a);
analogWrite(9,map(a,0,80,0,255)); //使用 a 變數控制 LED 亮度
} //while
}

65 thoughts on “【雙A計劃】Part2:App Inventor 經由藍牙控制 Arduino LED 漸明漸暗

  1. 王駿家 says:

    if(insize==4){
    a = (cmmd[0]-48)*10;
    a=a+(cmmd[1]-48);
    }
    if(insize==3){
    a=(cmmd[0]-48);
    }
    Serial.println(a);
    analogWrite(9,map(a,0,80,0,255)); //使用 a 變數控制 LED 亮度
    } //while

    編譯後出現錯誤~說沒有宣告a變數?
    問題: ‘a’ was not declared in this scope
    那我需要怎樣改呢??

  2. Daniel Chen says:

    感謝你們的教學,很清楚明瞭
    但是我碰到一個問題
    假設現在slider的數值是123.45
    照理說應該收到一組insize=6的數據
    我卻收到六組insize=1的數據
    請問哪裡出錯了嗎?(讀取藍芽的部分是完全複製您的code的)

    • 偉和 says:

      您好 您可以再檢查一下藍牙鮑率是否與您的藍牙晶片一致,若還是發生此類的問題可以將報率調整至57600 bps 我這邊測試是沒有問題的

  3. 王駿家 says:

    不好意思~我想請問這段程式碼意思是什麼??

    if(insize==4){
    a = (cmmd[0]-48)*10;
    a=a+(cmmd[1]-48);
    }
    if(insize==3){
    a=(cmmd[0]-48);
    }

    • 偉和 says:

      您好 由於App Inventor 的slider 會讀取到小數後第一位,因此會產生1+2(個位數、小數點、小數點後一位)或2+2(十位數、個位數、小數點、小數點後一位)的字元。
      這樣Arduino在接收時,就會接收到3或4個字源資訊,所以我就依此判斷Arduino是接收到個位數或者是十位數,也因為只需要小數點前面的數值,
      所以在計算時自動忽略小數點及小數點後一位的計算過程

  4. Sean says:

    大大您好,您在APP Inventor,disconnect的按鈕按下去的時候,忘記call BlueTooth client.disconnect了,提醒一下~

    • CAVEDU 阿吉 - 雜工 says:

      您好,傳資料時掉封包是一定的,或多或少而已,無線傳輸尤其會這樣。至於藍牙的話,要看您傳送的資料是否為連續性資料,另外傳輸距離以及晶片本身品質也會有差異。

      這也是為什麼我們要在[雙A計畫] Part3 中,資料前面加上’a’ 這個標頭符號的原因。

  5. scott says:

    請問
    假設我有三首歌,我想要接著播放,要怎麼寫
    網路範例都是只單純播放一首
    我想設計成按下按鈕後,這三首歌一首播完接著下一首

    • CAVEDU 阿吉 - 雜工 says:

      您好,請參考我們的教學投影片,但要先確定您用的是哪一個函式庫,不過一定會有檢查檔案是否播放完畢的語法。所以您的需求應該是按鈕之後開始播第一首,檢查第一首播完之後,播第二首…

      我們在MakerBar辦的Arduino習作工坊是用 SimpleSDAudio 這個函式庫,如果有需要的話可以把相關檔案寄給您喔

  6. Eason says:

    您好,請問一下,我用 Linkit one 做這個範例,可以正常控制,但是當 CLock.Timer 設定低於 1000ms 時,會無法控制LED,手機數字顯示正常,感覺 Linkit one 的藍芽沒接收到,請問解決這個問題要從那方面下手呢? 謝謝您的範例,對初學的我很有幫助 🙂

  7. MICHAEL says:

    不好意思,我在編譯的時候發生錯誤

    bluetooth_LED.ino:1:1: error: expected unqualified-id before ‘<' token
    這是在哪個部分有錯誤?

  8. MICHAEL says:

    我想請問一下,我APP下載至手機之後,先用兩隻手機試試看(以配對),
    但是點開BT列後點以配對的手機,他顯示Error 507:Unable to connect.Is the device turned on?
    這是正常的嗎? 謝謝!

  9. WJ says:

    您好 您的教學非常棒
    有個問題想請教 如果我想讓arduino上的序列附的資料顯示在手機上
    我該怎麼去做呢

  10. seana says:

    您好,我在執行時,版子上的TX燈並沒有亮
    我程式都是照打,確定藍芽有連到!,這是哪裡出了問題??????

  11. prism says:

    您好,請問利用APP Inventor所編寫的軟體,無法連接連芽模組 (xm -10b)=Error 507:Unable to connect.Is the device turned on?
    有利用MIT的APP進行程式連接,也有使用一般的方式連接..但都失敗
    但如果用一般商店內的APP(如nRF等),確實有連線到藍芽模組,(確認方式=>連接=燈持續量、未連接=燈持續閃爍),BLUE 4.0支援確認
    而我另外嘗試使用”hm10-android-arduino-master”,此文章所提供的APP也是可以連接,所以我有點不明白這差異在哪裡了….

      • Dan Te says:

        if(insize==4){
        a = (cmmd[0]-48)*10;
        a=a+(cmmd[1]-48);
        }
        if(insize==3){
        a=(cmmd[0]-48);
        }
        Serial.println(a);
        a = map(a, 0, 90, 0, 179); //使用 a 變數控制 servo 角度
        myservo.write(a);
        } //while
        }//

        您好~我依照您所教的方式改成用slider控制伺服馬達角度(如上),可是
        好像會數值會亂跳耶,想請問要怎麼改會比較好呢?
        ps最後ㄧ行的”“前面要有//,不然直接copy會有錯誤
        及第一行#include 去掉才不會有錯誤

  12. huang says:

    您好我利用滑桿控制無刷馬達的轉速但似乎在傳值瞬間會爆衝
    能幫我看看是不是程式的問題嗎
    可以寄我的程式碼到你的email幫我看看嗎??

  13. Luke says:

    您好,我是剛開始試玩Arduino的新手

    我想請教一下,因為我最近有項專題,與版大您分享此項教學的功能類似

    只是我的手機部分需分4個功能按鍵,左、右、加快、加慢

    當我的麵包版上左右邊各有5顆LED燈(兩邊顏色不同)

    我想當我按左鍵時,左邊LED燈就會依序發亮

    當我按加快時,LED燈閃爍的速度就會加快

    當我按加慢時,LED燈閃爍的速度就會變慢

    右邊亦如此

    請問,我Arduino版的程式部分該怎麼做修正(如果是以版大您分享的程式碼為例的話)

    不好意思問了個麻煩的問題,如版大不嫌麻煩,還望請不吝賜教,謝謝!!

    • CAVEDU 阿吉 - 雜工 says:

      您好,請問您 Arduino 端的程式知道如何開始嗎? 請先把您所說的功能寫好,例如加快就是把 delay() 的參數降低。接著再定義 switch case 中的各個 case 去接收從 App Inventor 端所傳來的字元是什麼,這樣就搞定了。

  14. eric says:

    你好 如果用analogwrite輸出4組不同的pwm會產生訊號不穩是正常的嗎?

    有什麼方法可以解決?
    更換藍芽模組或是arduino板?

  15. William says:

    你好,我想請問,如果我現在插兩顆LED燈,想設計一個手機往右擺他會亮右邊,往左擺會亮左邊,請問程式碼要怎麼打?

    • CAVEDU 阿吉 - 雜工 says:

      您好,往右擺是使用哪種感測器呢?基本上這只要改一下 part1 就好。假設您使用姿態感測器,那就是XYZ某一軸的值滿足條件的話,發送某個字元,反之則是另一個字元。 Arduino 端只要把單一 LED 亮滅改成兩顆的指令就好,很簡單

  16. Lyons says:

    版主你好:
    我想請問一下 我直接燒入你的程式到mega板之後 我的led是恆亮的 Serial.monitor也是有數值回傳

    想請版主協助

  17. Jinwey says:

    你好!我想請問一下,為什麼我原封不動使用你的app及程式碼,但我使用拉桿時led燈卻會一直閃,我使用的是Uno板子跟hc-05藍芽
    再麻煩解答了

    • CAVEDU 阿吉 - 雜工 says:

      閃爍是正常的, App Inventor 的 bluetoothclient 元件說真的不是寫得很好, 您無法期待用藍牙去遙控時的效果會與單機操作相同. 如果真的很想讓效果更好的話, 應該需要找一下數值平滑方法來避免數值亂跳. 另一方面, LED的品質也有影響的喔

  18. 江冠德 says:

    版主您好~ 不好意思打擾~ 我是一位剛入門的Arduino 新手, 想請教一下, 如果我想使用兩組slider 分別控制兩個led燈進行亮滅,請問程式要怎麼寫才可以進行判斷?

    • CAVEDU 阿吉 - 雜工 says:

      您好,您可以用同一個事件去組合兩個 slider 的值(例如 255 與 123 組合成 255123 )之後發送出去給 Arduino 101, 板子收到再拆解即可。

      當然要連續發送兩次也是可以

發佈留言

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