由于一些机械物理上的原因,当按键被按下的时候,经常出现一些假的闭合或开启。在一个程序里面,可能会在很短的时间内读取到多个开闭状态。这个示例展示了如何在输入的时候,去掉这样的波动,也就是说在很短的时间内确认两次来判断按键是否真的被按下的。如果没有防抖操作的话,按下按键的时候可能会出现不可预料的结果。程序中用了millis()函数来跟踪按键按下之后的时间。
硬件需求
—Arduino控制板
—按键开关
—10K电阻
—杜邦线或面保线
—面包板
代码
const int buttonPin = 2; // 定义pushbutton的引脚
const int ledPin = 13; // 定义LED的引脚
int ledState = HIGH; // 定义输出引脚的状态
int buttonState; // 定义输入引脚的状态
int lastButtonState = LOW; // 定义之前的按键状态
// 下面变量定义为 unsigned longs 因为这个时间是毫秒级的
//将会在很短的时间内变成一个很大的数字,超出了int的范围。
unsigned long lastDebounceTime = 0; // 定义除抖时间
unsigned long debounceDelay = 50; //检测除抖的间隔
void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
// 设置最初LED状态
digitalWrite(ledPin, ledState);
}
void loop() {
// 把读取到的按键状态存储在本地变量里
int reading = digitalRead(buttonPin);
//判断当前按键状态是否有变化
if (reading != lastButtonState) {
// 如果有变化,则重设置除抖计时器
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
//在设置的除抖区间内判断按键的状态
if (reading != buttonState) {
buttonState = reading;
// 只在按键读取到高电平时候,翻转LED状态
if (buttonState == HIGH) {
ledState = !ledState;
}
}
}
// 设置LED:
digitalWrite(ledPin, ledState);
// 存储读到的值. 下次进入循环的时候,它此状态更新为最新状态。
lastButtonState = reading;
}
const int ledPin = 13; // 定义LED的引脚
int ledState = HIGH; // 定义输出引脚的状态
int buttonState; // 定义输入引脚的状态
int lastButtonState = LOW; // 定义之前的按键状态
// 下面变量定义为 unsigned longs 因为这个时间是毫秒级的
//将会在很短的时间内变成一个很大的数字,超出了int的范围。
unsigned long lastDebounceTime = 0; // 定义除抖时间
unsigned long debounceDelay = 50; //检测除抖的间隔
void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
// 设置最初LED状态
digitalWrite(ledPin, ledState);
}
void loop() {
// 把读取到的按键状态存储在本地变量里
int reading = digitalRead(buttonPin);
//判断当前按键状态是否有变化
if (reading != lastButtonState) {
// 如果有变化,则重设置除抖计时器
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
//在设置的除抖区间内判断按键的状态
if (reading != buttonState) {
buttonState = reading;
// 只在按键读取到高电平时候,翻转LED状态
if (buttonState == HIGH) {
ledState = !ledState;
}
}
}
// 设置LED:
digitalWrite(ledPin, ledState);
// 存储读到的值. 下次进入循环的时候,它此状态更新为最新状态。
lastButtonState = reading;
}
请先
!