【雙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

[pastacode lang=”c” message=”App Inventor PWM LED” highlight=”” provider=”manual” manual=”%23include%20%3CSoftwareSerial.h%3E%0A%23include%20%3CWire.h%3E%2F%2F%E5%BC%95%E7%94%A8%E4%BA%8C%E5%80%8B%E5%87%BD%E5%BC%8F%E5%BA%ABSoftwareSerial%E5%8F%8AWire%0A%0ASoftwareSerial%20I2CBT(10%2C11)%3B%2F%2F%E5%AE%9A%E7%BE%A9PIN10%E5%8F%8APIN11%E5%88%86%E5%88%A5%E7%82%BARX%E5%8F%8ATX%E8%85%B3%E4%BD%8D%0A%0Abyte%20cmmd%5B20%5D%3B%0Aint%20insize%2C%20a%3B%0A%0Avoid%20setup()%20%7B%0A%0A%C2%A0%20%C2%A0Serial.begin(9600)%3B%20%2F%2FArduino%E8%B5%B7%E5%A7%8B%E9%AE%91%E7%8E%87%EF%BC%9A9600%0A%0A%C2%A0%20%C2%A0I2CBT.begin(57600)%3B%20%2F%2F%E8%97%8D%E7%89%99%E9%AE%91%E7%8E%87%EF%BC%9A57600(%E6%B3%A8%E6%84%8F%EF%BC%81%E9%AE%91%E7%8E%87%E6%AF%8F%E5%80%8B%E8%97%8D%E7%89%99%E6%99%B6%E7%89%87%E4%B8%8D%E4%B8%80%E5%AE%9A%E7%9B%B8%E5%90%8C%EF%BC%8C%E8%AB%8B%E5%8B%99%E5%BF%85%E7%A2%BA%E8%AA%8D%0A%0A%C2%A0%20%C2%A0pinMode(9%2C%20OUTPUT)%3B%20%C2%A0%2F%2F%E8%AB%8B%E6%B3%A8%E6%84%8F%E6%82%A8%E4%BD%BF%E7%94%A8%E7%9A%84Arduino%20%E8%A9%B2%E8%85%B3%E4%BD%8D%E6%98%AF%E5%90%A6%E6%94%AF%E6%8F%B4%20PWM%20(%E6%9C%83%E6%9C%89~%E7%AC%A6%E8%99%9F%EF%BC%89%EF%BC%8C%E5%90%A6%E5%89%87%E6%9C%83%E7%9C%8B%E4%B8%8D%E5%88%B0%E6%95%88%E6%9E%9C%0A%0A%7D%0A%0Avoid%20loop()%20%7B%0A%0Awhile(1)%7B%0A%0A%C2%A0%20%C2%A0%2F%2F%E8%AE%80%E5%8F%96%E8%97%8D%E7%89%99%E8%A8%8A%E6%81%AF%0A%C2%A0%20%C2%A0if%20((insize%3D(I2CBT.available()))%3E0)%7B%0A%C2%A0%20%C2%A0%20%C2%A0%20Serial.print(%22input%20size%20%3D%20%22)%3B%0A%C2%A0%20%C2%A0%20%C2%A0%20Serial.println(insize)%3B%0A%C2%A0%20%C2%A0%20%C2%A0%20for%20(int%20i%3D0%3B%20i%3Cinsize%3B%20i%2B%2B)%7B%0A%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%C2%A0Serial.print(cmmd%5Bi%5D%3Dchar(I2CBT.read()))%3B%0A%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20Serial.print(%22%20%22)%3B%0A%C2%A0%20%C2%A0%20%C2%A0%20%7D%2F%2F%E6%AD%A4%E6%AE%B5%E8%AB%8B%E5%8F%83%E8%80%83%E4%B8%8A%E4%B8%80%E7%AF%87%E8%A7%A3%E9%87%8B%0A%0A%C2%A0%20%C2%A0%7D%0A%0A%20if(insize%3D%3D4)%7B%20%20%0A%20%20%20%20%20%20a%20%3D%20(cmmd%5B0%5D-48)*10%3B%0A%20%20%20%20%20%20a%3Da%2B(cmmd%5B1%5D-48)%3B%0A%20%7D%0A%20if(insize%3D%3D3)%7B%0A%20%20%20%20%20%20a%3D(cmmd%5B0%5D-48)%3B%0A%20%7D%0A%20Serial.println(a)%3B%0A%20analogWrite(9%2Cmap(a%2C0%2C80%2C0%2C255))%3B%20%20%20%2F%2F%E4%BD%BF%E7%94%A8%20a%20%E8%AE%8A%E6%95%B8%E6%8E%A7%E5%88%B6%20LED%20%E4%BA%AE%E5%BA%A6%20%20%0A%20%7D%20%2F%2Fwhile%0A%7D”/]

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, 板子收到再拆解即可。

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

發佈留言

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