数字部分-去抖

由于一些机械物理上的原因,当按键被按下的时候,经常出现一些假的闭合或开启。在一个程序里面,可能会在很短的时间内读取到多个开闭状态。这个示例展示了如何在输入的时候,去掉这样的波动,也就是说在很短的时间内确认两次来判断按键是否真的被按下的。如果没有防抖操作的话,按下按键的时候可能会出现不可预料的结果。程序中用了millis()函数来跟踪按键按下之后的时间。

硬件需求
—Arduino控制板
—按键开关
—10K电阻
—杜邦线或面保线
—面包板

电路
clip_image002

原理图
clip_image004

代码

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;

}
0
分享到:

评论0

请先

本站资料配套硬件销售店铺:天猫店ultirobot.tmall.com 、三冠淘宝店zhongbest.taobao.com
没有账号? 忘记密码?