2015年5月24日 星期日

APP Inventor 2 藍芽傳送字元及滑軌數值至Arduino

功能:Android 手機APP傳送字串至Arduino
說明:
(1)使用藍芽,
(2)APP傳送不同按鍵所代表之字元、以及滑軌數值至Arduino
(3)使用SoftwareSerial,藍芽模組接pin10, 11,0,1留給Serial Monitor
(4)將欲傳送之字元與數值組成字串,並以逗點分開。例如傳送'a'和123,組成字串"a,123,"
(5)Arduino接收字串後,將字串分開成"a"和"123"二個字串,再分別轉成字元'a'和整數123

APP Inventor 2





















初始設定、藍芽選單、斷線設定
























宣告全域變數char_b儲存按鍵字元、整數num儲存滑軌數值、send儲存組合後字串

























使用計時器 計時時間設為20ms
當Slider位置改變時啟動計時器
計時時間到再傳送字串
這是將timer作為delay
避免滑軌移動太快,傳送字串太快,Arduino端接收字串太慢,會導致接收到2組甚至3組字串

button4~button12分別對應字元'a'~'i'
當按下按鍵時,同樣傳送組合字串,但不做delay


























上圖為button4對應程式
當button4按下,button4不可用,其餘可用
char_b設為a,組合字串send,再以藍芽Client傳送字串send
其他button5~12依照類似作法

Arduino程式
#include <SoftwareSerial.h>
#include <Wire.h>//引用二個函式庫SoftwareSerial及Wire
SoftwareSerial I2CBT(10,11);//定義PIN10及PIN11分別為RX及TX腳位
//注意此RX, TX分別接藍芽模組的TX, RX
int inSlider=0;
int Position1,Position2;
char temp[]="e";
char button;
String myString,tempString;
void setup() {
   Serial.begin(9600); //Arduino起始鮑率:9600
   I2CBT.begin(57600);
//藍牙鮑率:57600(注意!每個藍牙晶片的鮑率都不太一樣,請務必確認
   I2CBT.setTimeout(5);
   pinMode(9,OUTPUT);
   Serial.println("Hello"); 
}

void loop() {
   // 檢查是否有資料可供讀取
   while (I2CBT.available()) {
     myString=I2CBT.readString();
     split();
     analogWrite(9,inSlider);
     Serial.print(myString);
     Serial.print(" ");
     Serial.print(button);
     Serial.print(" ");
     Serial.println(inSlider);
   }
}
void split(){
     Position1=myString.indexOf(',');
     Position2=myString.indexOf(',',Position1+1); 
     tempString=myString.substring(0,Position1);
     strcpy(temp,tempString.c_str());
     button=temp[0];
     tempString=myString.substring(Position1+1,Position2);
     inSlider=tempString.toInt();
}
此處仍然使用readString()來讀取字串
存放在myString
其資料型態是String

使用split()來分離字串
在split()中,採用indexOf()來找出逗點的位置
indexOf()是Arduino中String class的函數

Position1=myString.indexOf(',');找出第一個逗點的位置並存放在Position1
(註:位置編號是由0開始,即第一個字元是0,第二個字元是1.....) 

Position2=myString.indexOf(',',Position1+1);找出第二個逗點的位置並存放在Position2

tempString=myString.substring(0,Position1);利用substring()分離出第一個逗點前的字串
並暫時存放tempString,此資料型態為String

strcpy(temp,tempString.c_str());利用c_str()將其由String轉為char[],並複製至temp[]
button=temp[0];字元button為temp[0]

tempString=myString.substring(Position1+1,Position2); 
利用substring()分離出第一個逗點和第二個逗點間的字串
並暫時存放tempString,此資料型態為String

inSlider=tempString.toInt();利用toInt()將字串轉為整數
toInt()和c_str()都是Arduino中String class的函數

以Serial Monitor觀察正確性



沒有留言:

張貼留言