Уникнути його можна двома способами - апаратним та програмним. Пропонуюється поєднане використання цих двох методів: спочатку за допомогою конденсатора ослабимо брязкіт апаратно: а після цьго використаємо програмну "стабілізацію":
Код: Виділити все
*https://radioman.com.ua/*
int pinButton = 8; // Пін кнопки
int pinLED = 13; // Пін світлодіода (використано інтегрований)
void setup() {
pinMode(pinButton, INPUT); // Встановлюємо пін кнопки як вхід
pinMode(pinLED, OUTPUT); // Встановлюємо пін світлодіода як вихід
}
bool flag = LOW; // "Обнуляємо" прапорець світлодіода
bool lastButton = LOW; // "Обнуляємо" кнопку
bool debounce() // Функція для ігнорування брязкоту контактів
{
bool current = digitalRead(pinButton); // Зчитуємо стан кнопки
if (current != lastButton) { // Якщо старе значення відрізняється від отриманого
delay(10); // Чекаємо коли стан стабілізується - ігноруємо брязкіт контактів
current = digitalRead(pinButton); // Зчитуємо стабілізоване значення
}
return current; // Повертаємо значення кнопки
}
void loop() {
int currentButton = debounce(); // Отримуємо стабілізоване значення
if (lastButton == LOW && currentButton == HIGH) // Якщо стан кнопки "натиснута" - HIGH, а попередній LOW - фіксуємо подію натискання кнопки
{
flag = !flag; // Змінюємо прапорець статусу світлодіода
digitalWrite(pinLED, flag); // В залежності від прапорця, включаємо чи виключаємо світлодіод
}
lastButton = currentButton; // Запам'ятовуємо останній стан кнопки
}