12/08/2018, 14:50

[Android Things] Phần 3: Button với IOT. Cài đặt lắng nghe tín hiệu trả về từ hành động nhấn button.

Chào các bạn, chúng ta tiếp tục với phần tiếp theo với 1 project nho nhỏ về sự giao tiếp giữa thiết bị IOT và thiết bị ngoại vi là 1 button. Phần này sẽ cho chúng ta thấy được dần những ứng dụng mà IOT đang mang lại cho cuộc sống hàng ngày cho chúng ta. Sự hứng thú và tò mò của mình cũng xuất phát ...

Chào các bạn, chúng ta tiếp tục với phần tiếp theo với 1 project nho nhỏ về sự giao tiếp giữa thiết bị IOT và thiết bị ngoại vi là 1 button. Phần này sẽ cho chúng ta thấy được dần những ứng dụng mà IOT đang mang lại cho cuộc sống hàng ngày cho chúng ta. Sự hứng thú và tò mò của mình cũng xuất phát từ những ứng dụng nguồn nho nhỏ và thực tiễn ứng dụng mang lại.

Phần cứng.

Chuẩn bị linh kiện.

  1. Bộ kit Raspberry 3 alt
  2. Board test mạch alt
  3. Dây nối cái - cái, đực - đực
  • Dây cái - cái: alt
  • Dây đực - đực: alt
  1. Button: alt
  2. Điện trở: alt

Kết nối phần cứng các linh kiện

Chúng ta sẽ kết nối các linh kiện với nhau theo sơ đồ sau:

alt

Phần mềm:

Như Phần 2 chúng ta đã nói đến việc cài đặt 1 class phục vụ cho việc giao tiếp giữa thiết bị IOT và thiêt bi ngoại vi thông qua class BoardDefault.java

Ví dụ về class BoardDefault.java:

package com.example.luuhtruc.raspberryappdemo;

import android.os.Build;

import com.google.android.things.pio.PeripheralManagerService;

import java.util.List;

/**
 * Created by luu.htruc on 2/11/17.
 */

public class BoardDefaults {
    private static final String DEVICE_EDISON_ARDUINO = "edison_arduino";
    private static final String DEVICE_EDISON = "edison";
    private static final String DEVICE_RPI3 = "rpi3";
    private static final String DEVICE_NXP =  "imx6ul";
    private static String sBoardVariant = "";

    private static String getBoardVariant () {
        if (!sBoardVariant.isEmpty()) {
            return sBoardVariant;
        }
    sBoardVariant = Build.DEVICE;
        if (sBoardVariant.equals(DEVICE_EDISON)) {
            PeripheralManagerService pioService = new PeripheralManagerService();
            List<String> gpioList = pioService.getGpioList();
            if (gpioList.size() != 0) {
                String pin = gpioList.get(0);
                if (pin.startsWith("IO")) {
                    sBoardVariant = DEVICE_EDISON_ARDUINO;
                }
            }
        }
        return sBoardVariant;
    }

    public static String getGPIOForLED() {
        switch (getBoardVariant()) {
            case DEVICE_EDISON_ARDUINO:
                return "IO13";
            case DEVICE_EDISON:
                return "GP45";
            case DEVICE_RPI3:
                return "BCM6";
            case DEVICE_NXP:
                return "GPIO4_IO20";
            default:
                throw new IllegalStateException("Unknown Build.DEVICE " + Build.DEVICE);
        }
    }
}

b. Tại class MainActivity.java

Tại hàm onCreate() chúng ta sử dụng PeripheralManagerService theo đoạn mẫu dưới đây:

PeripheralManagerService service = new PeripheralManagerService();
        try {
            String pinName = BoardDefaults.getGPIOForButton();
            mButtonGpio = service.openGpio(pinName);
            mButtonGpio.setDirection(Gpio.DIRECTION_IN);
            mButtonGpio.setEdgeTriggerType(Gpio.EDGE_FALLING);
            mButtonGpio.registerGpioCallback(new GpioCallback() {
                @Override
                public boolean onGpioEdge(Gpio gpio) {
                    Log.i(TAG, "GPIO changed, button pressed");
                    // Return true to continue listening to events
                    return true;
                }
            });
        } catch (IOException e) {
            Log.e(TAG, "Error on PeripheralIO API", e);
        }

Hàm Callback onGpioEdge(Gpio gpio) sẽ trả về cho chúng ta giá trị cũng như lắng nghe sự thay đổi của button sau mỗi lần chúng ta nhấn. Khi đó chúng ta sẽ đặt thêm 1 đoạn code xử lý đầu ra cho tín hiệu của button.

Chúng ta khai báo hàm onDestroy() như sau:

@Override
    protected void onDestroy() {
        super.onDestroy();
        if (mButtonGpio != null) {
            // Close the Gpio pin
            Log.i(TAG, "Closing Button GPIO pin");
            try {
                mButtonGpio.close();
            } catch (IOException e) {
                Log.e(TAG, "Error on PeripheralIO API", e);
            } finally {
                mButtonGpio = null;
            }
        }
    }

Tổng thể class MainActivity.java các bạn có thể tham khảo dưới đây

package com.example.luuhtruc.raspberryappdemo;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import com.google.android.things.pio.Gpio;
import com.google.android.things.pio.PeripheralManagerService;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();

    private Handler mHandler = new Handler();
    private Gpio mLedGpio;

    private Gpio mButtonGpio;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "Starting ButtonActivity");

        PeripheralManagerService service = new PeripheralManagerService();
        try {
            String pinName = BoardDefaults.getGPIOForButton();
            mButtonGpio = service.openGpio(pinName);
            mButtonGpio.setDirection(Gpio.DIRECTION_IN);
            mButtonGpio.setEdgeTriggerType(Gpio.EDGE_FALLING);
            mButtonGpio.registerGpioCallback(new GpioCallback() {
                @Override
                public boolean onGpioEdge(Gpio gpio) {
                    Log.i(TAG, "GPIO changed, button pressed");
                    // Return true to continue listening to events
                    return true;
                }
            });
        } catch (IOException e) {
            Log.e(TAG, "Error on PeripheralIO API", e);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mButtonGpio != null) {
            // Close the Gpio pin
            Log.i(TAG, "Closing Button GPIO pin");
            try {
                mButtonGpio.close();
            } catch (IOException e) {
                Log.e(TAG, "Error on PeripheralIO API", e);
            } finally {
                mButtonGpio = null;
            }
        }
    }
}

Sau khi đã hoàn thành, chúng ta hãy khởi động phần cứng là bộ kit Rapsberry Pi3 và bảng test mạch như hướng dẫn ở phần Chuẩn bị linh kiện. Và giờ chúng ta khởi chạy ứng dụng và nhấn thử button, trong đoạn code hướng dẫn mình đã đặt 1 đoạn Log kiêm tra về tín hiệu của button sẽ trả về true false khi chúng ta nhấn. Bằng cách kiểm tra Logcat của IDE chúng ta sẽ biết được butoon đã nhận tín hiệu truyền tiếp trên board test hay chưa.

Phần tiếp theo chúng ta sẽ nghiên cứu thêm một phần nữa về điều khiển Servo. Phần này hứa hẹn sẽ áp dụng được nhiều ứng dụng thú vị cho các bạn. Hẹn gặp lại các bạn vào phần sau.

Thank for reading.

0