【Arduino官方教程第一辑】示例程序 2-5 按键状态改变的探测

按键状态改变的探测

在使用按键时,你经常想要根据按键被按下的次数进行不同的操作。为了做到这一点,你需要知道什么时候按键从闭合到断开,并记录这种变化发生的次数。这就是所谓的按键状态探测(或者说边缘检测)。在本例中,我们会将相关的信息输出到串口监视器,并且在检测到4次按键状态改变时,将LED打开或关闭。

完成本例所需的硬件设备

  • Arduino板Genuino板
  • 自锁按钮或开关
  • 10kΩ电阻
  • 跳线/连接线
  • 面包板

电路搭建

【Arduino官方教程第一辑】示例程序 2-5 按键状态改变的探测_第1张图片
连线如下:第一根线连接按键右下脚和下拉电阻(这里用10kΩ),然后下拉电阻连接到GND。第二根线连接按键左下脚到5V。第三根线连接按键右上脚到2号引脚来让板子读取按键状态。

当按键开路(未按下),按键两侧不会有连接,2号引脚通过下拉电阻连接到GND,因而板子读出来是LOW。当按键闭路(按下),按键两侧连通,2号引脚会连接到5V,因而板子读出来是HIGH。(即使引脚在此时仍同时连着GND,但是下拉电阻阻止了电流流过。电流会“选择”流过电阻非常小的导线,将2号引脚连接到5V。)

如果在数字引脚上什么都不连接(在按键未按下时没接下拉电阻),LED可能会异常地闪烁。因为在什么都不连接时数字引脚处于悬空状态(既没有连接到5V又没有连接到GND)。板子会随机读出HIGH/LOW。这就需要使用下拉电阻来解决问题。

电路原理图

【Arduino官方教程第一辑】示例程序 2-5 按键状态改变的探测_第2张图片

例程代码

下列例程代码不断读取按键状态。然后比较这次和上一次按键状态的差异。如果按键的状态由LOW到HIGH,那么就表明按键被按下了。代码就将记录按键次数的counter变量增加1。

代码中也包含对于counter变量值的判断,如果它大于等于4,就会点亮LED,否则就会关闭LED。

/* 按键状态改变的探测 你无须时刻读取按键的状态,只需要知道按键状态在何时变化就可以了。(你需要知道什么时候按键从按下到放开)。这就叫做按键状态探测或者边缘检测。 本例向你展示如何探测按键状态的改变。 电路搭建: * 按键接在引脚2和+5V之间 * 10KΩ电阻从2号连接到GND * LED连接13号引脚和GND(或者使用板载LED) 代码是公开的。 */

// 整型常量:
const int  buttonPin = 2;    // 按键连接的引脚
const int ledPin = 13;       // LED连接的引脚

// 变量:
int buttonPushCounter = 0;   // 按键状态改变计数器
int buttonState = 0;         // 现在按键状态
int lastButtonState = 0;     // 先前的按键状态

void setup() {
  // 将buttonPin定义为输入模式:
  pinMode(buttonPin, INPUT);
  // 将LED定义为输出模式:
  pinMode(ledPin, OUTPUT);
  // 初始化串口通信:
  Serial.begin(9600);
}


void loop() {
  // 从输入引脚读取按键状态:
  buttonState = digitalRead(buttonPin);

  // 比较按键当前状态和上次状态
  if (buttonState != lastButtonState) {
    // 如果状态变化,增加buttonPushCounter
    if (buttonState == HIGH) {
      // 如果现在的状态是HIGH(从断开到闭合)
      buttonPushCounter++;
      Serial.println("on");
      Serial.print("按键被按下的次数: ");
      Serial.println(buttonPushCounter);
    } else {
      // 如果当前状态时LOW,则表明按键从闭合到断开:
      Serial.println("off");
    }
    // 延迟一会儿防止电子噪声
    delay(50);
  }
  // 为下次循环的判断,保存当前状态到lastButtonState 
  lastButtonState = buttonState;


  // 4次按下后改变LED状态。可以通过buttonPushCounter变量除以4取余数来搞定:
  if (buttonPushCounter % 4 == 0) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }

}

相关资料

pinMode()
digitalWrite()
digitalRead()
millis()
if
LED闪烁进阶:不用delay()函数的LED闪烁工程。
按钮:用按钮控制LED。
按键去抖:读取一个按钮状态,并且滤去干扰。
数字引脚上拉电阻:展示pinMode()函数INPUT_PULLUP 常量的使用。
按钮状态改变的探测:记录按钮被按下的次数。
音乐键盘:使用压力传感器和压电扬声器制作三键电子琴。
曲调1:使用压电扬声器播放一段曲调。
曲调2:使用tone()函数操作多个扬声器播放曲调。
曲调3:根据模拟信号通过压电扬声器播放一个音调。

更新进程

日期 日志 译者
2016年4月26日 创建并翻译文档 唐家勋

译者:唐家勋
邮箱:[email protected]
QQ:649196486
转载请注明出处,一切只因为热爱。
希望您能指出宝贵意见,谢谢。
【Arduino官方教程第一辑】示例程序 2-5 按键状态改变的探测_第3张图片

你可能感兴趣的:(【Arduino官方教程第一辑】示例程序 2-5 按键状态改变的探测)