[雙A計劃] Part0:App Inventor 透過藍牙傳送訊號給 Arduino

由於智慧型手機的普及,幾乎人人都各自擁有一台,所以我將發一系列教導大家如何將手機與Arduino做結合。

若沒學過java的控制手機怎辦?別擔心,本系列所用的程式語言為appinventor,是給沒使用過java但想寫手機程式的玩家所使用。 想學習appinventor的玩家可以透過下列二個網址學習: 前往AppInventor官網

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

[雙A計劃] Part0:App Inventor 透過藍牙傳送訊號給 Arduino

[雙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 同時進行資料收發

English version

Arduino LED Blink

Arduino LED PWM

Arduino LED Blink (Arduino 101 with BLE)

Arduino LED PWM (Arduino 101 with BLE)

 

在撰寫程式前我們先準備以下材料:範例程式請點我下載(App Inventor中文學習網檔案庫)

材料清單:

1 Android系統智慧型手機

2.Arduino相容開發板 (本文使用Arduino Uno,其他的Arduino相容板也是類似的作法)

3.藍牙收發接收器(本系列使用JY-MCU04 or JY-MCU05) 請按照電路圖將電路接上(藍牙RX – Arduino D11, 藍牙TX – Arduino D10腳位)

bt

藍牙TX: Arduino D10 (RX)。藍牙RX: Arduino D11 (TX) 定義於I2CBT(10,11); 語法中

STEP1:App Inventor 編寫簡易的藍牙訊息發送程式。畫面上只有三個元件,由上而下依序為 ListPicker 與兩個Button。

1

程式碼說明:

在程式初始化時,設定各元件可否點選。並在 ListPicker 點選之前設定其內容為藍牙(BLuetoothClient)的配對裝置位址與名稱。

當 ListPicker 被點選之後,則對該點選位置發起連線。成功的話則設定各元件可否點選。

螢幕快照 2014-10-30 上午12.44.04

當按下[sens a word]按鈕後,Android 手機會經由藍牙發送一個字元「a」給Arduino,您可在 Arduino IDE 的 Serial Monitor 中看看是否正確接收。

按下[disconnect]按鈕,則斷開藍牙連線,並將各元件恢復連線前狀態。

螢幕快照 2014-10-30 上午12.44.13

STEP2:Arduino的CODE

#include <SoftwareSerial.h> 
#include <Wire.h>  //引用二個函式庫SoftwareSerial及Wire SoftwareSerial 
SoftwareSerial I2CBT(10,11); //定義PIN10及PIN11分別為RX及TX腳位 
void setup() { 
  Serial.begin(9600); //Arduino起始鮑率9600 
  I2CBT.begin(57600); //藍牙鮑率57600
  //(注意!此鮑率每個藍牙晶片不一定相同,請先確認完再填寫進去) 
} 

void loop() { 
  byte cmmd[20]; 
  int insize; 
  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.println(" ");  
    }//if
  } //for 
  }//while
}
App Inventor send char to Arduino

 

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

