树莓派Android Things物联网开发:按键中断及消抖

【转载请注明出处: http://blog.csdn.net/leytton/article/details/77848430

《树莓派Android Things物联网开发》系列文章专栏 http://blog.csdn.net/column/details/17741.html

树莓派Android Things物联网开发:入门及资料汇总

树莓派Android Things物联网开发:创建一个Things项目

树莓派Android Things物联网开发:树莓派GPIO引脚图

树莓派Android Things物联网开发:按键中断及消抖

树莓派Android Things物联网开发:已知Bug发行说明

树莓派Android Things物联网开发:GitHub案例程序汇总


一、外部中断

不亦按照文档中外部中断测试按钮触发事件,结果发现抖动特别严重、触发了多次。

关于外部中可参考这两篇文章

《Android Things入门-控制GPIO》http://www.jianshu.com/p/4e031d038ae5 

《Android Things:外设I/O接口-GPIO》http://blog.csdn.net/p106786860/article/details/61414559

实际上Android Things提供了按钮库,结合上拉电路和软件算法进行了消抖处理。

二、上拉下拉电路


如上图所示,左边电路为上拉、下拉输出,右边电路为上拉输入。按键开关打开时,输入电压为VCC减去电阻两端电压;关闭时接地输入电压为0V。这就使得输入只有两种电压,避免了杂乱电压的产生。

上拉和下拉电阻值通常在1kΩ和10kΩ之间。电压不变、根据功率计算公式P=U^2/R,电阻越大,则功率消耗越小。但要确保输入电压符合高电平规定。

下拉输入如下图所示:


三、RC去抖电路


可以阅读下文:

《Android Things-硬件基础》上拉下拉及去抖、IO保护电路等介绍 http://www.jianshu.com/p/f0df498e91a1  官方原文 

四、Button库

Github地址 https://github.com/androidthings/contrib-drivers/tree/master/button 

使用方法:

在build.gradle文件中加入依赖库

dependencies {
    compile 'com.google.android.things.contrib:driver-button:0.3'
}


API调用有两种形式:

1、添加监听事件

import com.google.android.things.contrib.driver.button.Button;

// 访问按钮并监听事件:

Button mButton;

try {
    mButton = new Button(gpioPinName,
            // 高电平视为按钮被按下
            // 配合下拉电阻使用
            Button.LogicState.PRESSED_WHEN_HIGH
    );
    mButton.setOnButtonEventListener(new OnButtonEventListener() {
        @Override
        public void onButtonEvent(Button button, boolean pressed) {
            // 去吧皮卡丘
        }
    });
} catch (IOException e) {
    // 不能配置按钮...
}

// 结束时关闭按钮:

try {
    mButton.close();
} catch (IOException e) {
    // 关闭按钮失败
}


2、注册为驱动事件

ButtonInputDriver mInputDriver;

try {
    mInputDriver = new ButtonInputDriver(gpioPinName,
            Button.LogicState.PRESSED_WHEN_HIGH,
            KeyEvent.KEYCODE_A // 将要发送的按键编号
    );
    mInputDriver.register();
} catch (IOException e) {
    // 配置按钮失败...
}

// 重写Activity中的按键回调事件:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_A) {
        // 去吧皮卡丘
        return true; // 表示我们已经处理了该事件
    }
    return super.onKeyDown(keyCode, event);
}

// 当结束时注销和关闭输入驱动:

mInputDriver.unregister();
try {
    mInputDriver.close();
} catch (IOException e) {
    // 关闭输入驱动失败
}

注意的是,如果界面中存在输入框,不想按键驱动注册的虚拟输入与其冲突,可以设置其他的非键盘按键编号。如下


更多按键编号可查看《Android KeyCode列表


五、代码案例

https://github.com/androidthings/sample-button

按下按钮时,LED灯将亮起,释放时LED灯熄灭。LED灯串联一个470欧的电阻限流即可。

电路图


PS:如果本文对您有帮助,请点个赞让我知道哦~微笑


posted @ 2017-09-09 12:05  Leytton  阅读(486)  评论(0编辑  收藏  举报