Skip to content
This repository was archived by the owner on Sep 8, 2023. It is now read-only.
/ VirtualButton Public archive

Библиотека с логикой обработки кнопки (виртуальная кнопка) для Arduino

License

Notifications You must be signed in to change notification settings

GyverLibs/VirtualButton

Repository files navigation

latest Foo Foo Foo

Foo

⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️

ВНИМАНИЕ, БИБЛИОТЕКА УСТАРЕЛА! ИСПОЛЬЗУЙ БИБЛИОТЕКУ EncButton, ОНА ЛЕГЧЕ И ИМЕЕТ БОЛЬШЕ ВОЗМОЖНОСТЕЙ

⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️

VirtualButton

Библиотека с логикой обработки кнопки (виртуальная кнопка)

  • Очень лёгкий оптимизированный код
  • Множество сценариев использования
  • Позволяет расширить функционал других библиотек
  • Обработка:
    • Антидребезг
    • Нажатие
    • Отпускание
    • Клик
    • Несколько кликов
    • Счётчик кликов
    • Удержание
    • Импульсное удержание
    • Действия с предварительными кликами

Совместимость

Совместима со всеми Arduino платформами (используются Arduino-функции)

Содержание

Установка

  • Библиотеку можно найти по названию VirtualButton и установить через менеджер библиотек в:
    • Arduino IDE
    • Arduino IDE v2
    • PlatformIO
  • Скачать библиотеку .zip архивом для ручной установки:
    • Распаковать и положить в C:\Program Files (x86)\Arduino\libraries (Windows x64)
    • Распаковать и положить в C:\Program Files\Arduino\libraries (Windows x32)
    • Распаковать и положить в Документы/Arduino/libraries/
    • (Arduino IDE) автоматическая установка из .zip: Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… и указать скачанный архив
  • Читай более подробную инструкцию по установке библиотек здесь

Обновление

  • Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи
  • Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить"
  • Вручную: удалить папку со старой версией, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!

Инициализация

VButton btn;

Использование

Описание методов

// =================== ОПРОС ===================
// опрос, вернёт true если статус кнопки изменился. Принимает состояние кнопки (1 - нажата)
bool poll(bool s);

bool press();                   // кнопка нажата
bool release();                 // кнопка отпущена
bool click();                   // клик по кнопке

bool held();                    // кнопка удержана
bool held(uint8_t clk);         // кнопка удержана с предварительным накликиванием

bool hold();                    // кнопка удерживается
bool hold(uint8_t clk);         // кнопка удерживается с предварительным накликиванием

bool step();                    // режим импульсного удержания
bool step(uint8_t clk);         // режим импульсного удержания с предварительным накликиванием

bool releaseStep();             // кнопка отпущена после импульсного удержания
bool releaseStep(uint8_t clk);  // кнопка отпущена после импульсного удержания с предварительным накликиванием

bool hasClicks(uint8_t num);    // имеются клики
uint8_t hasClicks();            // имеются клики

bool timeout(uint16_t tout);    // с момента отпускания кнопки прошло указанное время, миллисекунд

uint8_t clicks;                 // счётчик кликов

// ================= НАСТРОЙКИ =================
// таймаут удержания кнопки для hold(), 32.. 8100 мс (по умолч. 1000 мс)
void setHoldTimeout(uint16_t tout);

// период импульсов step(), 32.. 8100 мс (по умолч. 500 мс)
void setStepTimeout(uint16_t tout);

// ================= СИСТЕМНОЕ =================
bool busy();            // вернёт true, если всё ещё нужно вызывать poll для опроса таймаутов
void reset();           // сбросить все флаги

// ============= ДЕФАЙНЫ НАСТРОЕК =============
// дефайнить ПЕРЕД ПОДКЛЮЧЕНИЕМ БИБЛИОТЕКИ, показаны значения по умолчанию
#define VB_DEB 50       // дебаунс кнопки, мс
#define VB_CLICK 400    // таймаут накликивания кнопки, мс

Логика работы

Для использования кнопки на пинах МК без написания лишнего кода используй библиотеку EncButton

