[Android Things] Button & Switch

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

无fuck说

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

实现方式


连接硬件

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

  • 其一,一端连接VCC,一端连接GPIO,没有接通开关时GPIO处于悬空状态,接通开关时GPIO被连接VCC去输入高电平。但这种做法有个弊端,当GPIO悬空时,容易受到电路中的干扰电流的影响,灌入干扰电流后容易被触发为高电平,造成误动作,所以不推荐这种接线法。
  • 其二,是先把GPIO连接到VCC,开关的一端连接GPIO,另一端连接GND。当开关断开时,GPIO始终被VCC拉到高电平,不担心其他电流的影响,当开关接通时,VCC的电流直接被导至GND,GPIO被拉低到低电平,就算干扰电流过来也会和VCC一样被导至GND,不担心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类:

  • EDGE_NONE - 不监听(默认如此)
  • EDGE_RISING - 上升沿,低电平变高电平时触发中断
  • EDGE_FALLING - 下降沿,高电平变低电平时触发中断
  • EDGE_BOTH - 只要电平发生变化就触发中断
    这种监听种类通过GPIO.setEdgeTriggerType()方法来设置。

另外,根据我们上节推荐接线法来接线的话,开关不接通时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);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容