Arduino按钮消抖
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;  // 更新上次读取状态
  }
}
上一篇
下一篇