const int BUTTON_PIN = 26; // 按键引脚
const int LED_PIN = 12; // LED引脚
// 消抖专用的三个核心变量(必须牢记)
int lastButtonState = HIGH; // 记录上一次的引脚电平状态
unsigned long lastDebounceTime = 0; // 记录上一次状态改变时的时间戳
unsigned long debounceDelay = 50; // 消抖等待时间,建议设置为 50 毫秒更稳定
// 控制设备的业务变量
int ledState = LOW; // LED 当前的状态
void setup() {
// 强烈建议使用内部上拉电阻!硬件接线只需一根接 26,一根接 GND。
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, ledState);
}
void loop() {
// 1. 读取当前瞬间的引脚电平
int reading = digitalRead(BUTTON_PIN);
// 2. 如果当前读取的状态跟上一次不一样(说明发生动作或正在抖动)
if (reading != lastButtonState) {
lastDebounceTime = millis(); // 马上重置计时器
}
// 3. 检查稳定时间:当前时间减去发生改变的时间,是否超过了设定的消抖阈值
if ((millis() - lastDebounceTime) > debounceDelay) {
// 如果稳定下来的状态是 LOW(因为上拉电阻,LOW代表按键被明确按下了)
// 并且 LED 还没在这个状态下做出反应(可以加一个状态锁防止连续触发,这里简化处理)
if (reading == LOW) {
// 执行动作:点亮或熄灭 LED
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
// 这里的延时是为了防止长按时疯狂切换状态。
// 在更高级的程序中,可以用状态机代替,但对初学者,这个短延时能有效锁死长按误触。
delay(200);
}
}
// 4. 无论发生了什么,本轮循环结束前,把当前的读数保存下来,作为下一次比较的依据
lastButtonState = reading;
}