本篇將教導大家如何使用手機讀取Arduino上類比腳位的數值,在此我們接上的是旋鈕式可變電阻。實際上當然不只可變電阻,所有的類比式感測器都可以這樣來使用!
範例程式請點我下載(App Inventor中文學習網檔案庫) App Inventor 2檔名:ReceiveDatafromArduino.aia
準備以下材料:
1 Android系統智慧型手機
2.Arduino相容開發板 (本文使用 Arduino MEGA2560)
3.藍牙收發接收器(本系列使用JY-MCU04 或 JY-MCU05),
4.麵包板
5.1個 1K歐姆可變電阻
先由下圖將藍牙及可變電阻接上Arduino
STEP1:App Inventor 編寫藍牙訊息接收程式
畫面元件很簡單,點選 BT List 之後,會顯示藍牙配對裝置清單,點選您已經配對好的藍牙裝置之後,Arduino的類比腳位資訊就會顯示在畫面中央的 TextBox 上。
這邊要注意的地方是要將Clock1的TimerInterval更改成10,也就是每 0.01秒更新一次。這麼一來才比較不會發生漏抓Arduino 發出來的訊息
程式說明:
本段程式重點在於手機在讀取Arduino訊號時,並不是直接向Arduino取得資料,而是採用間接的手法。先讓手機丟出一個訊號(本範例為發送49)。Arduino在等待接收到此訊號後,才會將感應器的數值以封包的形式傳送給手機。在第二個if後就是手機解讀Arduino所傳送過來的封包,並顯示到手機上。
在 Clock.Timer事件中,會先送出一個49的數字作為確認碼,Arduino 接收到這筆資料之後就知道要開始收資料了。Arduino 端是以 8 bit (一位元組)為單位來包封包,因此這邊也要這樣來組合。就能順利將數字還原了。
STEP2:Arduino 程式碼
#include <SoftwareSerial.h>
#include <Wire.h>
SoftwareSerial I2CBT(10,11);
byte serialA;
void setup(){
//define pin modes for tx,rx pin
pinMode(10,INPUT);
pinMode(11,OUTPUT);
Serial.begin(9600);
I2CBT.begin(38400); //與藍牙發射器的鮑率為 38400
}
void loop (){
byte Data[2];//此變數為封包
byte cmmd[20];
int insize;
int i=analogRead(A0);//讀取感應器值
serialA=I2CBT.read();//接收 Android 藍牙資料
// 將感應器數值包成封包,由於類比腳位的值為0~1023,加上’a',因此使用了三個Byte來傳送。
// i 除以 256 以及對 256 取餘數就是以位元組(8 bits)為單位來拆封包噢!
Data[0]=’a'; //確認碼
Data[1]=i/256;
Data[2]=i%256;
Serial.println(i);//顯示感應器數值
if (serialA == 49){//判斷從手機接收到的訊號是否為"49″
/* 傳送封包 */
for(int j=0;j<3;j++)
I2CBT.write(Data[j]);
serialA=0;
}
delay(100);
}