[Arduino] Button & Switch

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

好吧,这段其实都差不多

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中断

GPIO的既可以输入也可以输出,但要监听外部电平的状态,就需要配置为输入模式。然后如果我们不停地去轮训GPIO的输入电平,也非常低效,所以我们可以通过注册GPIO中断来监听GPIO输入的变化。注意,对于Ardunio的硬件来说,支持中断的GPIO口可能只有指定的几个,比如Ardunio Mini Pro就只有2和3号管脚支持中断,所以码字的时候一定要查清楚。

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

  • LOW - GPIO输入为低电平时触发中断
  • HIGH - GPIO输入为高电平时触发中断
  • CHANGE - GPIO输入发生变化时触发中断
  • RISING - 上升沿,即GPIO输入从低电平变换高电平时触发中断
  • FALLING - 下降沿,即GPIO输入从高电平变换低电平时触发中断
    我们用
    attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)来注册中断,用detachInterrupt(digitalPinToInterrupt(pin))来注销中断。
void handleButtonChanged(); // 声明中断处理函数

void setup() {
    // 设置BUTTON_PIN为输入且上拉
    pinMode(BUTTON_PIN, INPUT_PULLUP);
    
    // 注册BUTTON_PIN的GPIO中断,只要GPIO输入电平发生变化就回调
    attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), handleButtonChanged, CHANGE);
}

void handleButtonChanged() {
    int level = digitalRead(BUTTON_PIN);
    if (level == HIGH) {
        // 输入为高电平,按钮松开,开关断开
    } else if (level == LOW) {
        // 输入为低电平,按钮按下,开关接通
    } else {
        // 不知道发生了什么奇怪的问题,这种情况我们就不要管了~= ̄ω ̄=~
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容