Дребезг кнопки. Как исправить? Технически и программно без delay

preview_player
Показать описание
Всем привет! В этот видео мы будем устранять дребезг кнопки. Устранить эту проблему можно как программно, так и технически. Рассмотрим оба варианта.

Полезные ссылки:

Самый удобный Кешбек:

Самый выгодный Кешбек:
Рекомендации по теме
Комментарии
Автор

Дребезжит не кнопка, дребезжат контакты (везде, не только в кнопках), то есть правильно - дребезг контактов.

mansky
Автор

Ахренеть, сколько умных советов)))
Я напомню, что у меги (и не только) на входах уже стоят триггеры Шмитта...! На этом, можно было бы и попрощаться, но уверен, не все от этого знания поймут, куда слить все видео аналогичные этому. Поэтому подскажу, все же, последующие шаги. Так как вход можно притянуть программно вверх (к VCC) через внутренний резистор порядка 30-45 кОм, то достаточно будет между линией кнопки и GND (перед входом МК) поставить емкость порядка 0, 47 мкФ и аппаратная защита от дребезга с интервалом 14-21 мс будет решена аппаратно. И не хер насиловать МК программно. Нужна длительность задержки на дребезг больше, увеличивайте емкость согласно t = R*C

dmitriyfilatov
Автор

При нажатии кнопки у вас конденсатор заряжается/разряжается быстро. Можно резистор поставить увеличив время зарядки/разрядки и тем самым не увеличивать емкость бесконечно.

nickmuntyanov
Автор

"5, 7..." - и все отлично работает))

chessalkin
Автор

1) НИКОГДА не подключайте конденсатор параллельно кнопке. Ни в верхнее, ни в нижнее плечо. Разряжая(заряжая) конденсатор у кнопки будут подгорать контакты, а это через определенное время убьет ее в труху, что даже нажиматься может перестать. Используйте RCR-цепочку, т.е. в схеме с конденсатором последовательно кнопке НУЖНО ставить резистор.
2) Триггер Шмитта ставят не для инвертирования сигнала, а за его свойства петли гистерезиса. Грубо говоря, из 0 в 1 он переключается при бОльшем напряжении, чем из 1 в 0. Мало того, все современные контроллеры при включении входа как цифровой переключают его на триггер Шмитта.

GennPen
Автор

я делал так: нажали, контроллер увидел, подождал, проверил снова если еще нажата то обрабатывает нажатие

есть еще вариант с двухпозиционной кнопкой, которая будет подавать на порт либо минус либо плюс, перезаряжая при этом конденсатор, который удерживает состояние линии

Heorenmaru
Автор

Триггер шмидта имеет гистерезис и это классический способ борьбы с дребезгом. Но насколько я знаю у ардуинок тоже есть гистерезис, поэтому достаточно только конденсатора. Но я бы его подключал по другому, возможно параллельно резистору?

reodos
Автор

Экспериментировал с кнопками много раз. Нашел пару интересных вариантов:
1. Если паять, то достаточно напаять смд резистор, к примеру, на 10к...100к на землю и паралельно на него паял смд кондёр на 100n. Работает безотказно, паять можно прямо на ардуинку, места не занимает.
2. Если программно, я брал таймер (библиотеку), конкретно: simpleTimer. При нажатии кнопки "включалась" переменная запрета нажатия, которая мониторится при срабатывании кнопки. И запускался таймер, я для своих задач ставил 200 - 300 мс. По окончанию таймера запрет снимается. Из минусов: нельзя держать нажатой кнопку больше чем время таймера, иначе при отжатии будут ложные срабатывания.

vwhskzj
Автор

подскажите, почему первая и вторая нага триггера Шмитта закорочены?

_i_m_
Автор

Чет с программным решением намудрил. Я сделал так:
в обработчике прерывания
if (millis()-lastTime<500) return;
lastTime = millis();
Вроде нормально работает и тоже без delay. Кнопку чаще 2х раз в секунду не нажмешь.

mikhailkolokoltsev
Автор

Первый раз вижу такой алгоритм борьбы с дребезгом контактов

SergeyBelotserkovskiy
Автор

подскажите как сделать нажал и отпустил кнопку светодиод загорелся , нажал и отпустил кнопку второй раз светодиод потух , работа по нажатию кнопки + анти-дребезг

volodysarasov
Автор

Это всё-равно Delay. ЦП отсчитывает счётчик - а это значит он занят.Есть ещё много вариантов: Таймер-счётчик, пороговый диод. Но дилэй самый простой.

bubuii
Автор

Если нет кондера и нужно убрать дребезг, просто создайте переменную типа число и при каждом нажатии увеличивайте ее на 1. В Loop раз в секунду (только не через delay а через mills()) проверяйте если эта переменная больше 0 тогда кнопка была нажата, и сбрасывайте ее опять в 0. Самый простой и работающий способ.

smilk
Автор

На Ардуино уно тактовая частота 8МГц, а на меге около 80...что в 10 раз чаще. Поменяв контроллер, дребезг будет работать в 10 раз чаще, не говоря уже о моделях с ГГц на тактовом генераторе :)
. Получается тайминг на дребезг скрыт в частоте работы контроллера. Поправите если я не прав. И использование таймера (millis) более универсальное решение.

dubmuiu
Автор

Переворачивает - только инвертирующий тригер Шмидта.

yehorpererva
Автор

@Home Made - То, что ты можешь сделать || Покажите, как устранить дребезг на ноутбутчной клавиатуре. У меня на Linovo T440p клавиша Enter совсем с ума сошла.

romankrv
Автор

Забыл сказать про православный алгоритм... :) Использовать двунаправленный таймер, который при нажатой кнопке назад считает, при отпущенной вперёд, а по достижении нуля и значение защёлки генерит прерывание, в котором проверяется значение таймера и решается что с кнопкой. Во время дребезга таймер будет туда сюда метяться в каком-то значении и лишь при устойчивом контакте дойдёт до края. Реализуется аппаратно и программно весьма просто.

fnet
Автор

А можно ли (и целесообразно ли) триггер Шмидта заменить программно, если обрабатывать ввод как аналоговый и реагировать на переход порогового значения? Т. е. использовать конденсатор, но обойтись без дополнительной микросхемы.

Ваш программный способ очень интересный, но я бы предложил ему другое применение: тестировать кнопки и по коэффициенту определять износ (для этого можно даже сделать его изменяемым через Serial или как-то ещё). А если по назначению, то, похоже, что со временем готовое устройство придется перепрошивать для увеличения коэффициента.

mikurrey
Автор

Динистор помогает в борьбе с дребезгом контактов?

Master_Q