Skip to content

Repository files navigation

latestPIOFooFooFoo

Foo

uEncoder

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

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

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

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

Зависимости

Содержание

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

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

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

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

Классы

uEncoderVirt

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

// =============== НАСТРОЙКИ ===============// типы энкодеровenumclassuEType {
Step4Low, // активный низкий сигнал (подтяжка к VCC). Полный период (4 фазы) за щелчок
Step4High, // активный высокий сигнал (подтяжка к GND). Полный период (4 фазы) за щелчок
Step2, // половина периода (2 фазы) за щелчок
Step1, // четверть периода (1 фаза) за щелчок
};
// установить тип энкодера (uEType::Step4Low, uEType::Step4High, uEType::Step2, uEType::Step1)voidsetEncType(uEType type);
// инвертировать направление энкодераvoidsetEncReverse(bool rev);
// инициализация энкодераvoidinitEnc(boole0, boole1);
// =============== СОСТОЯНИЕ ===============enumclassState {
Idle, // простаивает
Left, // поворот влево
LeftFast, // быстрый поворот влево
LeftHold, // нажатый поворот влево
LeftHoldFast, // быстрый нажатый поворот влево
Right, // поворот вправо
RightFast, // быстрый поворот вправо
RightHold, // нажатый поворот вправо
RightHoldFast, // быстрый нажатый поворот вправо
};
State getState(); // получить текущее состояниеvoidreset(); // сбросить состояние (принудительно закончить обработку)// =============== СОБЫТИЯ ===============// был поворот [событие]uint8_tturn();
// направление энкодера (1 или -1) [состояние]int8_tdir();
// направление энкодера (0 или 1) [состояние]booldirBool();
// нажатый поворот энкодера [событие]boolturnH();
// быстрый поворот энкодера [состояние]boolfast();
// поворот направо [событие]boolright();
// поворот налево [событие]boolleft();
// нажатый поворот направо [событие]boolrightH();
// нажатый поворот налево [событие]boolleftH();
// нажата кнопка энкодера [состояние]boolencHolding();
// =============== ОПРОС ===============// опросить энкодерboolpoll(boole0, boole1, bool pressed = false);
// опросить энкодер без смены состояния
State pollRaw(boole0, boole1, bool pressed = false);

uEncoder

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

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

uEncoderISR

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

// указать пины и их режим работыuEncoder(uint8_t p0, uint8_t p1, uint8_t mode = INPUT);
// опросить энкодерbooltick();
// опросить энкодер в прерыванииvoidtickISR(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 при событииbooltick();

uEncButtonISR

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

uEncButtonISR(uint8_t encA, uint8_t encB, uint8_t btn, uint8_t modeEnc = INPUT, uint8_t modeBtn = INPUT_PULLUP);
// опросить. Вернёт true при событииbooltick();
// опросить энкодер в прерыванииvoidtickISR();

Примеры

// настройки таймаутов, мс// #define UE_FAST_TIME 32 // время между тиками для быстрого поворота
#include<uEncButton.h>
uEncButton eb(2, 3, 4);
// режим опроса энка в прерывании// void isr() {// eb.tickISR();// }voidsetup() {
Serial.begin(115200);
// режим опроса энка в прерывании// attachInterrupt(0, isr, CHANGE);// attachInterrupt(1, isr, CHANGE);
}
voidloop() {
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

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages