說明:
(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觀察正確性
沒有留言:
張貼留言