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

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

[雙A計畫] 常見問題整理

[雙A計劃] Part1:App Inventor 經由藍牙控制 Arduino LED 亮滅

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

[雙A計劃] Part3:Android 手機透過藍牙接收 Arduino 類比腳位狀態

[雙A計劃] Part4:App Inventor 藍牙遙控 Arduino 雙輪機器人

[雙A計劃] Part5:Paperduino 藍牙控制 LED 閃爍

[雙A計畫]Part6:Arduino 傳兩筆資料到 Android 手機

[雙A計劃] Part7:Arduino超音波感測距離回傳數值給Android手機

[雙A計劃] Part8:Android 手機對 Arduino 同時進行資料收發

範例程式請點我下載(App Inventor中文學習網檔案庫)  App Inventor 2檔名:SlideControlLED.aia

 

材料清單:

1 Android系統智慧型手機

2.Arduino相容開發板 (本文使用 Arduino MEGA2560)

3.藍牙收發接收器(本系列使用JY-MCU04 或 JY-MCU05)

4.麵包板

5.1個220歐姆色碼電阻

6.1顆LED

先由下圖將藍牙發射器及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

STEP2:Arduino的CODE

#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
}
App Inventor PWM LED

About 偉和 (21 Articles)
單純的初音迷,世界以初音為中心

58 Comments on [雙A計劃] Part2:App Inventor 經由藍牙控制 Arduino LED 漸明漸暗

  1. 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. 我想把part1~part3 合成同一個程式,請問要如何運用?

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

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

  4. 請問一下 我的板子是UNO的有沒有關係

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

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

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

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

  7. 您好:
    我想請問藍牙傳輸的正確率大概是多少?
    因爲有時候他的值會出錯QQ
    謝謝

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

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

  8. 您好
    我想請問 我在滑動拉桿的時候 LED 會閃爍
    是藍芽晶片 出了問題嘛

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

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

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

  10. LED不會亮…不知道哪邊出問題了0.0….求救…藍芽有連上 程式是照打的但是沒顯示

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

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

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

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

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

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

  16. 您好,請問利用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也是可以連接,所以我有點不明白這差異在哪裡了….

    • App Inventor 目前不支援 BLE喔

      • 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 去掉才不會有錯誤

  17. 請問一定要用寫入時間嗎?不知為何在執行調整亮度的時候手機會當機?

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

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

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

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

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

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

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

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

    右邊亦如此

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

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

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

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

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

  21. 讚!
    Arduino程式第2行:#include
    應該可以remark掉
    程式內並沒有用到Wire.h內的相関函數或常數

    TedLee

  22. 你好,我想請問,為何我找不到 when ___.beforepicking do 的咖啡色方塊

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

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

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

    想請版主協助

  25. 想要用拉桿來讓馬達轉動 請問可用這種方法嗎?還是有其他的程式可寫?

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

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

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

Leave a comment

Your email address will not be published.


*