Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

latest PIO Foo Foo Foo

Foo

uEncoder

Очередной класс энкодера и энкодера с кнопкой (на базе uButton) для Arduino.

По API это на 99% аналог EncButton, но чуточку легче, в 1.5 раза быстрее опрашивается и написан в более читаемом конечно-автоматном стиле, а не на флагах.

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

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

Зависимости

Содержание

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

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

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

#define UE_FAST_TIME 32  // время между тиками для быстрого поворота (не меньше 16)

Классы

uEncoderVirt

Класс виртуального энкодера без кнопки.

// =============== НАСТРОЙКИ ===============

// типы энкодеров
enum class uEType {
    Step4Low,   // активный низкий сигнал (подтяжка к VCC). Полный период (4 фазы) за щелчок
    Step4High,  // активный высокий сигнал (подтяжка к GND). Полный период (4 фазы) за щелчок
    Step2,      // половина периода (2 фазы) за щелчок
    Step1,      // четверть периода (1 фаза) за щелчок
};

// установить тип энкодера (uEType::Step4Low, uEType::Step4High, uEType::Step2, uEType::Step1)
void setEncType(uEType type);

// инвертировать направление энкодера
void setEncReverse(bool rev);

// инициализация энкодера
void initEnc(bool e0, bool e1);

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

enum class State {
    Idle,           // простаивает
    Left,           // поворот влево
    LeftFast,       // быстрый поворот влево
    LeftHold,       // нажатый поворот влево
    LeftHoldFast,   // быстрый нажатый поворот влево
    Right,          // поворот вправо
    RightFast,      // быстрый поворот вправо
    RightHold,      // нажатый поворот вправо
    RightHoldFast,  // быстрый нажатый поворот вправо
};
State getState();   // получить текущее состояние
void reset();       // сбросить состояние (принудительно закончить обработку)

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

// был поворот [событие]
uint8_t turn();

// направление энкодера (1 или -1) [состояние]
int8_t dir();

// направление энкодера (0 или 1) [состояние]
bool dirBool();

// нажатый поворот энкодера [событие]
bool turnH();

// быстрый поворот энкодера [состояние]
bool fast();

// поворот направо [событие]
bool right();

// поворот налево [событие]
bool left();

// нажатый поворот направо [событие]
bool rightH();

// нажатый поворот налево [событие]
bool leftH();

// нажата кнопка энкодера [состояние]
bool encHolding();

// =============== ОПРОС ===============

// опросить энкодер
bool poll(bool e0, bool e1, bool pressed = false);

// опросить энкодер без смены состояния
State pollRaw(bool e0, bool e1, bool pressed = false);

uEncoder

Класс uEncoder наследует uEncoderVirt, отправляя данные с него в poll внутри tick.

// указать пины и их режим работы
uEncoder(uint8_t p0, uint8_t p1, uint8_t mode = INPUT);

// опросить энкодер
bool tick(bool pressed = false);

uEncoderISR

Класс uEncoder наследует uEncoderVirt, отправляя данные с него в poll внутри tick. Сам опрос происходит в прерывании, буферизация на 4 щелчка.

// указать пины и их режим работы
uEncoder(uint8_t p0, uint8_t p1, uint8_t mode = INPUT);

// опросить энкодер
bool tick();

// опросить энкодер в прерывании
void tickISR(bool pressed = false);

uEncButton

Класс uEncButton наследует uEncoder и uButton, опрашивает их. Доступны все события кнопки. При повороте энкодера при нажатой кнопке сбрасываются все события кнопки, кроме отпускания.

uEncButton(uint8_t encA, uint8_t encB, uint8_t btn, uint8_t modeEnc = INPUT, uint8_t modeBtn = INPUT_PULLUP);

// опросить. Вернёт true при событии
bool tick();

uEncButtonISR

Класс uEncButtonISR наследует uEncoderISR и uButton, опрашивает их. Доступны все события кнопки. При повороте энкодера при нажатой кнопке сбрасываются все события кнопки, кроме отпускания.

uEncButtonISR(uint8_t encA, uint8_t encB, uint8_t btn, uint8_t modeEnc = INPUT, uint8_t modeBtn = INPUT_PULLUP);

// опросить. Вернёт true при событии
bool tick();

// опросить энкодер в прерывании
void tickISR();

Примеры

// настройки таймаутов, мс
// #define UE_FAST_TIME 32  // время между тиками для быстрого поворота

#include <uEncButton.h>

uEncButton eb(2, 3, 4);

// режим опроса энка в прерывании
// void isr() {
//     eb.tickISR();
// }

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

    // режим опроса энка в прерывании
    // attachInterrupt(0, isr, CHANGE);
    // attachInterrupt(1, isr, CHANGE);
}

void loop() {
    eb.tick();

    // обработка поворота общая
    if (eb.turn()) {
        Serial.print("turn: dir ");
        Serial.print(eb.dir());
        Serial.print(", fast ");
        Serial.print(eb.fast());
        Serial.print(", hold ");
        Serial.print(eb.pressing());
        Serial.print(", clicks ");
        Serial.print(eb.getClicks());
        Serial.println();
    }

    // обработка поворота раздельная
    if (eb.left()) Serial.println("left");
    if (eb.right()) Serial.println("right");
    if (eb.leftH()) Serial.println("leftH");
    if (eb.rightH()) Serial.println("rightH");

    // кнопка
    if (eb.press()) Serial.println("press");
    if (eb.click()) Serial.println("click");
    if (eb.release()) Serial.println("release");

    // общий таймаут
    if (eb.timeout(1000)) Serial.println("timeout");
}

Версии

  • v1.0

Установка

  • Библиотеку можно найти по названию uEncoder и установить через менеджер библиотек в:
    • 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, а лучше сразу пишите на почту alex@alexgyver.ru
Библиотека открыта для доработки и ваших Pull Request'ов!

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

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

About

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

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages