[Android Things] Phần 5: Sự kết hợp giữa button và led trong IOT
Bài đăng này đã không được cập nhật trong 7 năm
Chào các bạn, phần trước chúng ta đã làm việc với servo. Phần này chúng ta sẽ tạo một sự kết hợp nho nhỏ giữa button và led để điều khiển hoạt động của led và button.
Phần cứng.
Chuẩn bị linh kiện.
- Bộ kit Raspberry 3
- Dây nối cái - cái, đực - đực
- Dây cái - cái:
- Dây đực - đực:
- Đèn led:
- Button:
- Điện trở:
Kết nối phần cứng các linh kiện
Chúng ta sẽ kết nối các thiết bị như sau:
Phần mềm:
Như Phần trước 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 1/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 "IO6";
case DEVICE_EDISON:
return "GP12";
case DEVICE_RPI3:
return "PWM0";
case DEVICE_NXP:
return "PWM7";
default:
throw new IllegalStateException("Unknown Build.DEVICE " + Build.DEVICE);
}
}
}
Phần class BoardDefault.java
ở module này sẽ có 1 chút thay đổi so với 2 phần trước ở tín hiệu phát ra ở các port. Chúng ta có 1 chút thay đổi nho nhỏ ở phần:
public static String getGPIOForLED() {
switch (getBoardVariant()) {
case DEVICE_EDISON_ARDUINO:
return "IO6";
case DEVICE_EDISON:
return "GP12";
case DEVICE_RPI3:
return "PWM0";
case DEVICE_NXP:
return "PWM7";
default:
throw new IllegalStateException("Unknown Build.DEVICE " + Build.DEVICE);
}
}
b. Tại class MainActivity.java
Chúng ta sẽ sử dụng method ButtonInputDriver
cho phần này.
private ButtonInputDriver mButtonInputDriver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "Starting ButtonActivity");
PeripheralManagerService pioService = new PeripheralManagerService();
try {
mLedGpio = pioService.openGpio(BoardDefaults.getGPIOForLED());
mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
mButtonInputDriver = new ButtonInputDriver(
BoardDefaults.getGPIOForButton(),
Button.LogicState.PRESSED_WHEN_LOW,
KeyEvent.KEYCODE_SPACE);
mButtonInputDriver.register();
} catch (IOException e) {
Log.e(TAG, "Error configuring GPIO pins", e);
}
}
Để bắt sự kiện button click sử dụng onKeyUp
và onKeyDown
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_SPACE) {
// Turn on the LED
setLedValue(true);
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_SPACE) {
// Turn off the LED
setLedValue(false);
return true;
}
return super.onKeyUp(keyCode, event);
}
setLedValue(false);
sẽ thiết đặt giá trị cho đèn led, hay nôm na là bật hay tắt nguồn cấp cho led.
Hàm setLedValue
cập nhật giá trị cho đèn led:
private void setLedValue(boolean value) {
try {
mLedGpio.setValue(value);
} catch (IOException e) {
Log.e(TAG, "Error updating GPIO value", e);
}
}
Và cuối cùng là hàm onDestroy()
như thường lệ:
@Override
protected void onDestroy(){
super.onDestroy();
if (mButtonInputDriver != null) {
mButtonInputDriver.unregister();
try {
mButtonInputDriver.close();
} catch (IOException e) {
Log.e(TAG, "Error closing Button driver", e);
} finally{
mButtonInputDriver = null;
}
}
if (mLedGpio != null) {
try {
mLedGpio.close();
} catch (IOException e) {
Log.e(TAG, "Error closing LED GPIO", e);
} finally{
mLedGpio = null;
}
mLedGpio = null;
}
}
Tổng thể class MainActivity.java
các bạn có thể tham khảo dưới đây
package com.example.luuhtruc.raspberryappdemo.button;
import android.app.Activity;
import android.os.Bundle;
import com.google.android.things.contrib.driver.button.Button;
import com.google.android.things.contrib.driver.button.ButtonInputDriver;
import com.google.android.things.pio.Gpio;
import com.google.android.things.pio.PeripheralManagerService;
import android.util.Log;
import android.view.KeyEvent;
import java.io.IOException;
public class MainActivity extends Activity {
private static final String TAG = MainActivity.class.getSimpleName();
private Gpio mLedGpio;
private ButtonInputDriver mButtonInputDriver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "Starting ButtonActivity");
PeripheralManagerService pioService = new PeripheralManagerService();
try {
mLedGpio = pioService.openGpio(BoardDefaults.getGPIOForLED());
mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
mButtonInputDriver = new ButtonInputDriver(
BoardDefaults.getGPIOForButton(),
Button.LogicState.PRESSED_WHEN_LOW,
KeyEvent.KEYCODE_SPACE);
mButtonInputDriver.register();
} catch (IOException e) {
Log.e(TAG, "Error configuring GPIO pins", e);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_SPACE) {
// Turn on the LED
setLedValue(true);
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_SPACE) {
// Turn off the LED
setLedValue(false);
return true;
}
return super.onKeyUp(keyCode, event);
}
private void setLedValue(boolean value) {
try {
mLedGpio.setValue(value);
} catch (IOException e) {
Log.e(TAG, "Error updating GPIO value", e);
}
}
@Override
protected void onDestroy(){
super.onDestroy();
if (mButtonInputDriver != null) {
mButtonInputDriver.unregister();
try {
mButtonInputDriver.close();
} catch (IOException e) {
Log.e(TAG, "Error closing Button driver", e);
} finally{
mButtonInputDriver = null;
}
}
if (mLedGpio != null) {
try {
mLedGpio.close();
} catch (IOException e) {
Log.e(TAG, "Error closing LED GPIO", e);
} finally{
mLedGpio = null;
}
mLedGpio = 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à khởi chạy ứng dụng.
Thử nhấn button và xem con đèn led hoạt động như nào nhé.
Thank for reading.
All rights reserved