164 Comments on [雙A計劃] Part0:App Inventor 透過藍牙傳送訊號給 Arduino

  1. 你好,請問如果我要將Arduino資料傳到android要怎麼寫?

    • 您好 將Arduino資料傳到android這問題會在[雙A計劃] App Inventor 傳送訊號給 Arduino,使用藍牙 part3內提到近期內會轉寫完成

  2. 恩,謝謝
    你們的app inventor寫的很易懂,不過最近升級inventor2,有考慮將之前的書改掉嗎?

  3. Serial.print(“input size = “); 這邊在編譯的時候會有錯 ” ” 我改為這樣就好了
    Serial.println(insize);

    for (int i=0; i<insize; i++)
    Serial.print(cmmd[i]=char(I2CBT.read()));
    Serial.println(" “); 這邊在編譯的時候會有錯 " " 我改為這樣就好了

  4. Serial.print(“input size = “);這邊在編譯的時候會有錯 ” ” 我改這樣就好了
    Serial.println(insize);

    for (int i=0; i<insize; i++)
    Serial.print(cmmd[i]=char(I2CBT.read()));
    Serial.println(" “); //這邊在編譯的時候會有錯 " " 我改這樣就好了

    APP 端也用好 可是 Arduino端 都沒字元顯示

  5. 你好
    我兩邊程式都用好,也都接好後
    用手機測試 藍牙有連上
    但很奇怪都不會顯示值
    請問有解決方法嗎??

    • 您好, 可否再描述清楚一點呢? 請問各項腳位設定是否正確?

      • 腳位也正確 但是按 send a word 時
        在 Arduino IDE 的 Serial Monitor 裡面不會顯示 “a”
        I2CBT.begin(57600); (我的藍芽鮑率9600有改成9600)
        是否這邊有錯誤?(57600跟9600都已試過)
        Serial.begin(9600); 這裡是否要改
        謝謝回復!

  6. 問題解決了 是 Arduino IDE 的 Serial Monitor 開啟後要等幾秒鐘才會顯示值

  7. 我也需要學習如何將 Arduino 得到的數值轉到手機上,期待PART3,感謝

  8. 請問下次範例能將右側的”Components”也照進去嗎?
    因為剛剛哈了很長的時間才發現原來BTList是List而不是按鈕

    謝謝

  9. 請問我想要控制鐵捲門,是否可以多支手機配對一藍芽?(網路上說主從配對可1對7,因我買uno和hc-05,沒法做AT,所以沒法試驗)

    • 您好,以這樣的專題來說Arduino是被控端,所以一個時間內只能被一個外部裝置來控制(例如手機)。配對則數量多少都沒問題。手機要能夠一次控制多少個藍牙 client 就要看該手機了。

      請參考這隻影片

      • 您好,我想用手機取代鐵捲門遙控器,但我目前發生A手機連上HC-05,B手機想連結HC-05卻無法連結,也就是說只要有人連結上,他人就無法連上
        這樣會發生如果一人忘了登出,他人想要進家門,就無法控制鐵捲門了,
        請問我該如何克服此問題?

        • 您好,Arduino 作為藍牙 client 本來就是這樣。不過手機端的程式過一段時間就會斷開連結(不是登出的概念),或是自己在手機裡面寫app 移到背景之後就自動斷開藍牙連線(Android 或 app inventor 都簡單做到)

          或者要一勞永逸的話就是用 Xbee 讓 Arduino有無線網路功能,但是 Xbee 不便宜。不然就是改用 Raspberry Pi 的 GPIO腳位來控制鐵捲門囉

  10. 您好,我想用APP inventor 把a值傳輸給電腦
    請問用這隻程式可以嗎?還是說有哪些地方需要修改?
    因為我試了,他跟電腦好像連不上

  11. 您好,如果藍芽模組改成 HC-05 這可以麻? 因為找不到文中所使用的兩種藍芽模組

  12. 您好,承上文如果藍芽模組改成 HC-05可以, HC-05好像是主機從機一體, 用的時候須設為主機嗎? 不知一般HC-05出廠時是已為主機或從機?

  13. 你好,請問這個程式如果手機沒開藍芽要怎讓手機藍芽自動打開。

  14. 你好我使用的是UN0板不是MEGA2560這樣有辦法做嗎,因為我看到圖片是UN0照上面接的卻搜尋不到藍芽

  15. 不了解這段設定意義為何?
    void setup() {
    Serial.begin(9600); //Arduino起始鮑率9600
    I2CBT.begin(57600); //藍牙鮑率57600
    //(注意!此鮑率每個藍牙晶片不一定相同,請先確認完再填寫進去)
    }

    它是指板子速率是9600;藍芽是57600嗎?
    我要如何知道藍芽的速率? 如何測得?

  16. Hi, 請問可以使用 BT 4.0 方式來傳輸嗎?

  17. 請問為何我從Serial Monitor收到的是ASCII碼?不是已經轉成字元了嗎?

  18. 您好,經過程式撰寫完成後,用手機輸入後,我測試過後在arduino Serial Monitor 上面所顯示如下:
    input size = 2
    6
    158
    這樣的顯示方式,是否正確?
    或是有問題的,因為我沒看到有”a”這個英文字,謝謝您的幫忙。

    • 您好 有確認藍牙的鮑率是否與您程式撰寫相符?

      • 您好,剛剛已經解決了,其問題是藍牙出問題,剛剛在測試新的藍牙就沒有問題了
        所用出來的arduino Serial Monitor 上所顯示的確實是
        input size = 1
        97
        所使用的藍芽是PSOC教學版中的FLAG-1611A
        原本設定為19200但跑出來是不正確的數字為:
        input size = 2
        6
        158
        後續接上PSOC教學上的硬體,並體重新將藍牙RESET後,鮑率為9600
        所呈現的狀態就變正常了。
        input size = 1
        97
        鮑率對通訊方面真的很重要,非常謝謝您的回覆與幫忙。

  19. 請問 假如以上程式 用invemtor2去做 藍牙傳送資料會有問題ㄇ

  20. 請問 我線路都檢查了很多遍 程式碼也照著拉 為什麻藍牙有連接到(紅燈有停止閃爍)、可手機資料卻沒傳輸過去?

    • 您好,請確認 Arduino 端是否有開始執行程式。藍牙發射器只要有供電就會閃爍,連上線就會恆亮。但也有可能此時並未執行任何程式。您可以打開 Serial Monitor 看看是否出現正確的訊息就知道程式有沒有在跑了

  21. 請問 可以 協助 教導 關於 arduino 用BLE4.0 達到跟 IPHONE手機通訊 傳資料的 功能嗎? 謝謝!

  22. 你好: 請問可以給我Android那邊的原始碼嗎?? 想要看看那邊是怎麼寫的 謝謝!

  23. 請問Part0:App Inventor 透過藍牙傳送訊號給 Arduino的手機程式在哪裡下載呢 我目前只有找到part1~3的耶~

  24. 請問123 Circuits 線上模擬電路 要如何加入其他模組呢 比如說WIFI,紅外線等 我主要想測試藍芽HC-05的模組 謝謝~

  25. 您好 我是Arduino 的新手 目前使用的板子為Arduino UNO & 藍芽V3模組
    目前遇到的問題是 V3模組上 與手機都有連結到,但在Arduino 的 Monitor無法顯示 “input size=”
    簡單說就是空白..也參考上面的問題後 等了蠻久的還是沒有
    SoftwareSerial I2CBT(10,11);這個腳位 是每塊 UNO都固定的嗎?
    麻煩您了

  26. 問答後已解決…原來是I2CBT (0,1)

  27. 請問 我要用藍牙連接做專題 只要藍牙斷開 arduino上的蜂鳴器與手機都會警告 手機方面的app要怎麼設計

    • 您好,這兩端都要做事喔。

      手機端就是使用 BluetoothClient 的 IsAvailble指令去檢查有沒有連線,沒有的話就做對應的動作。Arduino 端也是一樣的概念,透過 serial.available() 去檢查即可。

  28. 你好,请问我为什么一直找不到elements 和selection 这两个元素啊,我用的是AI2

  29. 這一系列的分享真的學到很多!
    但現在如果我現在藍芽不使用uart port的連線方式
    改由直接使用藍芽USB dongle

    那我程式碼
    SoftwareSerial I2CBT(10,11); 定義腳位

    以及接收

    if ((insize=(I2CBT.available()))>0)
    {
    Serial.println(insize); //顯示接收多少訊息
    for (int i=0; i<insize; i++) {
    Serial.print(cmmd[i]=char(I2CBT.read()));//將接收的訊息顯示出來
    Serial.println(" ");

    需要怎麼變化呢??

  30. 您好,我使用的藍芽是HC-05,Arduino是 UNO版
    文章中的步驟有確實完成,但是Arduino 的 Monitor沒有顯示任何東西
    從網頁中的範例下載使用也是相同問題
    請問是什麼問題呢?

  31. 我想要請問一下!!!
    我照著您的接法接完後Arduino也燒完程式了
    要連接藍芽模組可是卻一直無法與手機連接不上去
    通電的瞬間(藍芽模組會一直閃爍)可以連接上去(使用手機本身的藍芽連結,並不是程式上的藍芽BTLIST),但是過了幾秒之後(藍芽模組會恆亮)就會自動斷掉(藍芽模組一直亮著但連不上),然後再也連不上去了
    (會一直顯示無法與XXX通訊),如果用程式連的話也是顯示發生錯誤無法連結
    我的藍芽模組是4.0的,型號是(Bluetooth Module XM-10B BLE),還是因為是4.0的原因所以手機與藍芽模組連接不到嗎??

  32. 你好! 請問可以給我android端的code嗎? 我想了解你的藍芽連接怎麼寫

  33. 大大你好~
    我是用HC-06藍芽模組
    照您的方式接,程式已寫入,但在 Arduino IDE 的 Serial Monitor 裡面不會顯示 “a”
    是哪邊出問題了呢? 還是藍芽模組的關係? 求大大解題

  34. 謝大大!! 問題解決了. 出現 input size = 1
    97

  35. 您好,我想請問一下
    此APP也可以使用在PSoC裡嗎? 型號是CY8C29466
    如果可以,那上面Arduino的CODE要加在PSoC專案哪裡呢?

  36. 你好~請問我要如何用APP INVENTOR 2 將一個GPS座標傳送給UVA?
    程式的架構大概是什麼樣子?

  37. 不好意思 
    我在案 bt list 後選了 我ardunio的連線後 

    他要求 我輸入 pin瑪  
    不管我輸入 0000 或 1234
    他都會說 eror507 unable to disconnect
    不知道為甚麼…

  38. 不好意思補充一下 我進at模式 我按at他的回應有ok 

    但用從您網站下載的app就一直連不起來 led燈不停閃爍 不會恆亮

  39. 你好! 為什麼我沒有beforepacking這個選項?? 其他都有

  40. 為什麼我買JY-MCU V1.06從機依照教學設定,都行不到AT指令和被android手機搜索到??

    JY-MCU05 本身是否主從一體才能行到AT指令和被android手機搜索到?

  41. 您好: 請問我要如何設定讓藍芽自動連線配對呢??
    (想解決使用者如果常常離開藍芽接收範圍之後又回來,還能自動連線的功能)
    請老師幫忙解答!! 謝謝!!

    • 您好,也許您可以試試看用 Clock.Timer 去定期檢查對於指定裝置的連線是否存在。用 BluetoothClient 的 isDevicedPaired 與 isConnected 這兩個指令分別去檢查,這樣應該是做得到的。

  42. 你好,如何寫ardunio才以得到以下效果呢?
    Appinventor我已改寫成可傳送一段text or string去

    但是當我SEND 例如 “abc”
    output 是
    input size = 1
    97
    input size = 2
    98
    99

    我希望得到的OUTPUT是
    input size = 3
    97
    98
    99

  43. 想請問一下 BT4.0 Inventor是不是不支援

  44. 請問 JY-MCU05 哪裡買

  45. 您好 我換頁以後 藍芽就斷線了 有辦法解決嗎

  46. 不好意思想請問一下,我都有依照您寫的,手機有先配對完,但APP裡面就顯示503ERR等等的 錯誤,是不是ListPicker 可以設定名稱跟蜜碼?

  47. 您好,我照著您的APP Inventor程式作,但是我先用手機的藍芽介面跟我的藍芽模組進行配對後,再進入APP裡面的BTList點藍芽裝置然後再配對一次,
    結果手機顯示”Error 507:Unable to connect.Is the device turned on?” 請問這是什麼問題?

    • 這個問題有可能來自於 App Inventor 本身在某些Android手機上無法打開藍牙的權限(但非常少見),如果您很確定所有操作都正確的話,還是出現這個錯誤訊息的話,那就只能換一支手機來交叉測試看看囉。

  48. 您好,我在手機上跟HC-05配對且輸入密碼後,再進去BTList裡面選裝置,手機卻跳出Error 507:Unable to connect,請問這個問題要怎麼解決?

  49. 如我是要arduino 傳訊號到app
    該怎麼做?

  50. 你好我想用HC05代替文中的藍芽,已將HC05設定為從機,但手機方面卻找不到此藍芽存在
    請問是什麼問題呢? 謝謝

  51. Arduino:1.7.3 (Windows 8.1), 板子:”Arduino Uno”

    建置選項已變更,重建所有

    LED____.ino:1:12: error: stray ‘#’ in program

    LED____.ino:1:1: error: expected unqualified-id before ‘ 偏好設定裡啟用。

    它說錯誤

  52. 我每次按下連線都會跳出
    error 503 the specified address is not a valid bluetooth mac address

  53. 用電腦連線藍芽模組傳資料給Arduino能正常收發,我在常見問題那看到”BluetoothClient不支援BLE(藍芽4.0)”,這有可能是原因嗎?

  54. 我後來發現BLuetoothClient.AddressesAndNames回傳的格式為(MAC碼+名稱),多了()括號,當我單獨提取MAC碼後就能連線了……只有我這樣!?

  55. 你好,想問一下,這個程式能夠透過手機藍芽連接ARDUINO,那能不能用這程式手機連手機藍芽傳輸?
    我知前有看你網站的lesson6,http://www.appinventor.tw/lesson6 但已經改版成2了,有些功能找不到就卡關了(EX:definition)
    能指點一下怎麼手機連手機藍芽傳輸嗎?謝謝

  56. 您好,請問一下,這個程式是要先進行配對才會有藍牙裝置出現嗎?
    我還未配對藍牙裝置,出現這樣的畫面是正常的嗎?
    http://i.imgur.com/HbSCEL4.png
    另外請問這個程式是否能連結藍牙模組後與Arduino以外的微處理器連接?

  57. 藍芽沒有收到 // 十月 5, 2015 at 11:41 上午 // 回覆

    請問如果手機完全沒有接收到藍芽的型號主要是哪裡有錯?
    藍芽裝置只有亮左邊的綠燈(STATE)

  58. 請問arduino心跳感測透過藍芽傳送至手機的APP大概怎麼寫?謝謝

  59. 您好,想請問如何把藍芽資料寫死在APP上?
    因為程式對過好幾遍,但明明有連上卻出現錯誤說,請確認藍芽裝置是否開啟
    藍芽是4.0的

  60. 請問一下所謂手機配對藍芽是用inventor內建的虛擬手機來配對,還是用自己實體手機去配對arduino呢?
    我目前也是一片漆黑的畫面..

  61. 您好,回覆完之後我直接用手機USB連接電腦,
    點進去出現98:D3:31:30:0B:3A HC-06這樣是哪邊出問題呢?

  62. 請問手機如果藍芽如果4.0的,而且HC06也能接收4.0
    那麼APP INVENTOR不支援,手機還是不接收到嗎?
    謝謝!

  63. 問題已解決

  64. 我已確定已經配對完成,但進去點選時出現
    error 503 the specified address is not a valid bluetooth mac address
    這個訊息,請問是有什麼問題呢?

  65. 請問我藍芽配對連線成功了 但是編譯上傳arduino code 的時候出現avrdude: stk500_getsync(): not in sync: resp=0x00

    手機按SEND ARDUINO 也看不到 是哪裡出了問題嗎?

  66. 請問”BluetoothClient1.AddressandNames”要去哪邊選取?? 謝謝老師

  67. 您好 我想用藍芽 從手機 把數值傳輸給電腦上用C#寫的一個程式
    然後電腦上的城市根據收到的數值做出相應的動作
    請問用這隻程式可以嗎? 那在電腦C#接收藍芽傳值的部分該怎麼寫呢?

  68. 不好意思 可以麻煩幫我看程式哪邊有錯嗎
    因為這是接手別人的東西,所以我看了老半天不知道哪邊有錯誤

    顯示的錯誤是

    c:\arduino-nightly-windows\arduino-nightly\hardware\tools\avr\bin\../lib/gcc/avr/4.9.2/../../../../avr/bin/ar.exe: unable to rename ‘core\core.a’; reason: Permission denied

    exit status 1
    開發板 Arduino/Genuino Uno 編譯錯誤。

    以下是程式碼 拜託可以幫我看一下哪邊有錯嗎

    #include
    #include

    IRsend irsend;

    // the maximum received command length from an Android system (over the bluetooth)
    #define MAX_BTCMDLEN 150

    // 建立一個軟體模擬的序列埠; 不要接反了!
    // HC-06 Arduino
    // TX RX/Pin10
    // RX TX/Pin11
    SoftwareSerial BTSerial(10,11); // Arduino RX/TX

    byte cmd[MAX_BTCMDLEN]; // received 128 bytes from an Android system
    unsigned int pass[100]={0};

    int RECV_PIN = 2; // 使用數位腳位2接收紅外線訊號
    IRrecv irrecv(RECV_PIN); // 初始化紅外線訊號輸入
    decode_results results; // 儲存訊號的結構

    void setup() {
    Serial.begin(9600); // Arduino起始鮑率:9600
    BTSerial.begin(9600); // HC-06 出廠的鮑率:每個藍牙晶片的鮑率都不太一樣,請務必確認
    irrecv.enableIRIn(); // 啟動接收
    }
    int code=1,reset=1,count=0;
    void loop() {

    if(reset==1) { //把存編碼的陣列清成65533
    reset=0;
    for(int i=0;i<100;i++)
    pass[i]=65533;
    }

    if(code==1) {
    BTSerial.begin(9600);
    delay(100);

    byte rec=char(BTSerial.read());
    //用來接收手機端傳來的一個byte,依照這個byte的值去決定arduino的下一個動作

    if(rec=='1' ) { //從手機收到1,arduino接收遙控器編碼並傳到手機
    while(true) { //接收從遙控器傳送的紅外線編碼
    Serial.println("hi");
    if (irrecv.decode(&results)) {
    dump(&results);
    irrecv.resume(); // Receive the next value
    break;
    }
    }

    byte b=0;
    BTSerial.write(b);
    for(int i=0;i>8,c2=pass[i];
    BTSerial.write(c1);
    BTSerial.write(c2);
    }
    }

    if(rec==’2′) { //從手機接收到2,arduino接收手機的編碼並傳送給家電
    int counter=0; //用來穩定接收固定的byte
    while(counter!=150) { //arduino經由藍芽從手機接收編碼
    if(BTSerial.available()>0) {
    cmd[counter]=char(BTSerial.read());
    counter++;
    }
    }
    for(int i=0;i<150;i+=2) { //把接收到的編碼合併成一個可傳送的陣列
    unsigned short int n= cmd[i]<<8 | cmd[i+1];
    pass[i/2]=n;
    }
    for(int i=0;i=0;i–) { //判斷編碼的長度,在傳送時使用
    if(pass[i]==65533)
    j_length–;
    else {
    j_length++;
    break;
    }
    }
    Serial.println(j_length);
    irsend.sendRaw(pass,j_length,38); //傳送紅外線編碼給家電
    irrecv.enableIRIn(); //再次啟動紅外線接收
    reset=1; //傳送陣列清空
    }
    }
    BTSerial.end();
    }

    void dump(decode_results *results) { //接收遙控器的編碼並轉成原始碼
    // Dumps out the decode_results structure.
    // Call this after IRrecv::decode()
    Serial.println(“Ya”);
    count = results->rawlen;
    for (int i = 1; i rawbuf[i]*USECPERTICK;
    Serial.print(pass[i-1]);
    //Serial.print(results->rawbuf[i]*USECPERTICK);
    }
    else {
    pass[i-1] = (unsigned short)results->rawbuf[i]*USECPERTICK;
    Serial.print(pass[i-1], DEC);
    }
    Serial.print(” “);
    }
    Serial.println();
    }

  69. 補充一下 程式一開頭的 #include 後面有 SoftwareSerial.h 和IRremote.h

  70. 請問藍芽接收器用HC-06可以嗎? 程式需不需要改呢

  71. 請問App Inventor有辦法與google map做搭配,將google map上標記的經緯度用藍牙的方式傳送到arduino嗎?

Leave a comment

Your email address will not be published.


*