这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版 | |||
ocrobot:alpha:kitone:tutorial11 [2019/07/15 02:32] – 董凯萍 | ocrobot:alpha:kitone:tutorial11 [2023/06/07 04:23] (当前版本) – 外部编辑 127.0.0.1 | ||
---|---|---|---|
行 1: | 行 1: | ||
+ | ~~NOTOC~~ | ||
+ | ====== Debounce(消抖) ====== | ||
+ | <WRAP left round info 100%> | ||
+ | 这个例子演示了如何消除输入抖动,也就是在一段时间内检查两次来确保按键被按下。如果不消抖,按键一次会被代码识别为多次按下。利用millis()功能来记录按键按下后的时间。 | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== ALPHA MEGA328-U核心 ===== | ||
+ | ==== 硬件 ==== | ||
+ | * [[ocrobot: | ||
+ | * [[ocrobot: | ||
+ | * [[ocrobot: | ||
+ | * [[ocrobot: | ||
+ | ==== 搭建电路 ==== | ||
+ | |||
+ | - ALPHA MEGA328-U模块插入并行扩展版1号槽位。 | ||
+ | - ALPHA 11 LED模块插入1号槽位,堆叠于MEGA328-U上。 | ||
+ | - ALPHA 微动开关模块插入并行扩展板2号槽位。 | ||
+ | - USB线连接计算机与ALPHA MEGA328-U。 | ||
+ | {{ocrobot: | ||
+ | ==== 代码 ==== | ||
+ | |||
+ | <code cpp>/ | ||
+ | | ||
+ | 每次按键按下,输入脚从低电平到高电平,输出引脚就被触发从低电平到高电平或者高电平到低电平。 | ||
+ | 两次触发之间设置一个最小延时来消除抖动。 | ||
+ | */ | ||
+ | |||
+ | |||
+ | const int buttonPin = 15; // 按键引脚 | ||
+ | const int ledPin = 2; // LED | ||
+ | |||
+ | |||
+ | int ledState = HIGH; // 输出脚状态 | ||
+ | int buttonState; | ||
+ | int lastButtonState = LOW; // 上一次读取到的输入状态 | ||
+ | |||
+ | |||
+ | long lastDebounceTime = 0; // 最后一次输出脚触发时间 | ||
+ | long debounceDelay = 50; // 消抖时间,增加它,如果输出不稳定 | ||
+ | |||
+ | void setup() { | ||
+ | pinMode(buttonPin, | ||
+ | pinMode(ledPin, | ||
+ | |||
+ | // 设置LED状态 | ||
+ | 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) { | ||
+ | ledState = !ledState; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | // 设置LED: | ||
+ | digitalWrite(ledPin, | ||
+ | |||
+ | // 存储读取到的信息.后面会变成上次的输入状态: | ||
+ | lastButtonState = reading; | ||
+ | }</ | ||
+ | |||
+ | [[ocrobot: |