Управління кнопками на Ардуїно
У попередній статті я писав про організацію індикації на світлодіодах.
Про роботу з кнопками Ардуїно написано дуже багато. У цій статті я напишу своє бачення, як зручно розробляти управління мікроконтролера за допомогою тактових кнопок, підключених до цифрових входів.
Не буду вдаватися до подробиць схем підключення кнопок до цифрових (і не тільки) входів мікроконтролера. У цій статті розглядається кнопка, підтягнута резистором до плюса, що замикає вхід на землю. Тому стан натиснутої кнопки LOW, а відпущений HIGH.
Тип кнопки не має значення, наприклад, може бути таким

Найпростіший скетч роботи з кнопкою виглядає так
Оператор delay(1000) визначає затримку між натисканнями кнопки. Якщо час натискання перевищить 1000 мс, то автоматичне повторне натискання кнопки. Такий метод може хіба що пригодитися для налагодження, але в реальному житті мало застосовний, тому що delay не дає виконуватися іншим операторам скетчу (якщо тільки не використовуються переривання) і обмежує мінімальний час між натисканнями кнопки.
У наступному скетчі спробую запам'ятовувати стан кнопки
Все ніби працює, але іноді проскакує два або більше спрацьовування. У чому ж справа? Справа в брязкальці контактів механічної кнопки.
Звичайне спрацювання кнопки виглядає так. Здавалося б, все правильно.

Але іноді спрацьовування може виглядати і так


Особливо це помітно у зношених чи просто неякісних кнопок. Існують різні способи боротьби з цим ефектом, від установки конденсатора на цифровий висновок до цілих електричних схем. Але ж у нас є цілий мікроконтролер! Проаналізувавши роботу кнопок, можна дійти невтішного висновку, що натискання кнопки зазвичай триває більше150 мс, а брязкіт контактів породжує імпульси тривалістю 50 мс, ну дуже рідко трохи більше. Тому встановивши мінімальний час між натисканнями кнопки в 50-100мс можна подолати ефект брязкальця контактів «програмним шляхом».
Іноді для зменшення кількості кнопок у пристрої застосовують короткий та довгий натискання на кнопку. У цьому випадку коротке натискання фіксується при відпустці кнопки А довге натискання при досягненні заданого інтервалу. код виходить такий.
Іноді, наприклад, у годиннику для встановлення часу, застосовується режим, коли довге натискання кнопки викликає спрацьовування із заданим інтервалом. Для реалізації цієї функції буде такий код.
Все це добре і функціонально, але дуже громіздко. Тому я прибрав роботу з кнопками до класу.
У конструкторі класу вказується цифровий вхід кнопки. А також чотири необов'язкові параметри:
- Таймаут для ігнорування брязкоту контактів (За замовчуванням 50 мс)
- Час довгого натискання кнопки мс. Якщо 0, довге натискання не фіксується. (За замовчуванням вимкнено)
- Час утримання кнопки, після якого відбувається автонатискання кнопки. Якщо 0, то немає. (За замовчуванням вимкнено)
- Інтервал спрацьовування кнопки при автонатисканні (За замовчуванням 500 мс)
Функція begin() здійснює ініціалізацію цифрового входу.
Функція loop() викликається в основному циклі або за таймером, але досить часто і повертає такі значення:
- SB_NONE - нічого не сталося
- SB_CLICK - подія спрацьовування кнопки
- SB_AUTO_CLICK - подія автонатискання кнопки при довгому утриманні
- SB_LONG_CLICK - подія довгого натискання кнопки
Приклад роботи з цим класом виглядає так: