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

由於智慧型手機的普及,幾乎人人都各自擁有一台,所以我將發一系列教導大家如何將手機與Arduino做結合。 若沒學過java的控制手機怎辦?別擔心,本系列所用的程式語言為appinventor,是給沒使用過java但想寫手機程式的玩家所使用。 想學習appinventor的玩家可以透過下列二個網址學習: 前往AppInventor官網

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

[雙A計畫] 藍芽模組(HC05/06)常用指令教學

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

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

 

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

    • 薛 皓云 says:

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

  1. says:

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

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

  2. says:

    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端 都沒字元顯示

  3. says:

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

      • says:

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

  4. Rete says:

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

    謝謝

  5. ruru says:

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

      • ruru says:

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

  6. 小豪 says:

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

  7. sswangttu says:

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

  8. 阿銘 says:

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

  9. jshpapa says:

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

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

  10. da7752002 says:

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

      • da7752002 says:

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

  11. 咚咚 says:

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

    • CAVEDU 阿吉 - 雜工 says:

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

  12. Aaron says:

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

  13. Aaron says:

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

  14. Floris says:

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

  15. Jason says:

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

    • CAVEDU 阿吉 - 雜工 says:

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

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

  16. yuchun says:

    這一系列的分享真的學到很多!
    但現在如果我現在藍芽不使用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(" ");

    需要怎麼變化呢??

  17. YoZhe says:

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

  18. Yu cheng says:

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

  19. Antony Chen says:

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

  20. 阿威 says:

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

  21. william0441 says:

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

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

  22. william0441 says:

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

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

    • CAVEDU 阿吉 - 雜工 says:

      您好,beforePicking 是 ListPicker / TimePicker / DatePicker 元件才有的事件。其他例如 Spinner , ListView 只有 AferPicking 事件。ListPicker 長得和Button 一模一樣,是否這邊搞錯了呢?

  23. Vincent says:

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

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

  24. 阿誠 says:

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

    • CAVEDU 阿吉 - 雜工 says:

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

  25. Vincent says:

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

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

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

  26. Jerry says:

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

  27. Jack says:

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

    • CAVEDU 阿吉 - 雜工 says:

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

  28. Jack says:

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

  29. 小柯瑞 says:

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

  30. 123 says:

    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 ‘ 偏好設定裡啟用。

    它說錯誤

  31. 租椅子 says:

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

  32. 租椅子 says:

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

  33. kyo says:

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

  34. Jason R says:

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

  35. 藍芽沒有收到 says:

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

  36. KK says:

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

  37. JJ says:

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

  38. J says:

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

  39. Victor says:

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

  40. Douron says:

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

  41. 阿興 says:

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

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

  42. snake811216 says:

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

  43. Greg says:

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

    顯示的錯誤是

    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();
    }

  44. HT says:

    請問我藍牙跟手機有連接到了,包率也設9600,但是手機傳來接收到的字在電腦上看都是正方形框框,arduino也無法判斷是什麼字,請問該如何解決呢?謝謝

  45. 紀力維 says:

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

  46. 陳俞佑 says:

    不好意思想請問一下,如果我要把pluse sensor和gps-6m的訊號透過藍芽hc-05傳至手機,那麼uno(或leo版)腳位該如何設置呢?
    因為兩個組件(藍芽和gps)的腳位都有RXD跟TXD,所以變成會有兩個
    SoftwareSerial Genotronex(10, 12); // RX, TX 設置藍芽腳位
    SoftwareSerial mySerial(10, 9); // RX, TX GPS藍芽腳位
    心跳本身的腳位只有s和+-而已,想請問這樣程式碼的腳位該如何修改呢?
    這是我用到的程式碼,只是我還沒將心跳及gps結合而已: https://drive.google.com/file/d/1UIOgaLTIr0x_zAHazl52QPd7muogx1PY/view?usp=sharing

    • 許 鈺莨 says:

      你好,你可以用SoftwareSerial指令將藍牙和GPS的RX、TX寫在不同腳位,
      例如:SoftwareSerial Genotronex(10, 11); SoftwareSerial GPS(8, 9);
      記得還要寫Serial.begin(9600);//序列埠監控視窗看的
      Genotronex.begin(9600);//藍牙傳輸的資料量
      GPS.begin(9600);//GPS傳輸的資料量
      然後你的心跳感測器”+”是接5V或3.3V(沒意外的話)、”-“是接GND,然後”S”是Singnal(訊號),我看了程式的註解之後是接在Arduino的A0

  47. 楊甯凡 says:

    您好
    我手機連接藍芽時可以連到
    然後到app搜尋時也可以搜到
    但要點連接時就會出現 error:503 the specified address is not a valid bluetooth mac address
    已經爬過許多文
    但都沒有人解決相關的問題

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *