learing:examples:debounce
差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录前一修订版 | |||
| learing:examples:debounce [2017/10/05 03:27] – 弘毅 | learing:examples:debounce [2025/10/11 02:55] (当前版本) – 外部编辑 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; | ||
| + | }</ | ||
| + | </ | ||
