Бутон за управление на Arduino

В предишна статия писах за организацията на LED индикация.

Много е писано за работата с бутони на Arduino. В тази статия ще напиша визията си за това как е удобно да се проектира управление на микроконтролера, като се използват бутони на часовника, свързани към цифрови входове.

Няма да навлизам в подробности за схемите на свързване на бутони към цифрови (и не само) входове на микроконтролера. Тази статия се занимава с бутон, изтеглен от резистор до положителен и късо входа към земята. Следователно състоянията на натиснатия бутон LOW и освободени HIGH.

Типът на бутона няма значение, например може да бъде така

arduino

Най-простата скица за работа с бутон изглежда така

Операторът за забавяне (1000) определя закъснението между натисканията на бутоните. Ако времето за натискане надвишава 1000 ms, бутонът автоматично се натиска отново. Такъв метод може би е полезен само за отстраняване на грешки, но в реалния живот той не е много приложим, тъй като забавянето не позволява изпълнението на останалите оператори на скици (освен ако не се използват прекъсвания) и ограничава минималното време между щракванията на бутоните.

В следващата скица ще се опитам да запомня състоянието на бутона

Изглежда, че всичко работи, но понякога два или повече задействания се плъзгат. Какъв е проблема? Въпросът е отскачането на контактите на механичния бутон.

Нормалното действие на бутона изглежда така. Изглежда, че всичко е правилно.

arduino

Но понякога спусъка може да изглежда така

управление

бутон

Това е особено забележимо при износени или просто некачествени бутони. Има различни начини за борба с този ефект, от поставяне на кондензатор на цифров щифт до завършване на електрически вериги. Но ние имаме цял микроконтролер! След анализ на работата на бутоните можем да заключим, че натискането на бутон обикновено трае повече от 150 ms, а отскачането на контакти генерира импулси с продължителност 50 ms, добре, много рядко малко повече. Следователно, като зададете минималното време между натисканията на бутоните на 50-100ms, можете да преодолеете ефекта от подскачането на контакта „програмно“.

Понякога, за да намалите броя на бутоните в устройството, се използва кратко и продължително натискане на бутона. В този случай се фиксира кратко натискане при отпускане на бутон А, дълго натискане при достигане на зададения интервал. кодът е такъв.

Понякога например в часовника за задаване на часа се използва режим, когато продължително натискане на бутона задейства операция на даден интервал. За да приложите тази функция, ще има код като този.

Всичко това е добро и функционално, но много тромаво. Затова премахнах работата с бутони в класа.

Конструкторът на клас задава цифровия вход на бутона. И също четири незадължителни параметъра:

  • Време за изчакване за игнориране на отскока на контакта (по подразбиране 50 ms)
  • Време на продължително натискане на бутона, мс. Ако 0, тогава продължителното натискане не е фиксирано. (Деактивирано по подразбиране)
  • Време за задържане на бутона, след което бутонът се натиска автоматично. Ако 0, тогава това не се случва. (Деактивирано по подразбиране)
  • Интервал на реакция на бутона по време на автоматично натискане (по подразбиране 500 ms)

Функцията begin () инициализира цифровия вход.

Функцията loop () се извиква в основния цикъл или на таймер, но често достатъчно и връща следните стойности:

  • SB_NONE - нищо не се случи
  • SB_CLICK - събитие за щракване върху бутон
  • SB_AUTO_CLICK - събитие за автоматично натискане на бутон с дълго задържане
  • SB_LONG_CLICK - събитие за щракване с дълъг бутон
Изтеглете клас за работа с бутони с пример

Пример за работа с този клас изглежда така: