

# EncButton
Ультра лёгкая и быстрая библиотека для энкодера, энкодера с кнопкой или просто кнопки
- Максимально быстрое чтение пинов для AVR (ATmega328/ATmega168, ATtiny85/ATtiny13)
- Оптимизированный вес
- Быстрые и лёгкие алгоритмы кнопки и энкодера
- Энкодер: поворот, нажатый поворот, быстрый поворот, счётчик
- Кнопка: антидребезг, клик, несколько кликов, счётчик кликов, удержание, режим step
- Подключение - **только с подтяжкой к питанию** (внешней или внутренней)!
- Опциональный режим callback (+22б SRAM на каждый экземпляр)
- Виртуальный режим (кнопка, энк, энк с кнопкой)
### Совместимость
Совместима со всеми Arduino платформами (используются Arduino-функции)
## Содержание
- [Установка](#install)
- [Инициализация](#init)
- [Использование](#usage)
- [Пример](#example)
- [Версии](#versions)
- [Баги и обратная связь](#feedback)
## Установка
- Библиотеку можно найти по названию **EncButton** и установить через менеджер библиотек в:
- Arduino IDE
- Arduino IDE v2
- PlatformIO
- [Скачать библиотеку](https://github.com/GyverLibs/EncButton/archive/refs/heads/main.zip) .zip архивом для ручной установки:
- Распаковать и положить в *C:\Program Files (x86)\Arduino\libraries* (Windows x64)
- Распаковать и положить в *C:\Program Files\Arduino\libraries* (Windows x32)
- Распаковать и положить в *Документы/Arduino/libraries/*
- (Arduino IDE) автоматическая установка из .zip: *Скетч/Подключить библиотеку/Добавить .ZIP библиотеку…* и указать скачанный архив
- Читай более подробную инструкцию по установке библиотек [здесь](https://alexgyver.ru/arduino-first/#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA)
## Инициализация
```cpp
EncButton enc; // энкодер с кнопкой и пинами A, B, KEY
EncButton enc; // просто энкодер с пинами A, B
EncButton btn; // просто кнопка с пином KEY
// MODE: EB_TICK или EB_CALLBACK - режим работы ручной или с обработчиками
// по умолчанию пины настроены в INPUT_PULLUP
// Если используется внешняя подтяжка - лучше перевести в INPUT
EncButton enc(INPUT);
// Виртуальный режим:
EncButton enc; // виртуальная кнопка
EncButton enc; // виртуальный энк с кнопкой
EncButton enc; // виртуальный энк
// в tick нужно передавать виртуальное значение, см. ниже!
```
## Использование
```cpp
void pullUp(); // подтянуть пины внутренней подтяжкой
void holdEncButton(bool state); // виртуально зажать кнопку энкодера
void setHoldTimeout(int tout); // установить время удержания кнопки, мс (до 30 000)
// тикер, вызывать как можно чаще или в прерывании
// вернёт отличное от нуля значение, если произошло какое то событие
uint8_t tick();
// tick может принимать виртуальный сигнал при режиме VIRT_:
// (сигнал кнопки)
// (сигнал энкодера А, сигнал энкодера B)
// (сигнал энкодера А, сигнал энкодера B, сигнал кнопки)
uint8_t getState(); // получить статус
void resetState(); // сбросить статус
// обработка энкодера
bool isTurn(); // факт поворота
bool isRight(); // вправо
bool isLeft(); // влево
bool isRightH(); // вправо нажатый
bool isLeftH(); // влево нажатый
bool isFast(); // быстрый
int counter; // доступ к счётчику энкодера
// обработка кнопки
bool isPress(); // нажатие
bool isRelease(); // отпускание
bool isClick(); // клик
bool isHolded(); // было удержание (однократное срабатывание)
bool isHold(); // удерживается (постоянное срабатывание)
bool isStep(); // режим шага
bool state(); // текущий статус кнопки
bool hasClicks(uint8_t numClicks); // проверка на наличие указанного количества кликов
uint8_t hasClicks(); // вернёт количество кликов, если они есть
uint8_t clicks; // доступ к счётчику кликов
// для режима с обработчиком
void attach(eb_callback type, void (*handler)()); // подключить обработчик
void detach(eb_callback type); // отключить обработчик
void attachClicks(uint8_t amount, void (*handler)()); // подключить обработчик на количество кликов (может быть только один!)
void detachClicks(); // отключить обработчик на количество кликов
// eb_callback может быть:
TURN_HANDLER
RIGHT_HANDLER
LEFT_HANDLER
RIGHT_H_HANDLER
LEFT_H_HANDLER
CLICK_HANDLER
HOLDED_HANDLER
STEP_HANDLER
HOLD_HANDLER
CLICKS_HANDLER
PRESS_HANDLER
RELEASE_HANDLER
// СМОТРИ ПРИМЕР
// дефайны настроек (дефайнить ПЕРЕД ПОДКЛЮЧЕНИЕМ БИБЛИОТЕКИ)
// показаны значения по умолчанию
//#define EB_FAST 30 // таймаут быстрого поворота, мс
//#define EB_DEB 80 // дебаунс кнопки, мс
//#define EB_HOLD 1000 // таймаут удержания кнопки, мс
//#define EB_STEP 500 // период срабатывания степ, мс
//#define EB_CLICK 400 // таймаут накликивания, мс
```
## Пример
Остальные примеры смотри в **examples**!
```cpp
// Пример с прямой работой библиотеки
#include
EncButton enc; // энкодер с кнопкой
void setup() {
Serial.begin(9600);
enc.counter = 100; // изменение счётчика
}
void loop() {
enc.tick();
if (enc.isTurn()) { // любой поворот
Serial.print("turn ");
Serial.println(enc.counter); // вывод счётчика
}
if (enc.isLeft()) {
if (enc.isFast()) Serial.println("fast left");
else Serial.println("left");
}
if (enc.isRight()) {
if (enc.isFast()) Serial.println("fast right");
else Serial.println("right");
}
if (enc.isLeftH()) Serial.println("leftH");
if (enc.isRightH()) Serial.println("rightH");
if (enc.isClick()) Serial.println("click");
if (enc.isHolded()) Serial.println("holded");
if (enc.isStep()) Serial.println("step");
if (enc.isPress()) Serial.println("press");
if (enc.isClick()) Serial.println("click");
if (enc.isRelease()) Serial.println("release");
if (enc.hasClicks(1)) Serial.println("1 click");
if (enc.hasClicks(2)) Serial.println("2 click");
if (enc.hasClicks(3)) Serial.println("3 click");
if (enc.hasClicks(5)) Serial.println("5 click");
if (enc.hasClicks()) Serial.println(enc.clicks);
//if (enc.isHold()) Serial.println("hold");
}
```
## Версии
- v1.1 - пуллап отдельныи методом
- v1.2 - можно передать конструктору параметр INPUT_PULLUP / INPUT(умолч)
- v1.3 - виртуальное зажатие кнопки энкодера вынесено в отдельную функцию + мелкие улучшения
- v1.4 - обработка нажатия и отпускания кнопки
- v1.5 - добавлен виртуальный режим
- v1.6 - оптимизация работы в прерывании
- v1.6.1 - подтяжка по умолчанию INPUT_PULLUP
- v1.7 - большая оптимизация памяти, переделан FastIO
- v1.8 - индивидуальная настройка таймаута удержания кнопки (была общая на всех)
## Баги и обратная связь
При нахождении багов создавайте **Issue**, а лучше сразу пишите на почту [alex@alexgyver.ru](mailto:alex@alexgyver.ru)
Библиотека открыта для доработки и ваших **Pull Request**'ов!