[Android Things] Button & Sw

2017-05-17  本文已影响134人  Cocoonshu

Button也就是平时生活中的按钮,不是在屏幕里那种,是可以用手指按得动的那种。都是按下去,电路就通了,松开电路又断了。
Switch是开关,有的开关和按钮长得很像,但按下去后要再按一次才能恢复原样。不然就是长得不像按钮的开关,那数量就海了去了。但所以的开关都是打开时,电路一直通着,断开后,电路就断了。(废话~←_←)

无fuck说

ButtonSwitch都是可以直接使用GPIO来实现功能的外围组件。所以接下来看看如何操作Pi的GPIO来读取输入状态即可。

实现方式


连接硬件

对于ButtonSwitch这样的东西来说,连接GPIO无非就两种接线法。

这里有个更优化的接线推荐,因为开关在的通断的瞬间,因为物理硬件的抖动和摩擦,会造成短时间的接触不良,所以输入GPIO的电平会在这段时间内忽高忽低,也有可能触发误动作,所以我们通常会再接入一个电容来稳定电路中的电流,放缓电平变化的速度。


抗干扰抗抖动开关接线图

获取GPIO

private Gpio mGpio = null;

try {
    PeripheralManagerService manager = new PeripheralManagerService();
    mGpio = manager.openGpio(GPIO_NAME);
} catch (IOException e) {
     Log.w(TAG, "Unable to access GPIO", e);
}

GPIO_NAME是按钮接入的GPIO的针脚名称,具体可以在Android Things的官网上查到树莓派的IO口信息。

配置GPIO并注册中断

GPIO的既可以输入也可以输出,但要监听外部电平的状态,就需要配置为输入模式。然后如果我们不停地去轮训GPIO的输入电平,也非常低效,所以我们可以通过注册GPIO中断来监听GPIO输入的变化。

监听GPIO输入的变化有4类:

另外,根据我们上节推荐接线法来接线的话,开关不接通时GPIO为高电平,开关接通时GPIO为低电平,所以我们可以设置低电平为有效的电平,这样如果开关接通了,我们通过GPIO.getValue()获取到的值就会为true

// 把GPIO端口配置输入
mGpio.setDirection(Gpio.DIRECTION_IN);
// 把低电平配置为有效状态
mGpio.setActiveType(Gpio.ACTIVE_LOW);
// 设置监听电平发生的任何变化
mGpio.setEdgeTriggerType(Gpio.EDGE_BOTH);
// 注册GPIO中断监听
mGpio.registerGpioCallback(new GpioCallback() {
    @Override
    public boolean onGpioEdge(Gpio gpio) {
        // Read the active low pin state
        if (gpio.getValue()) {
            // 输入了低电平,开关接通,按钮按下
        } else {
            // 输入了高电平,开关端开,按钮松开
        }

        // Continue listening for more interrupts
        return true;
    }

    @Override
    public void onGpioError(Gpio gpio, int error) {
        Log.w(TAG, gpio + ": Error event " + error);
    }
});

处理事件

释放GPIO

使用完GPIO后需要释放掉,以免后续运行的程序无法再继续使用你用过的GPIO。

if (mGpio != null) {
    try {
        mGpio.close();
        mGpio = null;
    } catch (IOException e) {
        Log.w(TAG, "Unable to close GPIO", e);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读