Очередной класс энкодера и энкодера с кнопкой (на базе uButton) для Arduino.
По API это на 99% аналог EncButton, но чуточку легче, в 1.5 раза быстрее опрашивается и написан в более читаемом конечно-автоматном стиле, а не на флагах.
Совместима со всеми Arduino платформами (используются Arduino-функции)
Объявлять до подключения библиотеки
#defineUE_FAST_TIME32// время между тиками для быстрого поворота (не меньше 16)Класс виртуального энкодера без кнопки.
// =============== НАСТРОЙКИ ===============// типы энкодеров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 наследует uEncoderVirt, отправляя данные с него в poll внутри tick.
// указать пины и их режим работыuEncoder(uint8_t p0, uint8_t p1, uint8_t mode = INPUT);
// опросить энкодерbooltick(bool pressed = false);Класс uEncoder наследует uEncoderVirt, отправляя данные с него в poll внутри tick. Сам опрос происходит в прерывании, буферизация на 4 щелчка.
// указать пины и их режим работыuEncoder(uint8_t p0, uint8_t p1, uint8_t mode = INPUT);
// опросить энкодерbooltick();
// опросить энкодер в прерыванииvoidtickISR(bool pressed = false);Класс 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 наследует 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
- Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
- Какой код загружался, какая работа от него ожидалась и как он работает в реальности
- В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код