这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版 | |||
learing:examples:debounce [2017/10/05 03:27] – 弘毅 | learing:examples:debounce [2023/06/07 04:23] (当前版本) – 外部编辑 127.0.0.1 | ||
---|---|---|---|
行 1: | 行 1: | ||
+ | ====== Debounce(消抖) ====== | ||
+ | |||
+ | <WRAP left round info 65%> | ||
+ | 这个例子演示了如何消除输入抖动,也就是在一段时间内检查两次来确保按键被按下。如果不消抖,按键一次会被代码识别为多次按下。利用millis()功能来记录按键按下后的时间。 | ||
+ | </ | ||
+ | |||
+ | <WRAP left round box 100%> | ||
+ | ===== ALPHA MEGA328-U核心 ===== | ||
+ | ==== 硬件 ==== | ||
+ | * [[ocrobot: | ||
+ | * [[ocrobot: | ||
+ | * [[ocrobot: | ||
+ | * [[ocrobot: | ||
+ | ==== 搭建电路 ==== | ||
+ | |||
+ | - ALPHA MEGA328-U模块插入并行扩展版1号槽位。 | ||
+ | - ALPHA 11 LED模块插入1号槽位,堆叠于MEGA328-U上。 | ||
+ | - ALPHA 微动开关模块插入并行扩展板2号槽位。 | ||
+ | - USB线连接计算机与ALPHA MEGA328-U。 | ||
+ | |||
+ | ==== 代码 ==== | ||
+ | |||
+ | <code cpp> | ||
+ | /* | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | */ | ||
+ | |||
+ | |||
+ | 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, | ||
+ | pinMode(buttonPin2, | ||
+ | pinMode(buttonPin3, | ||
+ | pinMode(ledPin1, | ||
+ | pinMode(ledPin2, | ||
+ | pinMode(ledPin3, | ||
+ | |||
+ | |||
+ | digitalWrite(ledPin1, | ||
+ | digitalWrite(ledPin2, | ||
+ | digitalWrite(ledPin3, | ||
+ | } | ||
+ | |||
+ | void runing1() | ||
+ | { | ||
+ | if ((millis() - lastDebounceTime1) > debounceDelay) // 比较按键的相差时间,若大于消抖时间,则说明时间不管读取到什么,时间已经比消抖延时长,所以认为它是真实的当前状态 | ||
+ | { | ||
+ | if (digitalRead(buttonPin1) != buttonState1) | ||
+ | { | ||
+ | buttonState1 = digitalRead(buttonPin1); | ||
+ | if (buttonState1 == HIGH) // | ||
+ | { | ||
+ | ledState1 = !ledState1; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | digitalWrite(ledPin1, | ||
+ | lastButtonState1 = digitalRead(buttonPin1); | ||
+ | } | ||
+ | |||
+ | void runing2() | ||
+ | { | ||
+ | if ((millis() - lastDebounceTime2) > debounceDelay) | ||
+ | { | ||
+ | if (digitalRead(buttonPin2) != buttonState2) | ||
+ | { | ||
+ | buttonState2 = digitalRead(buttonPin2); | ||
+ | if (buttonState2 == HIGH) | ||
+ | { | ||
+ | ledState2 = !ledState2; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | digitalWrite(ledPin2, | ||
+ | lastButtonState2 = digitalRead(buttonPin2); | ||
+ | } | ||
+ | |||
+ | void runing3() | ||
+ | { | ||
+ | if ((millis() - lastDebounceTime3) > debounceDelay) | ||
+ | { | ||
+ | if (digitalRead(buttonPin3) != buttonState3) | ||
+ | { | ||
+ | buttonState3 = digitalRead(buttonPin3); | ||
+ | if (buttonState3 == HIGH) | ||
+ | { | ||
+ | ledState3 = !ledState3; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | digitalWrite(ledPin3, | ||
+ | lastButtonState3 = digitalRead(buttonPin3); | ||
+ | } | ||
+ | void loop() { | ||
+ | if (digitalRead(buttonPin1)!= lastButtonState1) // | ||
+ | { | ||
+ | lastDebounceTime1 = millis(); // 重置消抖时间 | ||
+ | } | ||
+ | runing1(); | ||
+ | if (digitalRead(buttonPin2)!= lastButtonState2) // | ||
+ | { | ||
+ | lastDebounceTime1 = millis(); // 重置消抖时间 | ||
+ | } | ||
+ | runing2(); | ||
+ | |||
+ | if (digitalRead(buttonPin3)!= lastButtonState3) // | ||
+ | { | ||
+ | lastDebounceTime1 = millis(); // 重置消抖时间 | ||
+ | } | ||
+ | runing3(); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | <WRAP left round box 100%> | ||
+ | ===== ALPHA 8F328D-U核心 ===== | ||
+ | ==== 硬件 ==== | ||
+ | |||
+ | ==== 搭建电路 ==== | ||
+ | |||
+ | ==== 代码 ==== | ||
+ | </ | ||
+ | |||
+ | <WRAP left round box 100%> | ||
+ | ===== MangoII ===== | ||
+ | |||
+ | ==== 硬件要求 ==== | ||
+ | |||
+ | * OCROBOT控制器 | ||
+ | * 按键或开关 | ||
+ | * 10K欧姆电阻 | ||
+ | * 面包板 | ||
+ | * 导线 | ||
+ | |||
+ | ==== 代码 ==== | ||
+ | |||
+ | 这里,按下按键返回HIGH,不按返回LOW | ||
+ | |||
+ | <code cpp>/ | ||
+ | | ||
+ | 每次按键按下,输入脚从低电平到高电平,输出引脚就被触发从低电平到高电平或者高电平到低电平。两次触发之间设置一个最小延时来消除抖动。 | ||
+ | * 13号脚的LED 连到GND | ||
+ | * 按键连接到 2 号脚到+5V | ||
+ | * 10K 电阻连到 2号脚到GND | ||
+ | * Note: | ||
+ | */ | ||
+ | |||
+ | 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, | ||
+ | pinMode(ledPin, | ||
+ | |||
+ | digitalWrite(ledPin, | ||
+ | } | ||
+ | |||
+ | 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) | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | digitalWrite(ledPin, | ||
+ | lastButtonState = reading; | ||
+ | }</ | ||
+ | </ |