В метод poll(state) нужно как можно чаще передавать текущее состояние кнопки: 1 - нажата, 0 - отпущена. На основе этого библиотека будет обрабатывать таймауты и режимы нажатий, а затем "сигналить" при помощи набора функций (см. ниже). Большинство функций имеют механизм однократного срабатывания, т.е. один раз возвращают true при наступлении события, а затем возвращают false до повторного наступления события.

  • press() - кнопка была нажата. [однократно вернёт true]
  • release() - кнопка была отпущена. [однократно вернёт true]
  • timeout(tout) - с момента отпускания кнопки прошло указанное время, миллисекунд. [однократно вернёт true]
  • click() - кнопка была кликнута, т.е. нажата и отпущена до таймаута удержания. [однократно вернёт true]
  • held() - кнопка была удержана дольше таймаута удержания. [однократно вернёт true]
  • held(clicks) - то же самое, но функция принимает количество кликов, сделанных до удержания. Примечание: held() без аргумента перехватит вызов! См. пример preClicks. [однократно вернёт true]
  • hold() - кнопка была удержана дольше таймаута удержания. [возвращает true, пока удерживается]
  • hold(clicks) - то же самое, но функция принимает количество кликов, сделанных до удержания. Примечание: hold() без аргумента перехватит вызов! См. пример preClicks. [возвращает true, пока удерживается]
  • step() - режим "импульсного удержания": после удержания кнопки дольше таймаута данная функция [возвращает true с периодом VB_STEP]. Удобно использовать для пошагового изменения переменных: if (btn.step()) val++;.
  • step(clicks) - то же самое, но функция принимает количество кликов, сделанных до удержания. Примечание: step() без аргумента перехватит вызов! См. пример StepMode и preClicks.
  • releaseStep() - кнопка была отпущена после импульсного удержания. Может использоваться для изменения знака инкремента переменной. См. пример StepMode. [однократно вернёт true]
  • releaseStep(clicks) - то же самое, но функция принимает количество кликов, сделанных до удержания. Примечание: releaseStep() без аргумента перехватит вызов! См. пример StepMode и preClicks. [однократно вернёт true]
  • hasClicks(clicks) - было сделано указанное количество кликов с периодом менее VB_CLICK. [однократно вернёт true]
  • hasClicks() - вернёт количество кликов, сделанных с периодом менее VB_CLICK. В противном случае вернёт 0.
  • uint8_t clicks - публичная переменная, хранит количество сделанных кликов с периодом менее VB_CLICK. Сбрасывается в 0 после нового клика.

diagram

Пример:

void loop() {
  btn.poll(digitalRead(PIN));
  if (btn.click()) Serial.println("Click!");
  if (btn.held()) Serial.println("Held!");
}

Оптимизация

Чтобы лишний раз не опрашивать "сигнальные" функции, можно поместить их в условие: метод poll() возвращает true, когда статус кнопки изменился:

void loop() {
  if (btn.poll(digitalRead(PIN))) {
    if (btn.click()) Serial.println("Click!");
    if (btn.held()) Serial.println("Held!");
  }
}

Наследование

Библиотека задумана как инструмент для разработчика. С её помощью можно расширить функциональность кнопки, опрашиваемой любым способом:

  • Напрямую с пина МК
  • Сдвиговый регистр
  • Матричная клавиатура
  • Резистивная клавиатура
  • Резистивно-матричная клавиатура
  • Ёмкостная кнопка
  • И так далее

Пример реализации класса кнопки, который опрашивает пин стандартными средствами, но использует все возможности VirtualButton:

class MyBtn : public VButton {
  public:
  MyBtn(uint8_t pin) {
    _pin = pin;
    pinMode(_pin, INPUT_PULLUP);
  }
  bool tick() {
    return poll(!digitalRead(_pin));
  }
  uint8_t _pin;
};

Тут мы реализовали метод tick(), который будет опрашивать пин и передавать в VButton. Классу доступны все возможности VirtualButton:

MyBtn btn(3);

void loop() {
  btn.tick();

  if (btn.press()) Serial.println("press");
  if (btn.click()) Serial.println("click");
  if (btn.release()) Serial.println("release");
  // .......
}

Примеры

Остальные примеры смотри в examples!

Версии

  • v1.0 - релиз
  • v1.1 - добавлен механизм "таймаута"

Баги и обратная связь

При нахождении багов создавайте Issue, а лучше сразу пишите на почту [email protected]
Библиотека открыта для доработки и ваших Pull Request'ов!

При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать:

  • Версия библиотеки
  • Какой используется МК
  • Версия SDK (для ESP)
  • Версия Arduino IDE
  • Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
  • Какой код загружался, какая работа от него ожидалась и как он работает в реальности
  • В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код

About

Библиотека с логикой обработки кнопки (виртуальная кнопка) для Arduino

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages