Skip to content

GyverLibs/uButton

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

latest PIO Foo Foo Foo

Foo

uButton

Очередной класс кнопки для Arduino.

По API это на 99% аналог EncButton, но чуточку легче (6 байт RAM на кнопку и ~650 байт флешки) и написан в более читаемом конечно-автоматном стиле, а не на флагах.

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

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

Зависимости

  • GyverIO

Содержание

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

Дефайны настроек

Объявлять до подключения библиотеки

#define UB_DEB_TIME 50      // дебаунс
#define UB_HOLD_TIME 600    // время до перехода в состояние "удержание"
#define UB_STEP_TIME 400    // время до перехода в состояние "импульсное удержание"
#define UB_STEP_PRD 200     // период импульсов
#define UB_CLICK_TIME 500   // ожидание кликов
#define UB_TOUT_TIME 1000   // таймаут события "таймаут"

Классы

uButtonVirt

Класс виртуальной кнопки.

// =============== СОСТОЯНИЕ ===============

enum class State {
    Idle,          // простаивает [состояние]
    Press,         // нажатие [событие]
    Click,         // клик (отпущено до удержания) [событие]
    WaitHold,      // ожидание удержания [состояние]
    Hold,          // удержание [событие]
    ReleaseHold,   // отпущено до импульсов [событие]
    WaitStep,      // ожидание импульсов [состояние]
    Step,          // импульс [событие]
    WaitNextStep,  // ожидание следующего импульса [состояние]
    ReleaseStep,   // отпущено после импульсов [событие]
    Release,       // отпущено (в любом случае) [событие]
    WaitClicks,    // ожидание кликов [состояние]
    Clicks,        // клики [событие]
    WaitTimeout,   // ожидание таймаута [состояние]
    Timeout,       // таймаут [событие]
};
State getState();   // получить текущее состояние
void reset();       // сбросить состояние (принудительно закончить обработку)

// =============== СОБЫТИЯ ===============

// У всех событий кроме timeout есть перегрузка с аргументом uint8_t clicks - функция вернёт true, если событие "истино" и количество кликов совподает

// кнопка нажата [событие]
bool press();
bool press(uint8_t clicks);

// клик по кнопке (отпущена без удержания) [событие]
bool click();
bool click(uint8_t clicks);

// кнопка была удержана (больше таймаута) [событие]
bool hold();
bool hold(uint8_t clicks);

// кнопка отпущена после удержания [событие]
bool releaseHold();
bool releaseHold(uint8_t clicks);

// импульсное удержание [событие]
bool step();
bool step(uint8_t clicks);

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

// кнопка отпущена после удержания или импульсного удержания [событие]
bool releaseHoldStep();
bool releaseHoldStep(uint8_t clicks);

// кнопка отпущена (в любом случае) [событие]
bool release();
bool release(uint8_t clicks);

// зафиксировано несколько кликов [событие]
bool hasClicks();
bool hasClicks(uint8_t clicks);

// после взаимодействия с кнопкой, мс [событие]
bool timeout();

// =============== СОСТОЯНИЯ ===============

// вышел таймаут после взаимодействия с кнопкой, но меньше чем системный UB_TOUT_TIME
bool timeout(uint16_t ms);

// кнопка зажата (между press() и release()) [состояние]
bool pressing();
bool pressing(uint8_t clicks);

// кнопка удерживается (после hold()) [состояние]
bool holding();
bool holding(uint8_t clicks);

// кнопка удерживается (после step()) [состояние]
bool stepping();
bool stepping(uint8_t clicks);

// кнопка ожидает повторных кликов (между click() и hasClicks()) [состояние]
bool waiting();

// идёт обработка (между первым нажатием и после ожидания кликов) [состояние]
bool busy();

// =============== ВРЕМЯ ===============

// время, которое кнопка удерживается (с начала нажатия), мс
uint16_t pressFor();

// кнопка удерживается дольше чем (с начала нажатия), мс [состояние]
bool pressFor(uint16_t ms);

// время, которое кнопка удерживается (с начала удержания), мс
uint16_t holdFor();

// кнопка удерживается дольше чем (с начала удержания), мс [состояние]
bool holdFor(uint16_t ms);

// время, которое кнопка удерживается (с начала степа), мс
uint16_t stepFor();

// кнопка удерживается дольше чем (с начала степа), мс [состояние]
bool stepFor(uint16_t ms);

// =============== ЗНАЧЕНИЯ ===============

// получить количество кликов
uint8_t getClicks();

// получить количество степов
uint8_t getSteps();

// =============== ОБРАБОТКА ===============

// вызвать, когда кнопка нажата в прерывании
void pressISR();

// обработка с антидребезгом. Вернёт true при смене состояния
bool pollDebounce(bool pressed);

// обработка. Вернёт true при смене состояния
bool poll(bool pressed);

uButton

Ккласс uButton наследует uButtonVirt, автоматически инициализируя пин и отправляя данные с него в pollDebounce внутри tick.

// кнопка подключается на GND (open drain)
uButton(uint8_t pin, uint8_t mode = INPUT_PULLUP);

// вызывать в loop. Вернёт true при смене состояния
bool tick();

// прочитать состояние кнопки
bool readButton();

Примеры

#include <uButton.h>

uButton b(3);

void setup() {
    Serial.begin(115200);
    Serial.println("start");
}

void loop() {
    if (b.tick()) {
        if (b.press()) Serial.println("Press");
        if (b.click()) Serial.println("Click");
        if (b.hold()) Serial.println("Hold");
        if (b.releaseHold()) Serial.println("ReleaseHold");
        if (b.step()) Serial.println("Step");
        if (b.releaseStep()) Serial.println("releaseStep");
        if (b.release()) Serial.println("Release");
        if (b.hasClicks()) Serial.print("Clicks: "), Serial.println(b.getClicks());
        if (b.timeout()) Serial.println("Timeout");

        switch (b.getState()) {
            // ...
        }
    }
}

Версии

  • v1.0

Установка

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

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

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

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

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

About

Очередной класс кнопки для Arduino

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •  

Languages