Android Things Tutorial(十一)GPIO輸入 – 開關 << 前情
認識迷你磁簧開關模組
迷你磁簧開關適合使用在門、窗的防盜裝置,或是非接觸式的開關,它可以感應磁鐵的靠近與離開,下面的圖片是一個常見的迷你磁簧開關模組,標示為「-」的pin為GND,標示為「S」的pin為輸出,中間沒有標示的pin為3.3V或5V:
供電給迷你磁簧開關模組以後,如果磁鐵靠近磁簧開關,輸出pin為低電壓。磁鐵離開磁簧開關,輸出pin為高電壓,電壓依照提供給模組的電壓決定:
設計讀取迷你磁簧開關模組的App
執行接下來的工作之前,先準備好這些設備與零件:
偵測迷你磁簧開關模組的輸出訊號,跟一般的開關類似,不過因為模組上已經包含需要的零件,所以不需要使用pull up或pull down的線路。參考下列的線路圖連接所有的零件與線路:
如果你沒有母-母杜邦線,也可以使用下面的設備與零件:
- 麵包板
- 迷你磁簧開關模組
- 公-母杜邦線 X 3
- 麵包板連接線 X 2
- 磁鐵
參考下列的線路圖連接所有的零件與線路:
參考下面的程式碼,完成使用GPIO偵測迷你磁簧開關模組的應用程式:
package net.macdidi5.at.hellominireed;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.google.android.things.pio.Gpio;
import com.google.android.things.pio.GpioCallback;
import com.google.android.things.pio.PeripheralManagerService;
import java.io.IOException;
public class MainActivity extends Activity {
private static final String TAG = MainActivity.class.getSimpleName();
// 連接開關的GPIO物件
private Gpio miniReedGpio;
// 連接迷你磁簧開關模組的GPIO pin
private final String PIN_NAME = "BCM23";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate");
// 建立設備管理員服物物件
PeripheralManagerService service = new PeripheralManagerService();
try {
// 建立GPIO物件
miniReedGpio = service.openGpio(PIN_NAME);
// 設定GPIO為輸入模式
miniReedGpio.setDirection(Gpio.DIRECTION_IN);
// 設定GPIO的監聽狀態
// Gpio.EDGE_NONE: 不作用
// Gpio.EDGE_FALLING: 由高電壓變化為低電壓
// Gpio.EDGE_RISING: 由低電壓變化為高電壓
// Gpio.EDGE_BOTH: 高、低電壓變化
miniReedGpio.setEdgeTriggerType(Gpio.EDGE_BOTH);
// 設定GPIO的作用模式
// Gpio.ACTIVE_HIGH: 偵測到高電壓時傳回true,低電壓傳回false
// Gpio.ACTIVE_LOW: 偵測到高電壓時傳回false,低電壓傳回true
miniReedGpio.setActiveType(Gpio.ACTIVE_HIGH);
// 註冊GPIO監聽物件
miniReedGpio.registerGpioCallback(new GpioCallback() {
@Override
public boolean onGpioEdge(Gpio gpio) {
try {
// 顯示GPIO狀態
Log.i(TAG, "Mini Reed: " + gpio.getValue());
}
catch (IOException e) {
Log.e(TAG, e.toString());
}
return true;
}
});
}
catch (IOException e) {
Log.e(TAG, e.toString());
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy");
if (miniReedGpio != null) {
try {
// 關閉GPIO物件
miniReedGpio.close();
}
catch (IOException e) {
Log.e(TAG, e.toString());
}
finally {
miniReedGpio = null;
}
}
}
}
執行應用程式,磁鐵靠近迷你磁簧開關的時候,logcat會顯示「Mini Reed: false」,磁鐵離開的時候會顯示「Mini Reed: true」。
根據設備的應用,你可以自已調整偵測的模式,例如想要在磁鐵靠近迷你磁簧開關的時候,GPIO接收到高電壓的訊號,可以參考下面的程式片段,把GPIO的作用模式設定為「Gpio.ACTIVE_LOW」:
// 設定GPIO的作用模式
// Gpio.ACTIVE_HIGH: 偵測到高電壓時傳回true,低電壓傳回false
// Gpio.ACTIVE_LOW: 偵測到高電壓時傳回false,低電壓傳回true
miniReedGpio.setActiveType(Gpio.ACTIVE_LOW);
執行應用程式,磁鐵靠近迷你磁簧開關的時候,logcat會顯示「Mini Reed: true」,磁鐵離開的時候會顯示「Mini Reed: false」。
如果設備需要在磁鐵靠近迷你磁簧開關的時候,應用程式接收到高電壓的訊號,磁鐵離開的時候不需要接收訊號,可以參考下面的程式片段,把GPIO的監聽狀態設定為「Gpio.EDGE_RISING」:
// 設定GPIO的監聽狀態
// Gpio.EDGE_NONE: 不作用
// Gpio.EDGE_FALLING: 由高電壓變化為低電壓
// Gpio.EDGE_RISING: 由低電壓變化為高電壓
// Gpio.EDGE_BOTH: 高、低電壓變化
miniReedGpio.setEdgeTriggerType(Gpio.EDGE_RISING);
// 設定GPIO的作用模式
// Gpio.ACTIVE_HIGH: 偵測到高電壓時傳回true,低電壓傳回false
// Gpio.ACTIVE_LOW: 偵測到高電壓時傳回false,低電壓傳回true
miniReedGpio.setActiveType(Gpio.ACTIVE_LOW);
執行應用程式,磁鐵靠近迷你磁簧開關的時候,logcat會顯示「Mini Reed: true」,磁鐵離開的時候不會顯示訊息。
下一步
瞭解基本的GPIO輸入與輸出應用以後,就可以結合GPIO輸出、入控制更多零件與模組,例如雷射光接收模組與超音波測距模組。接下來準備設計控制與偵測雷射光接收模組的線路與應用程式。
相關的檔案都可以在GitHub瀏覽與下載。
http://github.com/macdidi5/Android-Things-Tutorial
|