[Android ADK + Arduino] Lesson1 控制LED亮滅

本範例是[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);
          }
        }
      }
    }
  }
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *