Библиотека ардуино для кнопки

Библиотека ардуино для кнопки

Этот скетч и библиотека показывают, как использовать один вывод порта микроконтроллера AVR, чтобы детектировать типичные события на кнопке, такие как одиночное нажатие (single click), двойное нажатие (double click) и длительное нажатие (long press). Этот функционал позволяет использовать одну и ту же кнопку для нескольких функций с небольшими затратами на аппаратуру — особенно удобно в случае применения поворотного энкодера (rotary encoder, jog-shuttle) с одной кнопкой.

Примечание: здесь приведен перевод статьи [1], исходный код библиотеки можно скачать по ссылке [2] с использованием систем GIT или SVN, либо просто в виде архива OneButton-master.zip, если нажать на кнопку "Download ZIP".

[Введение]

Начинающим программировать в системе Arduino полезно рассмотреть простой обучающий пример опроса кнопки (Button tutorial), чтобы понять, как нужно читать состояние кнопки, и пример Debounce, который показывает, как нужно очистить сигнал кнопки, устраняя ложные срабатывания от импульсов дребезга контактов. Описанная ниже библиотека является как бы результатом объединения этих двух примеров в одну маленькую библиотеку OneButton, которую Вы можете очень просто использовать в своих скетчах для опроса различных событий на кнопке. Здесь будет также объяснено, как использовать библиотеку, как она устроена, что даст Вам понимание принципа работы библиотеки.

[Чтение кнопки без блокировки программы]

Один из недостатков простых примеров опроса кнопки (имеются в виду простые примеры скетчей типа Button и Debounce, поставляемые вместе с системой программирования Arduino) в том, что они используют функцию loop(), что делает сложным повторное использование кода, который опрашивает кнопки.

Скорее всего, Ваш скетч, где нужно опрашивать кнопку, должен быть сложнее, чем вышеупомянутые примеры, поскольку обычно кроме опроса кнопок в программе нужно периодически выполнять и другие функции. Другими словами, в главном цикле loop() должны быть вызовы других функций, выполняющих нужную для Вас работу. По этой причине общее требование для библиотек и повторно используемого кода — избегать использования функции loop(). Обычно это реализуют либо с помощью обработчика прерывания таймера, либо код библиотеки должен быть устроен так, чтобы они не блокировать прокрутку цикла loop() на длительное время.

В библиотеке OneButton в цикле loop() для опроса кнопки здесь использовалась неблокирующая функция tick() библиотеки, которая должна вызываться циклически, с интервалом порядка 10 мс. Внутри этой функции Вы найдете код для детектирования всех трех опрашиваемых событий, которые происходят на кнопках (single click, double click, long press).

Неблокирующая функция получила свое название из-за того, что она не блокирует выполнение кода на циклы ожидания какого-либо события (или событий). Вместо этого она быстро выполняет внутри себя некую обработку и сразу делает возврат, позволяя другим функциям программы (которые вставлены в тело цикла loop) успешно выполниться. Все нужные результаты вызова запоминаются во внутренних статических переменных неблокирующей функции.

В нашем случае библиотека OneButton использует неблокирующую функцию tick, которая запоминает в статических переменных счетчики времени и флаги, применяемые для алгоритма детектирования событий в программе.

Неблокирующие функции нужны для реализации псевдо многозадачности, когда время процессора распределено для "одновременного" выполнения различных, иногда влияющих друг на друга задач.

Для каждого из 3 событий Вы можете зарегистрировать функцию обработки, и таким способом подключить Ваш код к библиотеке OneButton. Ваши функции будут вызываться в тот момент, когда будет детектирована соответствующая ситуация (single click, double click, long press).

[Пример использования библиотеки OneButton]

В этом простом примере показано использование библиотеки OneButton. Код скетча меняет состояния светодиода по умолчанию (на платах Arduino светодиод LED подключен к цифровому порту микроконтроллера 13), когда детектирован двойной клик на кнопке, подключенной к порту микроконтроллера A1.

[Подробности реализации библиотеки OneButton]

