【转载请注明出处: 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:如果本文对您有帮助,请点个赞让我知道哦~