这个例子演示了如何消除输入抖动,也就是在一段时间内检查两次来确保按键被按下。如果不消抖,按键一次会被代码识别为多次按下。利用millis()功能来记录按键按下后的时间。
/* Debounce 每次按键按下,输入脚从低电平到高电平,输出引脚就被触发从低电平到高电平或者高电平到低电平。 两次触发之间设置一个最小延时来消除抖动。 三个按键对应三盏LED灯,各自按键控制对应的LED灯,互不干扰 */ const int buttonPin1 = 15; //初始化按键引脚 const int buttonPin2 = 16; const int buttonPin3 = 17; const int ledPin1 = 2; // 初始化LED的引脚 const int ledPin2 = 3; const int ledPin3 = 4; int ledState1 = HIGH; // 设置LED输出脚状态为高电平 int ledState2 = HIGH; int ledState3 = HIGH; int buttonState1; // 设置读取输入脚的状态 int buttonState2; int buttonState3; int lastButtonState1 = LOW; // 上一次读取到的输入状态为低电平 int lastButtonState2 = LOW; // 上一次读取到的输入状态 int lastButtonState3 = LOW; // 上一次读取到的输入状态 long lastDebounceTime1 = 0; // 最后一次输出脚触发时间 long lastDebounceTime2 = 0; long lastDebounceTime3 = 0; long debounceDelay = 50; // 设置消抖时间,增加它,如果输出不稳定 void setup() { pinMode(buttonPin1, INPUT); //初始化按键的输入模式 pinMode(buttonPin2, INPUT); pinMode(buttonPin3, INPUT); pinMode(ledPin1, OUTPUT); //初始化灯的输出模式 pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); digitalWrite(ledPin1, ledState1);// 设置LED状态为高电平 digitalWrite(ledPin2, ledState2); digitalWrite(ledPin3, ledState3); } void runing1() //第一个按键对应第一盏灯 { if ((millis() - lastDebounceTime1) > debounceDelay) // 比较按键的相差时间,若大于消抖时间,则说明时间不管读取到什么,时间已经比消抖延时长,所以认为它是真实的当前状态 { if (digitalRead(buttonPin1) != buttonState1) // 如果按键状态改变: { buttonState1 = digitalRead(buttonPin1); // 新的按键状态为high才会触发LED if (buttonState1 == HIGH) //如果按键状态为高时, { ledState1 = !ledState1; //改变对应的灯的电平 } } } digitalWrite(ledPin1, ledState1); // 输出LED灯的状态 lastButtonState1 = digitalRead(buttonPin1); // 存储读取到的信息.按键会变成上次的输入状态: } void runing2() //第2个按键对应第2盏灯 { if ((millis() - lastDebounceTime2) > debounceDelay) { if (digitalRead(buttonPin2) != buttonState2) { buttonState2 = digitalRead(buttonPin2); if (buttonState2 == HIGH) { ledState2 = !ledState2; } } } digitalWrite(ledPin2, ledState2); lastButtonState2 = digitalRead(buttonPin2); } void runing3() //第3个按键对应第3盏灯 { if ((millis() - lastDebounceTime3) > debounceDelay) { if (digitalRead(buttonPin3) != buttonState3) { buttonState3 = digitalRead(buttonPin3); if (buttonState3 == HIGH) { ledState3 = !ledState3; } } } digitalWrite(ledPin3, ledState3); lastButtonState3 = digitalRead(buttonPin3); } void loop() { if (digitalRead(buttonPin1)!= lastButtonState1) //读取按键状态,存储到变量 // 检查是否按下按键(也就是输入了low或high),自从上一次按下之后你已经等了很久(忽略噪声的情况下)如果按键状态改变,那就是按下了或者是噪声 { lastDebounceTime1 = millis(); // 重置消抖时间 } runing1(); //调用第一个按键的函数 if (digitalRead(buttonPin2)!= lastButtonState2) //读取按键状态,存储到变量 // 检查是否按下按键(也就是输入了low或high),自从上一次按下之后你已经等了很久(忽略噪声的情况下)如果按键状态改变,那就是按下了或者是噪声 { lastDebounceTime1 = millis(); // 重置消抖时间 } runing2(); //调用第二个按键的函数 if (digitalRead(buttonPin3)!= lastButtonState3) //读取按键状态,存储到变量 // 检查是否按下按键(也就是输入了low或high),自从上一次按下之后你已经等了很久(忽略噪声的情况下)如果按键状态改变,那就是按下了或者是噪声 { lastDebounceTime1 = millis(); // 重置消抖时间 } runing3(); //调用第三个按键的函数 }
这里,按下按键返回HIGH,不按返回LOW
/* Debounce 每次按键按下,输入脚从低电平到高电平,输出引脚就被触发从低电平到高电平或者高电平到低电平。两次触发之间设置一个最小延时来消除抖动。 * 13号脚的LED 连到GND * 按键连接到 2 号脚到+5V * 10K 电阻连到 2号脚到GND * Note:部分控制器有一个LED连接到了13号脚 */ const int buttonPin = 2; // 按键引脚 const int ledPin = 13; // LED int ledState = HIGH; // 输出脚状态 int buttonState; // 读取输入脚 int lastButtonState = LOW; // 上一次读取到的输入状态 long lastDebounceTime = 0; // 最后一次输出脚触发时间 long debounceDelay = 50; // 消抖时间,增加它,如果输出不稳定 void setup() { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, ledState); // 设置LED状态 } void loop() { int reading = digitalRead(buttonPin); //读取按键状态,存储到变量 // 检查是否按下按键(也就是输入了low或high),自从上一次按下之后你已经等了很久(忽略噪声的情况下) // 如果按键状态改变,那就是按下了或者是噪声 if (reading != lastButtonState) { lastDebounceTime = millis(); // 重置消抖时间 } if ((millis() - lastDebounceTime) > debounceDelay) // 不管读取到什么,时间已经比消抖延时长,所以认为它是真实的当前状态 { // 如果按键状态改变: if (reading != buttonState) { buttonState = reading;// 新的按键状态为high才会触发LED if (buttonState == HIGH) {ledState = !ledState; } } } digitalWrite(ledPin, ledState); // 设置LED: lastButtonState = reading; // 存储读取到的信息.后面会变成上次的输入状态: }