Внутри функции tick() библиотеки OneButton Вы найдете код, опрашивающий вход кнопки, который детектирует события single click, double click или long press. Код использует принцип конечного автомата [5] — так называемая машина конечных состояний, finite state machine (FSM), алгоритм которой показан на следующей диаграмме состояний:

Пояснения к диаграмме:

Start начало алгоритма.
wait ожидание.
Press timeout время таймаута, после истечения которого считается, что было нажатие.
Button Up кнопка отпущена.
Button down кнопка нажата.
jitter дребезг контактов, подавляемый библиотекой.
Click timeout таймаут клика на кнопке (т. е. событие, когда кнопка нажата и отпущена).
click(), doubleclick() обработчики событий одиночного и двойного нажатия.
, 1, 2 .. состояния машины FSM.

Каждый раз, когда вызывается функция tick() в какой-то текущей ситуации, делается оценка логического уровня на входе кнопки в контексте истории предыдущих вызовов и оценок этого входа. При изменении состояний входа происходит переключение по узлам машины FSM, чтобы правильно детектировать события одиночного, двойного и долгого нажатия на кнопке. Обратите внимание, что внутри библиотеки OneButton никогда не вызываются функции задержки наподобие delay(). Таким образом, все действия библиотеки быстро завершают свою работу, оставляя процессорное время микроконтроллера AVR для выполнения других функций в программе.

Ниже приведено краткое описание алгоритма работы программной машины состояний функции tick библиотеки.

Входные значения. Для оценки состояния кнопки происходит чтение логического уровня (лог. 0 или лог. 1) вывода цифрового порта, к которому подключена кнопка. Уровень на этом выводе подтягивается к лог. 1 внутри микроконтроллера AVR (так называемый pull-up, управляемый настройкой регистров DDRxn и PORTxn, подробнее см. [4]). Опрашиваемая кнопка одним выводом подключена ко входу порта и вторым выводом к земле (GND), поэтому при нажатии кнопки на входе появляется уровень лог. 0.

Примечание: на рисунке показан пример схемы подключения кнопки ко входу микроконтроллера, когда при нажатии на кнопку происходит замыкание порта на землю GND (подача на входной порт сигнала лог. 0). Это наиболее часто использующееся подключение кнопки к микроконтроллеру, однако библиотека OneButton поддерживает также и другой способ подключения, когда замыкание кнопки вызывает подачу сигнала лог. 1. Схема подключения гибко может быть настроена вызовом конструктора, в котором во втором параметре activeLow передается активный уровень для нажатия (см. исходный код библиотеки ниже).

Реализация опроса источника событий (определение лог. уровня на входе и запоминание его в переменной buttonLevel) происходит в начале выполнения кода машины состояний:

Для работы алгоритма нужны также и другие данные — значение текущего времени. Эти данные вычитываются с помощью вызова функции millis(), которая показывает, сколько прошло времени относительно предыдущего вызова кода машины состояний. Текущее значение времени копируется в переменную now:

State (состояние FSM). Информация, которая была запомнена между вызовами FSM (т. е. что происходило в предыдущем вызове tick() относительно текущего вызова) называется состоянием машины FSM (state). Для этого специально используется одна переменная с именем state, в которой удерживается информация, описывающая текущую ситуацию. Разновидности ситуаций кодируются простыми числами (0, 1, 2, . ), показанными на диаграмме выше, и это первая составляющая информации состояния. Другая составляющая — переменная, в которой сохранено время, когда кнопка была нажата в первый раз.

Читайте также:  Hal tim base start it

Эти 2 переменные определяют функционирования машины состояний, и они должны быть помечены ключевым словом static (так называемые статические переменные языка C/C++), или должны быть сделаны глобальными — это гарантирует сохранность состояния этих переменных между отдельными вызовами функции tick().

Исходная ситуация (state 0). Машина стартует с ситуации (state 0), когда происходит ожидание нажатия на кнопку. Если кнопка не нажата (на входе порта кнопки лог. 1), то функция tick() просто делает возврат, потому что она будет вызвана снова после истечения короткого промежутка времени (около 10 мс), чтобы снова проверить состояние кнопки.

Однако если кнопка была нажата (на входе порта кнопки лог. 0), это запоминается в переходе к следующему состоянию FSM (state 1). Все последующие оценки интервалов времени отсчитываются от этого момента, поэтому текущее относительное время запоминается в переменной _startTime.

Кнопка нажата первый раз (state 1). В следующий раз функция будет вызвана снова (когда пройдет несколько миллисекунд, обычно 10 мс) уже в новой ситуации (state 1), в этой ситуации кнопка уже нажата. Теперь, в state 1, происходит ожидание отпускания кнопки, тогда будет переход в следующее состояние (state 2). Кнопка останется в нажатом состоянии еще несколько вызовов в состоянии state 1, даже если было короткое нажатие, поскольку пальцы пользователя не настолько быстро могут нажимать на кнопку, чтобы не успело по времени пройти еще несколько вызовов tick().

Когда ситуация state 1 происходит достаточно долго (в реализации выбран интервал порядка 1 секунды), возникнет другое состояние — state 6. Время измеряется сравнением текущего времени и того времени, которое было запомнено в переменной _startTime при нажатии кнопки в состоянии state 0. В состоянии state 6 будет сделан вызов внешней функции press().

Кнопка была отпущена после первого нажатия (state 2). В этой ситуации (state 2), когда кнопка была быстро отпущена (или относительно быстро отпущена, прошло времени менее 1 секунды), могли иметь место 2 варианта событий:

Если прошло некоторое время после отпускания, и не было повторного нажатия, то будет вызвана внешняя функция click(), и машина состояний вернется в 0.

Если кнопка после отпускания была сразу нажата второй раз, то происходит переход к следующей ситуации (state 3):

Ожидание отпускания кнопки после двойного нажатия (state 3). В заключительной ситуации (state 3), после того как был определен второй клик в заданном интервале времени, снова происходит ожидание отпускания кнопки. Когда это произойдет, будет вызвана внешняя функция doubleClic(), и машина состояний вернется в стартовое состояние (state 0), и все начнется сначала.

Ожидание отпускания кнопки после долгого нажатия (state 6). Обработка этой ситуации (state 6) очень проста, и похожа на обработку ситуации двойного клика, где также было ожидание отпускания кнопки. Отличие только в том, что происходит простой возврат в начальное состояние машины, без вызова внешней функции.

Реализация машины конечных состояний (finite state machine, FSM) [5] во многих ситуациях упрощает программирование, и помогает в написании скетчей Arduino, имитирующих многозадачную систему.

[Инсталляция библиотеки OneButton]

Весь функциональный код библиотеки OneButton сосредоточен в двух файлах, и написан в соответствии с официальным руководством Arduino [6] (там же описана процедура сборки библиотеки).

Инсталляция кода библиотеки OneButton заключается в простом создани нового подкаталога (с именем OneButton) в папке libraries, и копировании туда файлов (OneButton.h, OneButton.cpp) из архива [2]. После этого Вам нужно перезапустить среду Arduino IDE, потому что процедура опроса наличия библиотек осуществляется при старте среды разработки Arduino IDE.

Для того, чтобы использовать библиотеку OneButton в своих программах, добавьте в начала скетча программы оператор #include со ссылкой на заголовочный файл библиотеки, указанный в угловых скобках:

Можно использовать альтернативный метод подключения библиотеки, если оставить те же 2 файла в корневой папке скетча. Тогда эти файлы станут доступны для среды разработки Arduino, когда Вы заново откроете этот скетч. Это может пригодиться, если Вы хотите доработать код библиотеки с целью её улучшения или добавления функционала. В таком случае нужно подключить заголовок библиотеки с помощью оператора #include, с указанием имени заголовочного файла в двойных кавычках:

Рабочие примеры использования библиотеки OneButton можно найти в архиве [2], см. каталог OneButton-masterexamples.

Этот скетч и библиотека показывают, как использовать один вывод порта микроконтроллера AVR, чтобы детектировать типичные события на кнопке, такие как одиночное нажатие (single click), двойное нажатие (double click) и длительное нажатие (long press). Этот функционал позволяет использовать одну и ту же кнопку для нескольких функций с небольшими затратами на аппаратуру — особенно удобно в случае применения поворотного энкодера (rotary encoder, jog-shuttle) с одной кнопкой.

