Як позбутися від брязкоту контактів при підключенні кнопки до arduino - що таке брязкіт контактів
"Брязкіт" контактів - це явище, властиве механічним перемикачів, кнопок, тумблери і реле. Через те, що контакти зазвичай роблять з металів і сплавів, які мають пружністю, при фізичному замиканні вони не відразу встановлюють надійне з'єднання. Протягом короткого проміжку часу контакти кілька разів змикаються і відштовхуються один від одного. В результаті цього електричний струм приймає стале значення не моментально, а після низки наростань і спадів. Тривалість цього перехідного ефекту залежить від матеріалу контактів, від їх розміру і конструкції. На ілюстрації показана типова осцилограма при замиканні контактів тактовою кнопки. Видно, що час від моменту перемикання до усталеного стану становить кілька мілісекунд. Це і називається "дребезгом".
Цей ефект не помітний в електричних ланцюгах управління освітленням, двигунами або іншими інерційними датчиками і приладами. Але в ланцюгах, де йде швидке зчитування та обробка інформації (де частоти того ж порядку, що і імпульси "брязкоту", або вище), це є проблемою. Зокрема, Arduino UNO, який працює на частоті 16 МГц, відмінно ловить "брязкіт" контактів, приймаючи послідовність одиниць і нулів замість одиничного перемикання від 0 до 1.

Давайте подивимося, як брязкіт контактів впливає на правильну роботу схеми. Підключимо до Arduino тактову кнопку за схемою зі стягує резистором. Будемо після натискання кнопки запалювати світлодіод і залишати включеним до повторного натискання кнопки. Для наочності підключимо до цифрового висновку 13 зовнішній світлодіод, хоча можна обійтися і вбудованим.

Щоб реалізувати це завдання, перше, що спадає на думку:
- запам'ятовувати попередній стан кнопки;
- порівнювати з поточним станом;
- якщо стан змінилося, то міняємо стан світлодіода.
Напишемо такий скетч і завантажимо в пам'ять Arduino.
При включенні схеми в роботу, відразу видно ефект від впливу брязкоту контактів. Він проявляється в тому, що світлодіод спалахує не відразу після натискання кнопки, або загоряється і тут же гасне, або не вимикається відразу після натискання кнопки, а продовжує горіти. Загалом, схема працює не стабільно. І якщо для завдання з включенням світлодіода це не настільки критично, то для інших, більш серйозних завдань, це просто неприйнятно.

Постараємося виправити ситуацію. Ми знаємо, що брязкіт контактів проявляє себе протягом декількох мілісекунд після замикання контактів. Давайте після зміни стану кнопки вичікувати, скажімо, 5 мсек. Це час для людини є практично миттю, і натискання кнопки людиною зазвичай відбувається значно довше - кілька десятків мілісекунд. А Arduino прекрасно працює з такими короткими проміжками часу, і ці 5 мсек дозволять йому відсікти брязкіт контактів від натискання кнопки.
В даному скетчі ми оголосимо процедуру debounce () ( "bounce" по-англійськи - це якраз "брязкіт", приставка "de" означає зворотний процес), на вхід якої ми подаємо попередній стан кнопки. Якщо натискання кнопки триває більше 5 мсек, значить це дійсно натискання.
Визначивши натискання, ми змінюємо стан світлодіода.
Завантажимо скетч в плату Arduino. Тепер все набагато краще! Кнопка спрацьовує без збоїв, при натисканні світлодіод змінює стан, як ми і хотіли.

