Там нечего сложного: подключаете библиотеку #include "GyverEncoder.h" (или другую для работы с энкодером), определяете пины для подключения энка и вешаете прерывание (без него при таком большом коде не заработает проверка нажатия/поворота.
********************
Определяете процедуры обработки прерываний:
void isrCLK()
{
enc1.tick(); //Для GyverEncoder
}
и
void isrDT()
{
enc1.tick();/ /Для GyverEncoder
};
Обязательно в секции декларирования указываете транслятору разместить эти процедуры в оперативной памяти:
void ICACHE_RAM_ATTR isrCLK();
void ICACHE_RAM_ATTR isrDT();
и определяете сам энк
Encoder enc1(CLK, DT, SW, TYPE2); //Для GyverEncoder
Вешаете прерывание на соответствующие пины: (в setup)
//digitalPinToInterrupt(CLK);
attachInterrupt(digitalPinToInterrupt(CLK), isrCLK, CHANGE); // прерывание CLK у энка
// digitalPinToInterrupt(DT);
attachInterrupt(digitalPinToInterrupt(DT), isrDT, CHANGE); // прерывание DT у энка
в блок loop добавляете анализ нажатия/поворота энка типа этого(Для GyverEncoder):
enc1.tick();
OutIsRight = enc1.isRight(); // если был поворот
OutIsLeft = enc1.isLeft();
OutIsHolded = enc1.isHolded();
OutIsDouble = enc1.isDouble();
OutIsSingle = enc1.isSingle();
описание есть у Алекса.
Ну и соответственно оформить всякими дефайнами типа если определена кнопка, если энк и т.д. Или по аналогии с кнопкой создать файл Encoder.h куда и вынести часть определений и обработку нажатий/поворотов энка
По идее, должно заработать