Примечание: здесь приведен перевод статьи [1], исходный код библиотеки можно скачать по ссылке [2] с использованием систем GIT или SVN, либо просто в виде архива OneButton-master.zip, если нажать на кнопку "Download ZIP".

[Введение]

Начинающим программировать в системе Arduino полезно рассмотреть простой обучающий пример опроса кнопки (Button tutorial), чтобы понять, как нужно читать состояние кнопки, и пример Debounce, который показывает, как нужно очистить сигнал кнопки, устраняя ложные срабатывания от импульсов дребезга контактов. Описанная ниже библиотека является как бы результатом объединения этих двух примеров в одну маленькую библиотеку OneButton, которую Вы можете очень просто использовать в своих скетчах для опроса различных событий на кнопке. Здесь будет также объяснено, как использовать библиотеку, как она устроена, что даст Вам понимание принципа работы библиотеки.

[Чтение кнопки без блокировки программы]

Один из недостатков простых примеров опроса кнопки (имеются в виду простые примеры скетчей типа Button и Debounce, поставляемые вместе с системой программирования Arduino) в том, что они используют функцию loop(), что делает сложным повторное использование кода, который опрашивает кнопки.

Скорее всего, Ваш скетч, где нужно опрашивать кнопку, должен быть сложнее, чем вышеупомянутые примеры, поскольку обычно кроме опроса кнопок в программе нужно периодически выполнять и другие функции. Другими словами, в главном цикле loop() должны быть вызовы других функций, выполняющих нужную для Вас работу. По этой причине общее требование для библиотек и повторно используемого кода — избегать использования функции loop(). Обычно это реализуют либо с помощью обработчика прерывания таймера, либо код библиотеки должен быть устроен так, чтобы они не блокировать прокрутку цикла loop() на длительное время.

Читайте также:  Z blur что это в играх

В библиотеке OneButton в цикле loop() для опроса кнопки здесь использовалась неблокирующая функция tick() библиотеки, которая должна вызываться циклически, с интервалом порядка 10 мс. Внутри этой функции Вы найдете код для детектирования всех трех опрашиваемых событий, которые происходят на кнопках (single click, double click, long press).

Неблокирующая функция получила свое название из-за того, что она не блокирует выполнение кода на циклы ожидания какого-либо события (или событий). Вместо этого она быстро выполняет внутри себя некую обработку и сразу делает возврат, позволяя другим функциям программы (которые вставлены в тело цикла loop) успешно выполниться. Все нужные результаты вызова запоминаются во внутренних статических переменных неблокирующей функции.

В нашем случае библиотека OneButton использует неблокирующую функцию tick, которая запоминает в статических переменных счетчики времени и флаги, применяемые для алгоритма детектирования событий в программе.

Неблокирующие функции нужны для реализации псевдо многозадачности, когда время процессора распределено для "одновременного" выполнения различных, иногда влияющих друг на друга задач.

Для каждого из 3 событий Вы можете зарегистрировать функцию обработки, и таким способом подключить Ваш код к библиотеке OneButton. Ваши функции будут вызываться в тот момент, когда будет детектирована соответствующая ситуация (single click, double click, long press).

[Пример использования библиотеки OneButton]

В этом простом примере показано использование библиотеки OneButton. Код скетча меняет состояния светодиода по умолчанию (на платах Arduino светодиод LED подключен к цифровому порту микроконтроллера 13), когда детектирован двойной клик на кнопке, подключенной к порту микроконтроллера A1.

[Подробности реализации библиотеки OneButton]

Внутри функции tick() библиотеки OneButton Вы найдете код, опрашивающий вход кнопки, который детектирует события single click, double click или long press. Код использует принцип конечного автомата [5] — так называемая машина конечных состояний, finite state machine (FSM), алгоритм которой показан на следующей диаграмме состояний:

Пояснения к диаграмме:

