树莓派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:如果本文对您有帮助,请点个赞让我知道哦~