Android Things Tutorial(十二)GPIO輸入 - 迷你磁簧開關模組 by Michael | CodeData
top

Android Things Tutorial(十二)GPIO輸入 - 迷你磁簧開關模組

分享:

Android Things Tutorial(十一)GPIO輸入 – 開關 << 前情

認識迷你磁簧開關模組

迷你磁簧開關適合使用在門、窗的防盜裝置,或是非接觸式的開關,它可以感應磁鐵的靠近與離開,下面的圖片是一個常見的迷你磁簧開關模組,標示為「-」的pin為GND,標示為「S」的pin為輸出,中間沒有標示的pin為3.3V或5V:

att_12_01

供電給迷你磁簧開關模組以後,如果磁鐵靠近磁簧開關,輸出pin為低電壓。磁鐵離開磁簧開關,輸出pin為高電壓,電壓依照提供給模組的電壓決定:

att_12_02

設計讀取迷你磁簧開關模組的App

執行接下來的工作之前,先準備好這些設備與零件:

  • 迷你磁簧開關模組
  • 母-母杜邦線 X 3
  • 磁鐵

偵測迷你磁簧開關模組的輸出訊號,跟一般的開關類似,不過因為模組上已經包含需要的零件,所以不需要使用pull up或pull down的線路。參考下列的線路圖連接所有的零件與線路:

att_12_03

如果你沒有母-母杜邦線,也可以使用下面的設備與零件:

  • 麵包板
  • 迷你磁簧開關模組
  • 公-母杜邦線 X 3
  • 麵包板連接線 X 2
  • 磁鐵

參考下列的線路圖連接所有的零件與線路:

att_12_04

參考下面的程式碼,完成使用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瀏覽與下載。

https://github.com/macdidi5/Android-Things-Tutorial

分享:
按讚!加入 CodeData Facebook 粉絲群

留言

留言請先。還沒帳號註冊也可以使用FacebookGoogle+登錄留言

關於作者

張益裕。目前的工作是講師與作者,專長是教育訓練課程規劃、教材編製與課程推廣,技術書籍與專欄寫作。涵蓋的領域有OOAD、Java程式設計、JavaFX、Java Embedded、Android與SQL。已出版電子書Google Play圖書Pubu

熱門論壇文章

熱門技術文章