Start начало алгоритма.
wait ожидание.
Press timeout время таймаута, после истечения которого считается, что было нажатие.
Button Up кнопка отпущена.
Button down кнопка нажата.
jitter дребезг контактов, подавляемый библиотекой.
Click timeout таймаут клика на кнопке (т. е. событие, когда кнопка нажата и отпущена).
click(), doubleclick() обработчики событий одиночного и двойного нажатия.
, 1, 2 .. состояния машины FSM.

Каждый раз, когда вызывается функция tick() в какой-то текущей ситуации, делается оценка логического уровня на входе кнопки в контексте истории предыдущих вызовов и оценок этого входа. При изменении состояний входа происходит переключение по узлам машины FSM, чтобы правильно детектировать события одиночного, двойного и долгого нажатия на кнопке. Обратите внимание, что внутри библиотеки OneButton никогда не вызываются функции задержки наподобие delay(). Таким образом, все действия библиотеки быстро завершают свою работу, оставляя процессорное время микроконтроллера AVR для выполнения других функций в программе.

Ниже приведено краткое описание алгоритма работы программной машины состояний функции tick библиотеки.

Входные значения. Для оценки состояния кнопки происходит чтение логического уровня (лог. 0 или лог. 1) вывода цифрового порта, к которому подключена кнопка. Уровень на этом выводе подтягивается к лог. 1 внутри микроконтроллера AVR (так называемый pull-up, управляемый настройкой регистров DDRxn и PORTxn, подробнее см. [4]). Опрашиваемая кнопка одним выводом подключена ко входу порта и вторым выводом к земле (GND), поэтому при нажатии кнопки на входе появляется уровень лог. 0.

Примечание: на рисунке показан пример схемы подключения кнопки ко входу микроконтроллера, когда при нажатии на кнопку происходит замыкание порта на землю GND (подача на входной порт сигнала лог. 0). Это наиболее часто использующееся подключение кнопки к микроконтроллеру, однако библиотека OneButton поддерживает также и другой способ подключения, когда замыкание кнопки вызывает подачу сигнала лог. 1. Схема подключения гибко может быть настроена вызовом конструктора, в котором во втором параметре activeLow передается активный уровень для нажатия (см. исходный код библиотеки ниже).

Реализация опроса источника событий (определение лог. уровня на входе и запоминание его в переменной buttonLevel) происходит в начале выполнения кода машины состояний:

Для работы алгоритма нужны также и другие данные — значение текущего времени. Эти данные вычитываются с помощью вызова функции millis(), которая показывает, сколько прошло времени относительно предыдущего вызова кода машины состояний. Текущее значение времени копируется в переменную now:

State (состояние FSM). Информация, которая была запомнена между вызовами FSM (т. е. что происходило в предыдущем вызове tick() относительно текущего вызова) называется состоянием машины FSM (state). Для этого специально используется одна переменная с именем state, в которой удерживается информация, описывающая текущую ситуацию. Разновидности ситуаций кодируются простыми числами (0, 1, 2, . ), показанными на диаграмме выше, и это первая составляющая информации состояния. Другая составляющая — переменная, в которой сохранено время, когда кнопка была нажата в первый раз.

Эти 2 переменные определяют функционирования машины состояний, и они должны быть помечены ключевым словом static (так называемые статические переменные языка C/C++), или должны быть сделаны глобальными — это гарантирует сохранность состояния этих переменных между отдельными вызовами функции tick().

Исходная ситуация (state 0). Машина стартует с ситуации (state 0), когда происходит ожидание нажатия на кнопку. Если кнопка не нажата (на входе порта кнопки лог. 1), то функция tick() просто делает возврат, потому что она будет вызвана снова после истечения короткого промежутка времени (около 10 мс), чтобы снова проверить состояние кнопки.

Однако если кнопка была нажата (на входе порта кнопки лог. 0), это запоминается в переходе к следующему состоянию FSM (state 1). Все последующие оценки интервалов времени отсчитываются от этого момента, поэтому текущее относительное время запоминается в переменной _startTime.

