本範例是[Beginning Android ADK with Arduino]一書中的Project 1. 透過Android畫面上的toggle button 來控制Arduino板上的LED燈亮滅.
您需要的硬體有:
1. Arduino MEGA ADK or 其他相容ADK板
2. Android手機或平板(2.3.3 or 3.1以上).
3. LED. 電阻x1, 線材一批.
Android端程式(部分)
Android端程式的關鍵在於在toggleButton狀態改變時, 呼叫sendLedSwitchCommand()方法, 對TARGET_PIN_2 (LED正極腳位)寫入 params[0]). 使用togglebutton而非一般button的用意在於其機械性質的差異, button需持續壓按才算為pressed, togglebutton則是在點擊之後就會改變狀態, 直到下一次點擊為止, 不需要一直壓著.
OnCheckedChangeListener toggleButtonCheckedListener = new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (buttonView.getId() == R.id.led_toggle_button) {
new AsyncTask () {
@Override
protected Void doInBackground(Boolean… params) {
sendLedSwitchCommand(TARGET_PIN_2, params[0]);
return null;
}
}.execute(isChecked);
}
}
};
在sendLedSwitchCommand()方法中則是使用mOutputStream.write()來控制LED的高低電位, 也就是亮滅.
public void sendLedSwitchCommand(byte target, boolean isSwitchedOn) {
byte[] buffer = new byte[3];
buffer[0] = COMMAND_LED;
buffer[1] = target;
if (isSwitchedOn) {
buffer[2] = VALUE_ON;
} else {
buffer[2] = VALUE_OFF;
}
if (mOutputStream != null) {
try {
mOutputStream.write(buffer);
} catch (IOException e) {
Log.e(TAG, "write failed", e);
}
}
}
Arduino端程式 部分, 省略main 與Acc物件定義.
Arduino端則是在loop()端終判斷接收到的value為何, 如果是VALUE_ON, 則digitalWrite(PIN, HIGH)來點亮LED. 反之則關閉.
#define COMMAND_LED 0x2
#define TARGET_PIN_2 0x2
#define VALUE_ON 0x1
#define VALUE_OFF 0x0
#define PIN 2
void loop() {
if (acc.isConnected()) {
//read the received data into the byte array
int len = acc.read(rcvmsg, sizeof(rcvmsg), 1);
if (len > 0) {
if (rcvmsg[0] == COMMAND_LED) {
if (rcvmsg[1] == TARGET_PIN_2){
//get the switch state
byte value = rcvmsg[2];
//set output pin to according state
if(value == VALUE_ON) {
digitalWrite(PIN, HIGH);
} else if(value == VALUE_OFF) {
digitalWrite(PIN, LOW);
}
}
}
}
}
}