Вроде бы @anonimSimen выкладывал кусок кода, где дребезг как-то в цикле (без использования millis() ) подавляется.
Не могу найти. Напомните, пожалуйста…
я читаю кнопку в цикле 8-16 раз. delay между чтениями 1 мс. Если за время цикла кнопка всегда нажата - значит отдаю нажатие, если хоть один раз нет - отдаю ненажата. делов-то. лучше 16 раз читать, надёжнее
щас найду
protected:
static constexpr uint8_t NUM_ATTEMPTS = 10;
.
.
.
static bool ReadDigitalPin(const uint8_t APin, const bool AActiveLevel) {
for (uint8_t i = 0; i < NUM_ATTEMPTS; ++i) {
delay(1);
if (digitalRead(APin) != AActiveLevel) return false;
}
return true;
}
Соврал, 10 раз читаю. 16 это для analogRead, его потом усредняю сдвигом на 4
Во! То что нужно! Спасибо большое!
нальёшь при случае.
Тормоза то какие.)
// каждую ms
bool keyExe() {
static bool old;
static uint8_t timer;
if (old != pin(KEY)) {
old = !old;
timer = DEBOUNCE_TIME;
}
else if (timer && !--timer)
return old;
return false;
}
Это в прерывании таймера каждую 1 мс вызывается?
Вообще проще производить опрос кнопки с определённой периодичностью,например каждые 20мс. Тогда никаких антидребезгов не надо вообще.
Да как хочешь. Хочешь delay(1) поставь, хочешь таймер заряди. Не обязательно 1 мс, можно меньше, можно больше, 10 мс обычно. Только DEBOUNCE_TIME нужно пересчитать тогда. Который 40-50 мс для кнопки.
Кнопку нажали, через 20 мс опрос - попадает на откинутые дребезгом контакты, нажатие не зафиксировано, через следующие 20 мс опрос - кнопка уже отпущена. Все, нажатие пропущено
Т.е. фиксироваться будут только медленные, неспешные нажатия, очень короткие будут периодически пропускаться
Это ж как надо нажать и отпустить успеть за 40 мс?))
Ну хошь 10мс сделай. У меня 20 отлично работает,чётко,без тормозов.
Потом может покажу свою библиотечку. Там и фронт и спад и нажатия короткие и длинные фиксируются. Даже частота обработки кнопок индивидуально настроить можно.
Бывает. Нельзя закладываться только на адекватное поведение юзера
…и кнопок.)
Если кнопки гамно,никакие методы не помогут)
В моем 3D принтере (прошивку я не менял) эта величина приближается к 500 мс (раз в 25 больше). Некомфортно, конечно, но и не смертельно. “Геймерская клавиатура” - весьма экзотический вариант*, а для всего 20 мс за глаза хватит.
- Есть сильное подозрение, что и для “геймерской клавиатуры” это вполне приемлемо. Например, в Винде, не смотря на то, что клавиатура посажена на аппаратное прерывание, характерное время задержки составляет 15-16 мс. И никто этого не замечает.