ocrobot:alpha:kitone:tutorial11
差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
| ocrobot:alpha:kitone:tutorial11 [2017/04/07 10:03] – 外部编辑 127.0.0.1 | ocrobot:alpha:kitone:tutorial11 [2025/10/11 02:55] (当前版本) – 外部编辑 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: | ||
