Подавите дребезг контакта кнопки. Для этого запомните

Подавите дребезг контакта кнопки. Для этого запомните время , когда вызывалось прерывание, и при последующем вызове, если не прошло 100 мм, не переключайтесь светодиод
Дополнительные параметры: codeFlowType: codeWrite codeFlowLang: C++
Создано: 10.03.2025 10:11

Подавите дребезг контакта кнопки. Для этого запомните время , когда вызывалось прерывание, и при последующем вызове, если не прошло 100 мм, не переключайтесь светодиод

Конечно! Ниже представлен пример кода на C++, который позволяет подавить дребезг контакта кнопки. Мы запоминаем время последнего срабатывания прерывания и проверяем, прошло ли 100 мс перед выполнением переключения светодиода.

#include <Arduino.h>

const int buttonPin = 2;     // Номер пина кнопки
const int ledPin = 13;       // Номер пина светодиода
volatile unsigned long lastDebounceTime = 0; // Время последнего срабатывания
const unsigned long debounceDelay = 100; // Задержка в миллисекундах

void setup() {
    pinMode(buttonPin, INPUT_PULLUP); // Настройка пина кнопки
    pinMode(ledPin, OUTPUT);           // Настройка пина светодиода
    attachInterrupt(digitalPinToInterrupt(buttonPin), buttonPress, FALLING); // Настройка прерывания
}

void loop() {
    // Основной цикл остается пустым, всё происходит в прерывании
}

void buttonPress() {
    unsigned long currentMillis = millis(); // Получаем текущее время в миллисекундах

    // Проверяем, прошло ли достаточно времени
    if (currentMillis - lastDebounceTime > debounceDelay) {
        // Переключаем состояние светодиода
        digitalWrite(ledPin, !digitalRead(ledPin));
        // Обновляем время последнего срабатывания
        lastDebounceTime = currentMillis;
    }
}

Описание:

  • buttonPin: пин, к которому подключена кнопка.
  • ledPin: пин, к которому подключен светодиод.
  • lastDebounceTime: переменная для хранения времени последнего срабатывания кнопки.
  • debounceDelay: константа, задающая задержку для подавления дребезга (100 мс).
  • В функции setup() настраиваем пины и прерывание для кнопки.
  • В функции loop() ничего не выполняем, так как вся логика происходит в обработчике прерывания buttonPress().
  • В обработчике buttonPress() проверяем, прошло ли достаточно времени с момента последнего срабатывания, и если да, то переключаем состояние светодиода и обновляем время последнего срабатывания.

Этот код будет работать на платах Arduino и позволяет избежать проблем с дребезгом контактов при нажатии кнопки.