Кнопка нажата первый раз (state 1). В следующий раз функция будет вызвана снова (когда пройдет несколько миллисекунд, обычно 10 мс) уже в новой ситуации (state 1), в этой ситуации кнопка уже нажата. Теперь, в state 1, происходит ожидание отпускания кнопки, тогда будет переход в следующее состояние (state 2). Кнопка останется в нажатом состоянии еще несколько вызовов в состоянии state 1, даже если было короткое нажатие, поскольку пальцы пользователя не настолько быстро могут нажимать на кнопку, чтобы не успело по времени пройти еще несколько вызовов tick().

Когда ситуация state 1 происходит достаточно долго (в реализации выбран интервал порядка 1 секунды), возникнет другое состояние — state 6. Время измеряется сравнением текущего времени и того времени, которое было запомнено в переменной _startTime при нажатии кнопки в состоянии state 0. В состоянии state 6 будет сделан вызов внешней функции press().

Читайте также:  Rufus не видит usb hdd

Кнопка была отпущена после первого нажатия (state 2). В этой ситуации (state 2), когда кнопка была быстро отпущена (или относительно быстро отпущена, прошло времени менее 1 секунды), могли иметь место 2 варианта событий:

Если прошло некоторое время после отпускания, и не было повторного нажатия, то будет вызвана внешняя функция click(), и машина состояний вернется в 0.

Если кнопка после отпускания была сразу нажата второй раз, то происходит переход к следующей ситуации (state 3):

Ожидание отпускания кнопки после двойного нажатия (state 3). В заключительной ситуации (state 3), после того как был определен второй клик в заданном интервале времени, снова происходит ожидание отпускания кнопки. Когда это произойдет, будет вызвана внешняя функция doubleClic(), и машина состояний вернется в стартовое состояние (state 0), и все начнется сначала.

Ожидание отпускания кнопки после долгого нажатия (state 6). Обработка этой ситуации (state 6) очень проста, и похожа на обработку ситуации двойного клика, где также было ожидание отпускания кнопки. Отличие только в том, что происходит простой возврат в начальное состояние машины, без вызова внешней функции.

Реализация машины конечных состояний (finite state machine, FSM) [5] во многих ситуациях упрощает программирование, и помогает в написании скетчей Arduino, имитирующих многозадачную систему.

[Инсталляция библиотеки OneButton]

Весь функциональный код библиотеки OneButton сосредоточен в двух файлах, и написан в соответствии с официальным руководством Arduino [6] (там же описана процедура сборки библиотеки).

Инсталляция кода библиотеки OneButton заключается в простом создани нового подкаталога (с именем OneButton) в папке libraries, и копировании туда файлов (OneButton.h, OneButton.cpp) из архива [2]. После этого Вам нужно перезапустить среду Arduino IDE, потому что процедура опроса наличия библиотек осуществляется при старте среды разработки Arduino IDE.

Для того, чтобы использовать библиотеку OneButton в своих программах, добавьте в начала скетча программы оператор #include со ссылкой на заголовочный файл библиотеки, указанный в угловых скобках:

Можно использовать альтернативный метод подключения библиотеки, если оставить те же 2 файла в корневой папке скетча. Тогда эти файлы станут доступны для среды разработки Arduino, когда Вы заново откроете этот скетч. Это может пригодиться, если Вы хотите доработать код библиотеки с целью её улучшения или добавления функционала. В таком случае нужно подключить заголовок библиотеки с помощью оператора #include, с указанием имени заголовочного файла в двойных кавычках:

Рабочие примеры использования библиотеки OneButton можно найти в архиве [2], см. каталог OneButton-masterexamples.

Блог об Arduino, AVR, ARM, Linux и не только.

15 июня 2012 г.

Подавляем дребезг кнопки с библиотекой Arduino Bounce

Дребезг контактов — крайне неприятная вещь, от которой нужно избавляться. Можно это делать софтверно. К счастью, нам не придется самостоятельно ручками писать алгоритм в Arduino IDE, поскольку для нас разработчики уже написали библиотеку. Знакомимся с Bounce.

Когда мы нажимаем на кнопку, мы ожидаем от нее, что она нам что-то включит, и это будет радостно работать. То есть сигнал будет вести себя так:

