Здравствуйте!
Использую WEMOS esp8266, библиотека EncButton, нужно увеличивать счетчик в прерывании по кнопке.
Возможно что-то упустил в настройках, но вот результат: три нажатия и получаю непоследовательные числа
Как избежать дребезга в прерывании?
Есть конечно же рабочее решение, и даже без дополнительной библиотеки по примеру Ловим событие,
Но неужели EncButton с кучей настроек не может этого? Тем более что иногда всё таки есть необходимость выполнить короткое событие, которое обязательно обрабатывать сразу.
Использую WEMOS esp8266, библиотека EncButton, нужно увеличивать счетчик в прерывании по кнопке.
Возможно что-то упустил в настройках, но вот результат: три нажатия и получаю непоследовательные числа
Как избежать дребезга в прерывании?
C++:
// кнопка и прерывания
#include <Arduino.h>
#include <EncButton.h>
#define EB_DEB_TIME 80 // таймаут гашения дребезга кнопки (кнопка)
#define BTN_PIN D3
Button eb(BTN_PIN);
volatile byte screen = 0; // текущий экран
// esp8266/esp32
IRAM_ATTR void isr() {
screen++;
if (screen > 9)screen = 0;
eb.pressISR();
}
void setup() {
Serial.begin(115200);
attachInterrupt(BTN_PIN, isr, FALLING);
}
void loop() {
eb.tick();
if (eb.click()) {
Serial.print("screen ");
Serial.println(screen);
}
delay(100); // имитация загруженной программы
}
C++:
#define BTN_PIN D3
volatile bool intFlag = false; // флаг
volatile byte screen = 0; // текущий экран
// esp8266/esp32
IRAM_ATTR void isr() {
intFlag = true; // подняли флаг прерывания
}
void setup() {
Serial.begin(115200); // открыли порт для связи
pinMode(BTN_PIN, INPUT_PULLUP);
attachInterrupt(BTN_PIN, isr, FALLING);
}
void loop() {
if (intFlag) {
intFlag = false; // сбрасываем
screen++;
if (screen > 9)screen = 0;
Serial.print("screen ");
Serial.println(screen);
}
}