Устранение дребезга контактов без millis

Вроде бы @DetSimen выкладывал кусок кода, где дребезг как-то в цикле (без использования 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

1 лайк

Во! То что нужно! Спасибо большое!

1 лайк

нальёшь при случае.

1 лайк

Тормоза то какие.)

// каждую 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 мс опрос - кнопка уже отпущена. Все, нажатие пропущено :wink:
Т.е. фиксироваться будут только медленные, неспешные нажатия, очень короткие будут периодически пропускаться

Это ж как надо нажать и отпустить успеть за 40 мс?))
Ну хошь 10мс сделай. У меня 20 отлично работает,чётко,без тормозов.
Потом может покажу свою библиотечку. Там и фронт и спад и нажатия короткие и длинные фиксируются. Даже частота обработки кнопок индивидуально настроить можно.

Бывает. Нельзя закладываться только на адекватное поведение юзера :wink:

1 лайк

…и кнопок.)

1 лайк

Если кнопки гамно,никакие методы не помогут)

В моем 3D принтере (прошивку я не менял) эта величина приближается к 500 мс (раз в 25 больше). Некомфортно, конечно, но и не смертельно. “Геймерская клавиатура” - весьма экзотический вариант*, а для всего 20 мс за глаза хватит.

  • Есть сильное подозрение, что и для “геймерской клавиатуры” это вполне приемлемо. Например, в Винде, не смотря на то, что клавиатура посажена на аппаратное прерывание, характерное время задержки составляет 15-16 мс. И никто этого не замечает.
1 лайк