Но все далеко не так радужно. Из-за дребезга при нажатии кнопки сигнал ведет себя вот так:

Согласитесь, неприятно. Дребезг длится несколько микросекунд, и если вы, например, кнопкой включаете лампочку, то лампочка включится и выключится несколько раз, пока вы держите палец, а когда вы отпустите кнопку, она может снова не гореть.

Дребезг можно подавлять как хардверно, так и софтверно. Распространены два программных алгоритма подавления дребезга.
Тупой алгоритм заключается в простой задержке срабатывая на несколько сот микросекунд после нажатия кнопки. Этот алгоритм тормозной и не исключает случайного нажатия.
Продвинутый алгоритм считает время нахождения кнопки в положении "нажато". Если это время больше некоторого значения, то кнопка считается действительно нажатой. Как только кнопка меняет свое состояние, счетчик обнуляется.
С Arduino нам можно не размышлять об этом, а использовать библиотеку Bounce.

Библиотека Bounce предназначена для подавления дребезга. Она предоставляет нам в пользование замечательный класс Bounce, в котором мы можем создавать объекты.

Сам объект выглядит так:
Bounce ( byte pin, unsugned long debounce_interval),
где pin — это номер пина Arduino, на котором сидит кнопка, а debounce_interval — время дребезга.

Полезные функции в этом классе:

int update() — проверка смены состояния, возвращает 1, если состояние пина изменилось;
void interval( unsigned long interval) — изменяет время дребезга (в мс);
int read() — читает состояние пина;
void write ( int state) — устанавливает значение пина;
void rebounce(unsignet long interval) — заставляет пин менять состояние через промежуток времени, указанный в interval, даже если на самом деле оно не меняется;
unsigned long duration(void) — возвращает время в мс, в которое пин был в текущем состоянии;
bool risingEdge() — возвращает 1 во время первого чтения, если состояние пина сменилось с 0 на 1;
bool fallingEdge() — возвращает 1 во время первого чтения, если состояние пина сменилось с 1 на 0.

Библиотечку качаем отсюда. Распаковываем это безобразие в Папку_Arduino/libraries.

Кнопка при нажатии соединяет две ее левые ноги с двумя правыми. Левую ее ногу посадим на +5V, а правую подключим к пину 2. Пин 2 также должен быть притянут к земле через резистор. Светодиод подключаем к пину 8 (мне просто так захотелось) через ограничивающий резистор.

Все очень просто:

//подключаем библиотеку Bounce
#include Bounce .h>
//дефайним значения пинов с кнопкой и со светодиодом
#define BUTTON 2
#define LED 8
//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer = Bounce (BUTTON,5);

//задаем начальное состояние светодиода "выключен"
int ledValue = LOW;

void setup () <
//определяем режимы работы пинов
pinMode(BUTTON, INPUT );
pinMode(LED, OUTPUT );
>

void loop () <
//если сменилось состояние кнопки
if ( bouncer. update () ) <
//если считано значение 1
if ( bouncer. read () == HIGH ) <
//если свет был выключен, будем его включать
if ( ledValue == LOW ) <
ledValue = HIGH ;
//если свет был включен, будем выключать
> else <
ledValue = LOW ;
>
//записываем значение вкл/выкл на пин со светодиодом
digitalWrite (LED,ledValue);
>
>
>

Ссылка на основную публикацию
Армянские каналы на смарт тв
Здравствуйте, дорогие посетители нашего портала! Ловите очередной плейлист IPTV СНГ — на этот раз телевидения солнечной и радушной Армении) В...
Webcachev01 dat что это
Иногда система Windows отображает сообщения об ошибках поврежденных или отсутствующих файлов WebCacheV01.dat. Подобные ситуации могут возникнуть, например, во время процесса...
Windows l2tp без ipsec
Изначально, не планировал выделять для данного материала отдельный пост, но так как проблема не решается годами, решил рассказать о ней...
Библиотека ардуино для кнопки
Этот скетч и библиотека показывают, как использовать один вывод порта микроконтроллера AVR, чтобы детектировать типичные события на кнопке, такие как...
Adblock detector