Giter Club home page Giter Club logo

gyverbutton's Introduction

latest Foo Foo Foo

Foo

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

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

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

GyverButton

Библиотека для многофункциональной отработки нажатия кнопки

  • Работа с нормально замкнутыми и нормально разомкнутыми кнопками
  • Работа с подключением PULL_UP и PULL_DOWN
  • Опрос кнопки с программным антидребезгом контактов (настраиваемое время)
  • Отработка нажатия, удерживания, отпускания, клика по кнопке (+ настройка таймаутов)
  • Отработка одиночного, двойного и тройного нажатия (вынесено отдельно)
  • Отработка любого количества нажатий кнопки (функция возвращает количество нажатий)
  • Функция изменения значения переменной с заданным шагом и заданным интервалом по времени
  • Возможность работы с "виртуальными" кнопками (все возможности библиотеки используются для матричных и резистивных клавиатур)

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

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

Документация

К библиотеке есть расширенная документация

Содержание

Установка

  • Библиотеку можно найти по названию GyverButton и установить через менеджер библиотек в:
    • 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: найти библиотеку как при установке и нажать "Обновить"
  • Вручную: удалить папку со старой версией, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!

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

GButton btn;                     // без привязки к пину (виртуальная кнопка) и без указания типа (по умолч. HIGH_PULL и NORM_OPEN)
GButton btn(пин);                // с привязкой к пину и без указания типа (по умолч. HIGH_PULL и NORM_OPEN)
GButton btn(пин, тип подключ.);  // с привязкой к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и без указания типа кнопки (по умолч. NORM_OPEN)
GButton btn(пин, тип подключ., тип кнопки);         // с привязкой к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и типа кнопки (NORM_OPEN / NORM_CLOSE)
GButton btn(BTN_NO_PIN, тип подключ., тип кнопки);  // без привязки к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и типа кнопки (NORM_OPEN / NORM_CLOSE)

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

void setDebounce(uint16_t debounce);        // установка времени антидребезга (по умолчанию 80 мс)
void setTimeout(uint16_t timeout);          // установка таймаута удержания (по умолчанию 300 мс)
void setClickTimeout(uint16_t timeout);      // установка таймаута между кликами (по умолчанию 500 мс)  
void setStepTimeout(uint16_t step_timeout); // установка таймаута между инкрементами (по умолчанию 400 мс)  
void setType(uint8_t type);     // установка типа кнопки (HIGH_PULL - подтянута к питанию, LOW_PULL - к gnd)  
void setDirection(uint8_t dir); // установка направления (разомкнута/замкнута по умолчанию - NORM_OPEN, NORM_CLOSE)  
  
void setTickMode(uint8_t tickMode); // (MANUAL / AUTO) ручной или автоматический опрос кнопки функцией tick()  
// MANUAL - нужно вызывать функцию tick() вручную                            
// AUTO - tick() входит во все остальные функции и опрашивается сама
  
void tick();               // опрос кнопки  
void tick(boolean state);  // опрос внешнего значения (0 нажато, 1 не нажато) (для матричных, резистивных клавиатур и джойстиков)
  
boolean isPress();    // возвращает true при нажатии на кнопку. Сбрасывается после вызова
boolean isRelease();  // возвращает true при отпускании кнопки. Сбрасывается после вызова
boolean isClick();    // возвращает true при клике. Сбрасывается после вызова
boolean isHolded();   // возвращает true при удержании дольше timeout. Сбрасывается после вызова
boolean isHold();     // возвращает true при нажатой кнопке, не сбрасывается
boolean state();      // возвращает состояние кнопки
boolean isSingle();   // возвращает true при одиночном клике. Сбрасывается после вызова
boolean isDouble();   // возвращает true при двойном клике. Сбрасывается после вызова
boolean isTriple();   // возвращает true при тройном клике. Сбрасывается после вызова
  
boolean hasClicks();  // проверка на наличие кликов. Сбрасывается после вызова
uint8_t getClicks();  // вернуть количество кликов
uint8_t getHoldClicks();// вернуть количество кликов, предшествующее удерживанию
  
boolean isStep();     // возвращает true по таймеру setStepTimeout, смотри пример
void resetStates();   // сбрасывает все is-флаги и счётчики

Пример

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

// Пример использования библиотеки GyverButton, все возможности в одном скетче.

#define BTN_PIN 3				// кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND)

#include "GyverButton.h"
GButton butt1(BTN_PIN);

// Варианты инициализации:
// GButton btn;               // без привязки к пину (виртуальная кнопка) и без указания типа (по умолч. HIGH_PULL и NORM_OPEN)
// GButton btn(пин);          // с привязкой к пину и без указания типа (по умолч. HIGH_PULL и NORM_OPEN)
// GButton btn(пин, тип подключ.);    // с привязкой к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и без указания типа кнопки (по умолч. NORM_OPEN)
// GButton btn(пин, тип подключ., тип кнопки);      // с привязкой к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и типа кнопки (NORM_OPEN / NORM_CLOSE)
// GButton btn(BTN_NO_BTN_PIN, тип подключ., тип кнопки); // без привязки к пину и указанием типа подключения (HIGH_PULL / LOW_PULL) и типа кнопки (NORM_OPEN / NORM_CLOSE)

int value = 0;

void setup() {
  Serial.begin(9600);

  butt1.setDebounce(50);        // настройка антидребезга (по умолчанию 80 мс)
  butt1.setTimeout(300);        // настройка таймаута на удержание (по умолчанию 500 мс)
  butt1.setClickTimeout(600);   // настройка таймаута между кликами (по умолчанию 300 мс)

  // HIGH_PULL - кнопка подключена к GND, пин подтянут к VCC (BTN_PIN --- КНОПКА --- GND)
  // LOW_PULL  - кнопка подключена к VCC, пин подтянут к GND
  // по умолчанию стоит HIGH_PULL
  butt1.setType(HIGH_PULL);

  // NORM_OPEN - нормально-разомкнутая кнопка
  // NORM_CLOSE - нормально-замкнутая кнопка
  // по умолчанию стоит NORM_OPEN
  butt1.setDirection(NORM_OPEN);
}

void loop() {
  butt1.tick();  // обязательная функция отработки. Должна постоянно опрашиваться

  if (butt1.isClick()) Serial.println("Click");         // проверка на один клик
  if (butt1.isSingle()) Serial.println("Single");       // проверка на один клик
  if (butt1.isDouble()) Serial.println("Double");       // проверка на двойной клик
  if (butt1.isTriple()) Serial.println("Triple");       // проверка на тройной клик

  if (butt1.hasClicks())                                // проверка на наличие нажатий
    Serial.println(butt1.getClicks());                  // получить (и вывести) число нажатий

  if (butt1.isPress()) Serial.println("Press");         // нажатие на кнопку (+ дебаунс)
  if (butt1.isRelease()) Serial.println("Release");     // отпускание кнопки (+ дебаунс)
  if (butt1.isHold()) {									// если кнопка удерживается
    Serial.print("Holding ");							// выводим пока удерживается
    Serial.println(butt1.getHoldClicks());				// можно вывести количество кликов перед удержанием!
  }
  if (butt1.isHold()) Serial.println("Holding");        // проверка на удержание
  //if (butt1.state()) Serial.println("Hold");          // возвращает состояние кнопки

  if (butt1.isStep()) {                                 // если кнопка была удержана (это для инкремента)
    value++;                                            // увеличивать/уменьшать переменную value с шагом и интервалом
    Serial.println(value);                              // для примера выведем в порт
  }
}

Версии

  • v2.15: Добавлена возможность объявить кнопку без привязки к пину
  • v3.0: Ускорен и оптимизирован код, переделана инициализация, дополнены примеры
  • v3.1: isStep может принимать количество кликов, сделанных перед ним (см. пример clicks_step)
  • v3.2: Добавлен метод getHoldClicks() - вернуть количество кликов, предшествующее удерживанию
  • v3.3: Мелкие исправления
  • v3.4: Добавлен метод resetStates(), сбрасывающий состояния и счётчики
  • v3.5: увелична производительность для AVR Arduino
  • v3.6: добавлен отдельный класс для работы с аналоговыми клавиатурами, см пример analogKeyboardG
  • v3.7: исправления от Dryundel:
    • Любой таймаут удержания
    • Single, Double и Triple теперь не мешают hasClicks и getClicks и работают совместно
    • isStep() тоже теперь ничего не мешает и он работает более корректно
  • v3.8: исправления от Dryundel

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

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

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

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

gyverbutton's People

Contributors

alexgyver avatar gyverlibs avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

gyverbutton's Issues

Digispark Attiny85 and button

Загрузил пример из библиотеки, клики вроде ловит, но удержание (hold) - нет.
Импульсного удержание тоже не наблюдаю.

Вообще, очень сложно повестить кнопку именно на этот контроллер. Или вообще не работает, или работает через раз.
С внешним подтягивающим - очень плохо. С внутренним - уже лучше, но тоже плохо.
Игры с миллисс еще на пару пунктов улучшают ситуацию, но не решают проблему.
Мои любимые прерывания срабатывают хаотично и самопроизвольно. После эндцати часов тюнинга можно добиться срабатывания "через раз".

Что касается работы через "проверенную" библиотеку GyverButton - пока не понятно. Тоже нет четкой работы.

https://electrobattery.ru/wa-data/public/shop/products/23/22/2223/images/733/733.750x0.jpg

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.