const int buttonPin = 2; // 按钮连接的引脚
const int ledPin = 13; // LED连接的引脚
int buttonState = HIGH; // 当前按钮状态
int lastButtonState = HIGH; // 上一次按钮状态
unsigned long lastDebounceTime = 0; // 上次状态变化时间
unsigned long debounceDelay = 50; // 消抖延时(ms)
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
int reading = digitalRead(buttonPin);
// 如果状态改变(由于噪声或按下)
if (reading != lastButtonState) {
lastDebounceTime = millis(); // 重置计时器
}
// 如果经过足够时间
if ((millis() - lastDebounceTime) > debounceDelay) {
// 如果状态与当前不同
if (reading != buttonState) {
buttonState = reading;
// 只有当新状态为LOW时才视为有效按下
if (buttonState == LOW) {
digitalWrite(ledPin, !digitalRead(ledPin)); // 切换LED状态
Serial.println("Button pressed");
}
}
}
lastButtonState = reading; // 保存当前状态用于下次比较
}
多个按钮消抖
const int NUM_BUTTONS = 3;
const int buttonPins[NUM_BUTTONS] = {2, 3, 4};
const int ledPins[NUM_BUTTONS] = {10, 11, 12};
bool buttonStates[NUM_BUTTONS] = {LOW, LOW, LOW}; // 当前按钮状态
bool lastButtonStates[NUM_BUTTONS] = {LOW, LOW, LOW}; // 上一帧状态
bool ledStates[NUM_BUTTONS] = {LOW, LOW, LOW}; // 每个LED状态
unsigned long lastDebounceTimes[NUM_BUTTONS] = {0}; // 每个按钮上次切换时间
const unsigned long debounceDelay = 50; // 消抖时间(毫秒)
void setup() {
for (int i = 0; i < NUM_BUTTONS; i++) {
pinMode(buttonPins[i], INPUT_PULLUP); // 使用内部上拉电阻
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW);
}
}
void loop() {
for (int i = 0; i < NUM_BUTTONS; i++) {
int reading = digitalRead(buttonPins[i]);
// 如果检测到状态发生变化
if (reading != lastButtonStates[i]) {
lastDebounceTimes[i] = millis(); // 重置消抖计时
}
// 状态稳定超过 debounceDelay,认为是有效切换
if ((millis() - lastDebounceTimes[i]) > debounceDelay) {
if (reading != buttonStates[i]) {
buttonStates[i] = reading;
// 检测到按下(注意 INPUT_PULLUP 模式,LOW 为按下)
if (buttonStates[i] == LOW) {
ledStates[i] = !ledStates[i]; // 切换对应 LED
digitalWrite(ledPins[i], ledStates[i]);
}
}
}
lastButtonStates[i] = reading; // 更新上次读取状态
}
}