GyverLibs/EncButton

Некорректная работа кнопки во время выполнения стороннего кода в loop()

ValeraDanger opened this issue · 1 comments

Использовал пример callbackISR и tickISR. С пустым loop все работает нормально, но если в нем присутствует сторонний код (в данном случае delay) некоторые нажатия кнопки не регистрируются. Не могу разобраться, в чем смысл использования прерываний, если они все равно не помогают обновлять кнопку во время выполнения кода? Использую ESP32
`// Пример с обработчиками в прерывании

#include <EncButton.h>
EncButton<EB_CALLBACK, 12> enc; // энкодер с кнопкой <A, B, KEY>

void setup() {
Serial.begin(9600);
enc.attach(CLICK_HANDLER, myClick); // подключим поворот

// прерывание обеих фаз энкодера на функцию isr
attachInterrupt(12, isr, CHANGE);

}

void myClick() {
Serial.println("CLICK_HANDLER");
}

void isr() {
enc.tickISR(); // тикер в прерывании
// Не вызывает подключенные коллбэки внутри прерывания!!!
}

void loop() {
enc.tick(); // дополнительный опрос таймаутов и коллбэков в loop
// вызов подключенных функций будет здесь,
// чтобы не грузить прерывание
delay(5000);
}
`

  • Неправильно объявлено прерывание, читаем документацию на ESP32 https://lastminuteengineers.com/handling-esp32-gpio-interrupts-tutorial/
  • Читаем документацию EncButton - "все подключенные функции вызываются из tick(), то есть не из обработчика прерывания, а из основного цикла программы!". Если обработчик с тяжёлым кодом будет вызываться из прерывания - это может привести к зависанию и перезагрузке МК, поэтому реализовано именно так
  • Тикер в прерывании нужен для того, чтобы зарегистрировать начало нажатия кнопки, пока программа была занята другими делами
  • Если в программе в основном цикле присутствует задержка 5 секунд - программа написана неправильно