Тёмный

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

Home Made
Подписаться 101 тыс.
Просмотров 23 тыс.
50% 1

Всем привет! В этот видео мы будем устранять дребезг кнопки. Устранить эту проблему можно как программно, так и технически. Рассмотрим оба варианта.
Архив с примерами: drive.google.c...
Полезные ссылки:
Моторы Nema 17: ali.pub/2n3564
Драйвер шагового двигателя: ali.pub/2n37jh
Ардуино Мега 2560: ali.pub/2gih4z
Сервоприводы: ali.pub/2glm6p
Самые дешевые Ардуино Про Мини для поделок: ali.pub/1ny2z4
Дисплей TM1637: ali.pub/2id9gd
Клавиатура 4х4: ali.pub/2k005u
WeMos D1 Mini Pro: ali.pub/2j9qwb
0.96" OLED дисплей: ali.pub/2hvdd9
Дисплей TM1637: ali.pub/2id9gd
Самые дешевые Ардуино Про Мини для поделок: ali.pub/1ny2z4
Зуммер: ali.pub/2hvd87
Нагрузочный резистор 10 Ом 10 Вт: ali.pub/2hvdwp
Мотор с редуктором: ali.pub/2hrtt2
Блютуз HM-10: ali.pub/2amedo
Блютуз HC-06: ali.pub/2amdlv
WS2812B 7 светодиодов: ali.pub/2hi9h8
WS2812B: ali.pub/1x8oim
Солнечная панель 5V 4.5W: ali.pub/2gllam
Солнечные батареи: ali.pub/2glli0
TFT дисплеи: ali.pub/1ny2rc
Самый удобный Кешбек:
LetyShops: goo.gl/Ev5XgI
Самый выгодный Кешбек:
Ecomerce: goo.gl/3dDc2w

Опубликовано:

 

7 окт 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 153   
@AcademonZx
@AcademonZx 6 лет назад
Очень элегантно. Спасибо!
@mansky266
@mansky266 6 лет назад
Дребезжит не кнопка, дребезжат контакты (везде, не только в кнопках), то есть правильно - дребезг контактов.
@nickmuntyanov2882
@nickmuntyanov2882 3 года назад
При нажатии кнопки у вас конденсатор заряжается/разряжается быстро. Можно резистор поставить увеличив время зарядки/разрядки и тем самым не увеличивать емкость бесконечно.
@amid6229
@amid6229 2 года назад
А что мешает рассчитать адекватные номиналы резистора и конденсатора? Или подсмотреть в схемы продаваемых изделий? Я в основном видел конденсаторы на 100 nF и резисторы на килоомы (4.7 и выше) или вообще на внутренних подтяжках (20 кОм) Обычно, период колебаний от дребезга менее 1 миллисекунды. Конденсатор 100 nF и резистор 20 кОм гарантирует, что напряжение не поднимется выше 1.15 Вольта раньше 1 с небольшим миллисекунд. Если же мы добавляем резистор между кнопкой и конденсатором, то конденсатор не разрядится мгновенно (практически), и может случиться так, что иногда конденсатор разрядится до 0.9 вольт и успеет зарядиться до 2.2 вольт (при питании 3.3), что приведёт к срабатыванию на единицу, и мы получим дребезг… Ну и задержки срабатывания по обеим сторонам (по нажатию и отпусканию), вместо одной (по отпусканию)…
@dmitriyfilatov8658
@dmitriyfilatov8658 3 года назад
Ахренеть, сколько умных советов))) Я напомню, что у меги (и не только) на входах уже стоят триггеры Шмитта...! На этом, можно было бы и попрощаться, но уверен, не все от этого знания поймут, куда слить все видео аналогичные этому. Поэтому подскажу, все же, последующие шаги. Так как вход можно притянуть программно вверх (к VCC) через внутренний резистор порядка 30-45 кОм, то достаточно будет между линией кнопки и GND (перед входом МК) поставить емкость порядка 0,47 мкФ и аппаратная защита от дребезга с интервалом 14-21 мс будет решена аппаратно. И не хер насиловать МК программно. Нужна длительность задержки на дребезг больше, увеличивайте емкость согласно t = R*C
@UCanDo
@UCanDo 3 года назад
Друг, вы видите только один путь решения и его продвигаете как единственно истинный. Но ведь решений может быть много. И совершенно не значит что иные пути решения неверные. По поводу постройки на внутреннем подтягивающем резисторе - у него довольно большое сопротивление, на сколько я помню в Атмегах он имеет сопротивление что-то около 50 кОм. Для того чтобы этот резистор адекватно заработал в связке к конденсатором необходимо значительно уменьшить емкость конденсатора, из-за чего эффект сводится на нет, и работать все это будет только на идеально новых кнопка (и то не факт).
@dmitriyfilatov8658
@dmitriyfilatov8658 3 года назад
@@UCanDo, совсем нет необходимости значительно уменьшать емкость. При таком высоком входном сопротивлении вентиля на триггере Шмитта, не важно (в разумных пределах) значение емкости. Единственно важным может быть количество энергии, запасенной конденсатором и ее разряд на контакты кнопки. В этом случае (если есть опасение износа контактов) достаточно последовательно кнопке поставить резистор на десятки Ом для гашения броска тока. Я практикую 100 Ом.
@GennPen
@GennPen 3 года назад
1) НИКОГДА не подключайте конденсатор параллельно кнопке. Ни в верхнее, ни в нижнее плечо. Разряжая(заряжая) конденсатор у кнопки будут подгорать контакты, а это через определенное время убьет ее в труху, что даже нажиматься может перестать. Используйте RCR-цепочку, т.е. в схеме с конденсатором последовательно кнопке НУЖНО ставить резистор. 2) Триггер Шмитта ставят не для инвертирования сигнала, а за его свойства петли гистерезиса. Грубо говоря, из 0 в 1 он переключается при бОльшем напряжении, чем из 1 в 0. Мало того, все современные контроллеры при включении входа как цифровой переключают его на триггер Шмитта.
@amid6229
@amid6229 2 года назад
И что так много адептов резистора перед кнопкой? А как поставить резистор между кнопками и конденсатором образованном ножками кнопки, а так же дорожкой от резистора до кнопки и землёй? Может просто для этих целей не использовать конденсаторы большой ёмкости (микрофарады)? Ещё и схема энергоэффективнее выйдет…
@Palladln
@Palladln Год назад
можно взять кондер 2-33 нанофарады и резистор сотни Ком. тогда подгорать ничего не будет.
@UCanDo
@UCanDo Год назад
Там ничего подгорать не будет в любом случае. Так как для образования искры и нагара нужны большие токи или высокое напряжение. На кнопках логики такого никогда не бывает.
@NoName-dj6bd
@NoName-dj6bd 2 месяца назад
@@Palladln Я ставлю 680пФ на порт МК, 10 ом между портом и кнопкой, работает идеально. Уже не помню, но в какой книге вычитал по программированию AVR.
@PiseBankProduction
@PiseBankProduction 4 года назад
Спасибо братуха,очень помог!
@юрийворонцов-ж7з
@юрийворонцов-ж7з 3 года назад
кнопка is 300$
@chessalkin9939
@chessalkin9939 4 года назад
"5,7..." - и все отлично работает))
@m131184m
@m131184m 11 месяцев назад
Спасибо!
@Heorenmaru
@Heorenmaru 6 лет назад
я делал так: нажали, контроллер увидел, подождал, проверил снова если еще нажата то обрабатывает нажатие есть еще вариант с двухпозиционной кнопкой, которая будет подавать на порт либо минус либо плюс, перезаряжая при этом конденсатор, который удерживает состояние линии
@UCanDo
@UCanDo 6 лет назад
Вариантов работы с кнопкой несколько и каждый удобен для конкретного случая.
@АндрейСавченко-к3п
Экспериментировал с кнопками много раз. Нашел пару интересных вариантов: 1. Если паять, то достаточно напаять смд резистор, к примеру, на 10к...100к на землю и паралельно на него паял смд кондёр на 100n. Работает безотказно, паять можно прямо на ардуинку, места не занимает. 2. Если программно, я брал таймер (библиотеку), конкретно: simpleTimer. При нажатии кнопки "включалась" переменная запрета нажатия, которая мониторится при срабатывании кнопки. И запускался таймер, я для своих задач ставил 200 - 300 мс. По окончанию таймера запрет снимается. Из минусов: нельзя держать нажатой кнопку больше чем время таймера, иначе при отжатии будут ложные срабатывания.
@UCanDo
@UCanDo 6 лет назад
Да, вариантов есть много. И каждый по-своему хорош.
@smilk1000
@smilk1000 6 месяцев назад
Если нет кондера и нужно убрать дребезг, просто создайте переменную типа число и при каждом нажатии увеличивайте ее на 1. В Loop раз в секунду (только не через delay а через mills()) проверяйте если эта переменная больше 0 тогда кнопка была нажата, и сбрасывайте ее опять в 0. Самый простой и работающий способ.
@UCanDo
@UCanDo 6 месяцев назад
Работать будет, но в использовании устройство будет казаться «тормознутым» и не отзывчивым, так как после нажатия на кнопку пройдёт до 1 секунды, пока устройство отреагирует. А это совсем плохо. Реакция на нажатия кнопки должна быть сразу, без задержек.
@f33net
@f33net 6 лет назад
Трандец схемотехника... Если уж просто и по-колхозному кондюк, то нафига т.с. необычно вверх ногами? Обычно кнопочные команда на землю даются. Вообще нужен ФНЧ, со срезом Герц так 10, т.е. максимально сколько чел может настучать. С учётом высокоомности входов МК, ёмкости большой не потребуется. Вместо триггера Шмитта (он не инвертирует, с чего ты взял эту глупость, тебе такая микруха досталась, он вообще, на любом операционнике или логическом элементе делается за счёт резистора обратной связи) уже давно созданы специализированные микрухи давить дребезг. Синхронизацией развёртки научись у осциллографа пользоваться - будет красиво и удобно видеть переходные процессы не уползающие вбок, даже разглядеть пики можно . :) Алгоритм "ой, что-то с кнопкой, подождём пока устаканится и посмотрим что с ней" ооочень распространённый, но кнопка может шуршать и в нажатом состоянии. А уж к матрице этот алгоритм прикручивать вообще некузяво. Нужен тот же ФНЧ, но программyый. Т.е. изменение состояния быстрее 1/10 секунды игнорировать. Но самое надёжное - это переключающийся контакт на RS триггер заведённый (на два входа МК). :)
@egorkusnezov
@egorkusnezov 5 лет назад
Но самое надёжное - это переключающийся контакт на RS триггер заведённый (на два входа МК). :) Вот где-б пример увидеть...
@АлександрНефедов-о2н
@@egorkusnezov нам на первом курсе института эту схему показали мимоходом: кнопка переключает "единицу" между R или S - подтяжки и прочие перелести по вкусу. в этом случае дребезг и "шуршания" никак не влияют на выход триггера. про "два входа МК" не понял.
@mikhailkolokoltsev2481
@mikhailkolokoltsev2481 5 лет назад
Чет с программным решением намудрил. Я сделал так: в обработчике прерывания if (millis()-lastTime
@UCanDo
@UCanDo 5 лет назад
Каждому проекту свой подход. Иногда и простого delay() достаточно, а иногда нужно не иметь никакой привязки к паузам (таким как delay, millis или таймер), когда нужно получить чистое нажатие, все равно с какой частотой.
@SergeyBelotserkovskiy
@SergeyBelotserkovskiy 6 лет назад
Первый раз вижу такой алгоритм борьбы с дребезгом контактов
@UCanDo
@UCanDo 6 лет назад
Способов очень много. Мне больше всего понравился этот.
@80cahek
@80cahek 6 лет назад
Sergei Belotserkovskii стоит такой алгоритм на освещении в квартире, причем на входе идет разбивка по уровням от нескольких ADC (кнопки через резисторные делители и несколько выключателей). лет 5 уже без сбоев.
@bubuii
@bubuii 6 лет назад
Это всё-равно Delay. ЦП отсчитывает счётчик - а это значит он занят.Есть ещё много вариантов: Таймер-счётчик, пороговый диод. Но дилэй самый простой.
@UCanDo
@UCanDo 6 лет назад
Работу микроконтроллера можно сравнить с работой повара. Вод представим что повару нужно сварить картошку в мундирах. Но картофель бывает разный и варится разное время. сила огня бывает разной. Какой сейчас картофель и как быстро он сварится - не известно. Картофель может вариться от 10 минут до 40 минут. Как будет действовать повар в сравнении с работой микроконтроллера: DELAY: Повар закинул картофель, поставил таймер на 40 минут (максимум, что бы точно сварилась) и стоит все 40 минут и смотрит на кастрюлю. За это время он больше ничего не делает, только ждет. После 40 минут достает картофель. Продуктивность минимальная + картофель мог быть тот который быстро варится и он мог развариться. MILLIS: Повар закинул картофель, поставил таймер на 40 минут (максимум, что бы точно сварилась). Пока идет таймер повар занимается другими делами. Продуктивность в таком случае максимальная, но картофель все так же мог развариться. ПРЕРЫВАНИЕ: у повара есть помощник, который проверяет когда картофель сварится, как только сварится - зовет повара. Продуктивность максимальная, картофель сварен правильно. ОТСЕИВАНИЕ ДРЕБЕЗГА (мой пример): повар ставит картофель и время от времени вилкой проверяет готовность. Продуктивность максимальная, картофель сварен правильно. Если все это перевести в работу микроконтроллера: DELAY: микроконтроллер стоит на месте и не выполняет никакой работы. Продуктивность минимальная. Невозможно отследить быстрые нажатия (двойные, тройные) и невозможно нормально обработать удерживание кнопки - это полное зависание МК. MILLIS: Микроконтроллер выполняет другую работу. Но все так же невозможно отследить быстрые нажатия (двойные, тройные) и невозможно (или очень проблематично) обработать удерживание кнопки. ПРЕРЫВАНИЕ: Микроконтроллер выполняет другую работу. Нормально обрабатываются быстрые нажатия (двойные, тройные). А вот удерживание кнопки обработать очень проблематично. ОТСЕИВАНИЕ ДРЕБЕЗГА (мой пример): Микроконтроллер выполняет другую работу. Нормально обрабатываются быстрые нажатия (двойные, тройные) и нормально обрабатывается удерживание кнопки. Во всех случаях есть свои исключения и сферы применения. Так же все зависит от сложности всей остальной программы и как быстро основной код выполняется. Но все же мой пример - это никак не Delay. Delay - зло :))
@Palladln
@Palladln Год назад
@@UCanDo офигенно объяснил!
@reodos3
@reodos3 6 лет назад
Триггер шмидта имеет гистерезис и это классический способ борьбы с дребезгом. Но насколько я знаю у ардуинок тоже есть гистерезис, поэтому достаточно только конденсатора. Но я бы его подключал по другому, возможно параллельно резистору?
@UCanDo
@UCanDo 6 лет назад
Я взял самую распространённую схему на r-c фильтре. Можете поэкспериментировать, может есть и лучшие решения.
@yehorpererva6803
@yehorpererva6803 6 лет назад
Переворачивает - только инвертирующий тригер Шмидта.
@UCanDo
@UCanDo 6 лет назад
Да, все верно, забыл об этом упомянуть
@kamesm
@kamesm 5 лет назад
Зачем его вообще использовать, если ножки микроконтроллера все равно превращают импульс в логический?
@UCanDo
@UCanDo 5 лет назад
Триггер Шмидта превращает аналоговый сигнал в меандр.
@ЄвгенПритула
@ЄвгенПритула 3 года назад
@@UCanDo а в контролері АЦП? :))
@UCanDo
@UCanDo 3 года назад
Применять АЦП для обработки кнопок - так себе решение…
@TDMLab
@TDMLab 6 лет назад
По аппаратному устранению дребезга почти согласен, конденсатор такой емкости не нужен, лучше например так ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-IenFIIMIbyk.html (ТШ перед ФНЧ не обязательны)
@UCanDo
@UCanDo 6 лет назад
Я в большинстве случаев ставлю на 1 мкф. Хватает. Просто в видео я показывал работу с кнопкой наихудшего состояния (вытянул эту кнопку из мусорного ведра:)))
@TDMLab
@TDMLab 6 лет назад
Home Made - То, что ты можешь сделать Я имел ввиду, что можно совсем маленькую ёмкость использовать на 10-100нФ по немного другой схеме. В любом случае я согласен что delay не надо применять никогда, от слова вообще.
@UCanDo
@UCanDo 6 лет назад
Да, я с вами полностью согласен!
@f33net
@f33net 6 лет назад
Худьщий кнопка - это проводочком касаться. Вот потестируй оно на этом массовом алгоритме или аппаратуре. :)
@f33net
@f33net 6 лет назад
Там ФНЧ примитивный первого порядка с очень пологой характеристикой, он не спасёт от шуршащей в нажатом состоянии кнопки, что случается в промышленной автоматике очень часто, особенно у любителей кнопок IEK. :). Программная реализация такого фильтра ничуть не уступит. Нужен ФНЧ второго порядка, либо два ФНЧ первого порядка, но инверсно на RS-триггер включенные.
@kostya1306
@kostya1306 6 лет назад
Слишком сложно. Почему бы не взять только первое срабатывание кнопки и увеличить переменную на 1. А далее просто неучитывать следующие срабатывания втечение какого-то времени. Я руководствуюсь тем, что человек физически не может нажимать кнопку 5-10 раз в секунду. Соответственно, какое-то время вообще не обрабатывать кнопку, а затем снова проверять ее состояние до следующего нажатия. Я получил такую задержку опытным путем в 400мс. Если надо быстро бегать по менюшке, то можно и до 300мс уменьшить.
@UCanDo
@UCanDo 6 лет назад
Паузы - беда всех программ... Нет, конечно можно и без delay, через millis, но это все равно будет "начальный" уровень программирования. К тому же можно забыть про быстрые нажатия ( на пример двойное, тройное). Пауза делает их невозможными. В примере что я привел максимальная пауза = время "успокоения" кнопки, а это очень мало.
@DjleonLeon
@DjleonLeon 6 лет назад
Home Made - проблема возникнет, когда будет работать не этот короткий цикл, а полноценная (большая) программа: тогда время затраченное процессором на выполнение всего цикла будет скажем 0.3 секунд и время удержания кнопки (для уверенного срабатывания будет 21 секунда! Тоесть вся программа длится 0.3 секунд и опрос кнопки будет раз в 0.3 секунд (0.3*70=21), если в прирывании, то программа будет остановлена, пока не наберёт 70, а это всё равно как делей. Эффективнее с таймером: программа остановилась, проверена таймер, если превышен интервал дребезга, кнопка нажата, если нет продолжаем работу... Так цикл тоже останавливается, но на наносекунды, а не на милли... Запусти в основном цикле для проверки отсчёт секунд в цикле, а в прирывании опрос кнопки, по нажимай пару десятков раз и увидеть отставание таймера (как при делей).
@ВалентинАндреев-л3т
Djleon_ Leonid прав у вас даже хуже делэй получилось
@UCanDo
@UCanDo 6 лет назад
Нет, не хуже. Вы же не будете добавлять задержку в цикл, который и так длится целых 300 мс!!! В таких случаях кнопка вешается на прерывание + техническая защита от дребезга (резистор + конденсатор + триггер Шмидта). Djleon_ Leonid, пересмотрите видео еще раз. В прерывании нет никакого +70. Прерывание срабатывает сразу после нажатия кнопки и только 1 раз. Будьте внимательны. P.S. если один цикл программы длится целых 300 мс то программа явно не оптимизированна. Работа с кнопками в такой программе в принципе будет не возможной (даже на прерываниях), так как на любое действие будет тратиться слишком много времени.
@DjleonLeon
@DjleonLeon 6 лет назад
Home Made - Хорошо, объясню по другому: есть программа на нулевом прирывании счётчик Гейгера, на втором кнопка меню, с вашим алгоритмом. При нажатии срабатывает прерывание 1 и длится обработка дребезга, тоесть программа считает до 70 в любую сторону, за это время вы теряете много импульсов счётчика, ваша программа работает плохо, если при прирывании от кнопки ничего не считать, а просто сравнить значение счётчика миллисекунд, вы потеряете меньше импульсов (отсчёт 70 сложений дольше, чем операция сравнения) ваша программа будет на много корректнее.
@decoratorr
@decoratorr 5 лет назад
Четко объясняешь)
@poweredbysergey
@poweredbysergey 6 лет назад
Usefull
@victorsi1992
@victorsi1992 5 лет назад
Варіант з конденсатором, криє в собі ще одну підставу. Гарно розглянувши схему, ми побачимо що кнопка, своїми контактами розряджає конденсатор. Струм, який виникає при розряджанні конденсатора через контакти кнопки, дуже швидко вкорочує їй віку. Проведіть експеримент знявши осцилограму з шунта (резистор 5-10 ом, підключеного послідовно з кнопкою. Будете вражені. ))
@UCanDo
@UCanDo 5 лет назад
При замыкании конденсатора через кнопку потечёт ток менее 50 мА (при расчете что конденсатор емкостью не более 1 мкф). Время полного разряда около 10 мс. Признаюсь серьезных расчетов не делал, лишь «грубо» прикинул. Я не учитывал esr конденсатора (что снижает силу тока, так как у конденсаторов малой емкости, обычно, очень высокое внутреннее сопротивление), и некоторые другие факторы, на пример силу тока протекающую через резистор. Но в целом нагрузка на кнопку будет столь незначительна, что никак не повлияет на продолжительность службы кнопки.
@KobalyanTV
@KobalyanTV 5 лет назад
вместо того чтобы считать импульсы можно просто задать время паузы при нажатии\отжатии.
@UCanDo
@UCanDo 5 лет назад
Delay - зло :) Но иногда целесообразнее использовать его. Все зависит от конкретного проекта
@KobalyanTV
@KobalyanTV 5 лет назад
@@UCanDo под словом пауза я подразумевал death time при котором контроллер не будит видеть ненужные нажатия, необязательно delay. Согласен зло тоже можно иногда использовать - Дарт Вейдер одобряет.))
@amid6229
@amid6229 2 года назад
@@UCanDo должна быть библиотека, которую можно легко подключить и настроить к любому проекту. Глупо под каждый конкретный случай изобретать очередной велосипед, если задача типовая и без особой специфики. Да и программное решение дребезга актуально только для макетирования (чтоб не загромождать макетку и не коротнуть случайно чего) и навесного монтажа (ну коли дело дошло до разработки и изготовления печатной платы, наверняка найдётся и возможность впаять пару SMD компонентов).
@ПавелХрячков-л7ы
На Ардуино уно тактовая частота 8МГц, а на меге около 80...что в 10 раз чаще. Поменяв контроллер, дребезг будет работать в 10 раз чаще, не говоря уже о моделях с ГГц на тактовом генераторе :) . Получается тайминг на дребезг скрыт в частоте работы контроллера. Поправите если я не прав. И использование таймера (millis) более универсальное решение.
@UCanDo
@UCanDo 5 лет назад
Uno и Mega (да и почти все остальные Ардуино) работают на частоте 16 МГц. На частоте 8 МГц работают только низковольтные микроконтроллеры, которые работают от 3.3 вольт. На частоте 80 МГц работает плата DUE, но она редкость, ею почти никто не пользуется. Об Ардуино, работающей на частотах в ГГц первый раз слышу. Дребезг - это физическое свойство кнопки. Плохой контакт в момент нажатия. У новых кнопок он меньше, у старых - больше. Но он присутствует всегда. И он не зависит от скорости работы микроконтроллера. Кстати, приведённый код я применял на STM, там частота 160 МГц, работает отлично. Лишь некоторые значения выставлял другие. Вообще нет такого правили что нужно делать только так, а не иначе. Каждый использует то что ему удобно. Единственное замечание могу сказать: профессионалы не используют паузы, даже millis не применяют.
@Nevzoroff_
@Nevzoroff_ 3 года назад
@@UCanDo Я так понимаю, в отношении к кнопкам не применяют, а вообще если скетч маленький то работать будет, а если штук 20 флоат переменных и лишнюю строку не добавить, этот алгоритм будет тупо пропускать нажатия...
@UCanDo
@UCanDo 3 года назад
Не играет роли сколько кнопок. Они все будут обрабатываться «почти» одновременно. И пропусков не будет.
@amid6229
@amid6229 2 года назад
@@UCanDo , пропуски будут рразве что если основное тело программы очень тяжелое и не постоянное по времени исполнения (т.е. один цикл проходит за десятые доли миллисекунду, а другой за десятки или сотни). Но это скорее всего будет связано с кривыми ручками, навтыкавшими кучу задержек…
@f33net
@f33net 6 лет назад
Забыл сказать про православный алгоритм... :) Использовать двунаправленный таймер, который при нажатой кнопке назад считает, при отпущенной вперёд, а по достижении нуля и значение защёлки генерит прерывание, в котором проверяется значение таймера и решается что с кнопкой. Во время дребезга таймер будет туда сюда метяться в каком-то значении и лишь при устойчивом контакте дойдёт до края. Реализуется аппаратно и программно весьма просто.
@UCanDo
@UCanDo 6 лет назад
Тоже самое что и в примере, только используется аппаратный таймер
@_i_m_
@_i_m_ 5 лет назад
подскажите, почему первая и вторая нага триггера Шмитта закорочены?
@UCanDo
@UCanDo 5 лет назад
У меня используется микросхема с двумя входами "и". Пришлось соединить оба входа, для того чтобы получить прямой вход. Смотрите даташит на ту микросхему, которую будете использовать.
@Argonec
@Argonec 4 года назад
if(knop==0) b++; if(knop==1&&b=5) // короткое нажатие { b=0; код } if(b>30) // длинное нажатие { while(knop==0) { }; b=0; код }
@UCanDo
@UCanDo 4 года назад
Спасибо. Тоже хороший пример
@mikurrey416
@mikurrey416 5 месяцев назад
А можно ли (и целесообразно ли) триггер Шмидта заменить программно, если обрабатывать ввод как аналоговый и реагировать на переход порогового значения? Т. е. использовать конденсатор, но обойтись без дополнительной микросхемы. Ваш программный способ очень интересный, но я бы предложил ему другое применение: тестировать кнопки и по коэффициенту определять износ (для этого можно даже сделать его изменяемым через Serial или как-то ещё). А если по назначению, то, похоже, что со временем готовое устройство придется перепрошивать для увеличения коэффициента.
@UCanDo
@UCanDo 5 месяцев назад
Отвечу на ваш вопрос с конца: Со временем нужно будет не перепрошивать (подстраивать коэффициент) а менять кнопку, которая израсходовала свой ресурс. Кнопки - это расходный материал. В остальном конструкция и код сильно зависят от потребностей и конкретного кода. Если нужно быстродействие то используют программные способы устранения дребезга, и аналоговый вход не подходит из-за медленной обработки. Если же быстродействие не важно, то можно и просто delay(); поставить… Так что все очень сильно зависит от конкретной программы и конкретных требований.
@mikurrey416
@mikurrey416 5 месяцев назад
@@UCanDo спасибо, буду знать :) Delay - нет, не надо, не рекомендуйте её новичкам) Только-только закончил возиться с первым обучающим набором, и уже сам понял, на сколько это плохо. Может, delay применим там, где действительно нужен фриз контроллера на N миллисекунд, но некоторые обучающие блогеры (не вы, другие) на полном серьёзе рекомендуют именно так бороться с дребезгом.
@UCanDo
@UCanDo 5 месяцев назад
@@mikurrey416 да, delay() -зло! 😁
@slv8507
@slv8507 6 лет назад
Как то уж больно сложно все. Опросил кнопку, подождал 10 мс, опросил повторно - и все.
@UCanDo
@UCanDo 6 лет назад
За эти 10 мс микроконтроллер может сделать много чего. А так получается простаивает. Delay - это зло! :))
@slv8507
@slv8507 6 лет назад
Согласен, но чаще не хватает выводов, чем быстродействия. Я, например, вешаю на один аналоговый вход несколько кнопок. А как повесить на один пин прерывания несколько кнопок?
@UCanDo
@UCanDo 6 лет назад
Увы, на прерывание несколько кнопок нельзя установить. Да, я тоже иногда сталкиваюсь с проблемой недостатка выводов МК. Во всех случаях спасала переделка проекта. Как вариант, можно использовать I2C расширитель портов.
@Yupitrer
@Yupitrer 6 лет назад
slv Да, и я так делаю. Ставлю 50мс. Для тех кто считает что 10мс это много то скажу что это время тратится только тогда когда нажать кнопку. Если ее не трогать то оно обходит стороной. Зато код простенький. А на Тини13 место нужно экономить.
@scrypto
@scrypto 6 лет назад
Установить несколько кнопок на одно прерывание - можно, проблем никаких нет. Посмотрите видео на моем канале, рассказал пару методов, как это сделать.
@Master_Q
@Master_Q 2 года назад
Динистор помогает в борьбе с дребезгом контактов?
@UCanDo
@UCanDo 2 года назад
Очень сомневаюсь. Динистор - это по сути диод, только немного «хитро» устроенный.
@БорисЕгоров-у4р
@БорисЕгоров-у4р Месяц назад
If if if три функции подряд. Как понять?
@ЕвгенийМельник-я6в
Нормальные люди кнопки опрашивают по таймеру, внешние прерывания не для этого.
@ВладиславР-щ4ъ
@ВладиславР-щ4ъ 11 месяцев назад
А если в кнопке 12v ? Нужно ли увеличивать номиналы? Мне грубо очистить надо сигнал.
@UCanDo
@UCanDo 11 месяцев назад
Не может микроконтроллер работать с 12-тивольтовым сигналом. Что именно, куда и как у вас подключено и что вы хотите сделать?
@ВладиславР-щ4ъ
@ВладиславР-щ4ъ 11 месяцев назад
@@UCanDo микроконтроллер вообще не использую, работать будет работать с реле задержки времени. Мне нужно к этому контроллеру через 20 см водного раствора пропустить сигнал для датчика уровня. Поэтому предположил что 12 В лучше тем более блок питания на 12, вот интересуюсь по поводу номиналов резистора и конденсатора, нужно ли увеличить их номинальная мощность или номинальные характеристики
@UCanDo
@UCanDo 11 месяцев назад
@@ВладиславР-щ4ъ хм.. 🤔 У меня есть группа в Иелеграмм, там можно пообщаться на любую тему и задать любой вопрос, так что можешь за советом обратиться туда: t.me/HomeMadeChannel
@ВладиславР-щ4ъ
@ВладиславР-щ4ъ 11 месяцев назад
@@UCanDo как бы не совсем удобно в Instagram меня нет. Хотелось бы узнать хотя бы в правильном направлении я копаю или нет
@BerlogerX
@BerlogerX 4 года назад
Как подобрана величина емкости конденсатора? Методом тыка?
@UCanDo
@UCanDo 4 года назад
Можно рассчитать скорость разряда конденсатора. Но проще поставить на 1 мкф. чем пытаться подобрать емкость под возможную частоту нажатия кнопок.
@radiotechnician1757
@radiotechnician1757 6 лет назад
беда( блогеры которые юзают ардуино мимоходом решают дребезг.
@UCanDo
@UCanDo 6 лет назад
А почему беда?
@UCanDo
@UCanDo 6 лет назад
Понятно. Спасибо
@BRICKonYourHead
@BRICKonYourHead 6 лет назад
Такой программный метод подходит ТОЛЬКО для повелителей светодиода. Для более сложных проектов, с несколькими быстро меняющимися данными на входах будут глюки, и не срабатывания основного цикла кода. И ведь есть хорошая функция на millis(), зачем изобретать велосипед, при этом такой, что по аналогии при повороте руля, полностью тормозится ведущее колесо?
@UCanDo
@UCanDo 6 лет назад
В чем аналогия? И чем мой пример хуже той же millis и чем он может тормозить программу?
@BRICKonYourHead
@BRICKonYourHead 6 лет назад
А как Вы думаете, во время выполнения отдельной функции, будет ли опрашиваться какие либо входы в основном цикле? Функция хороша тогда, когда от её присутствия не будет вреда, либо когда её наличие не критично влияет на остальной код. Вы же являясь публичным лицом, по сути, этот способ объявляете универсальным, что не есть верно. В отличии от этого, millis() работающая в основном цикле (и естественно без while и прочего) не затормаживает выполнение кода ни на миллисекунду, и выполняется максимум за 2-5 тактов таймера при каждом проходе цикла.
@UCanDo
@UCanDo 6 лет назад
Простите, но вы так и не сказали чем он хуже. Мой код не тормозит программу. Использование функций делает программу более читабельной и понятной другим, но, опять же, никак не влияет на скорость выполнения. Понятно что подобный подход применим не к медленным программам, где основной код выполняется 300 мс. В таком случае нужно применять прерывание. Я не против применения millis. Но у millis есть один существенный недостаток: отслеживание по времени (не раньше чем прошло определенное время), и тоже необходимо писать какой-то код для антидребезга. По сути паузы (delay и millis) разрешают пользователю нажать кнопку только тогда, когда программа это разрешает, при этом можно забыть про быстрые нажатия, на пример двойное. Я не встречал хорошего кода с использованием millis, где можно было бы полноценно (быстро) использовать кнопку. Если вы встречали хороший код с millis, то пожалуйста, напишите его здесь, или дайте на него ссылку. Это будет полезным всем кто прочтёт.
@romankrv
@romankrv 4 года назад
@Home Made - То, что ты можешь сделать || Покажите, как устранить дребезг на ноутбутчной клавиатуре. У меня на Linovo T440p клавиша Enter совсем с ума сошла.
@UCanDo
@UCanDo 4 года назад
Никак. Только заменой клавиатуры.
@Palladln
@Palladln Год назад
перепаяй кнопку, подпаяй кондер на 3-10 нанофарад, керамику..
@volodysarasov
@volodysarasov 3 года назад
подскажите как сделать нажал и отпустил кнопку светодиод загорелся , нажал и отпустил кнопку второй раз светодиод потух , работа по нажатию кнопки + анти-дребезг
@Master_Q
@Master_Q 2 года назад
Насколько это надёжное решение?
@UCanDo
@UCanDo 2 года назад
Существует много способов для борьбы с дребезгом. Применять можно любой, все зависит от задачи. На счет программного решения - лучшего чем в этом видео я не встречал.
@СергейНиколаев-у9х6ц
Я обычно выдерживаю короткую временнУю паузу (без delay), перед тем, как считать следующее состояние кнопки.
@UCanDo
@UCanDo 4 года назад
Без примера кода сложно догадаться как у вас это реализовано :)
@СергейНиколаев-у9х6ц
@@UCanDo создаём переменную типа unsigned long, присваиваем этой переменной текущее время (millis). Создаём функцию "опроса кнопки", прописываем в ней условие: если текущее время, минус вышеуказанная переменная, меньше например 200 мс, то выходим из функции, не опрашивая состояние кнопки, в противном случае читаем статус кнопки и присваиваем переменной текущее время. Правда не учтён дребезг, когда кнопка продолжительное время в нажатом состоянии и когда контакты уже немного окислившиеся. Я на дверь и в отверстия в косяке, куда входят ригели замка, ставил концевые переключатели, вроде пока норм регистрируют.
@victorbrynev622
@victorbrynev622 5 лет назад
14:50 не проще сделать следующее: "создать две переменые, програмную задержку, в проверке указать, если одно значени и пред. значение установились, то есть равны, и время более 0.15-0.33 сек, то значение верное, и идем сравнивать, какая кнопка нажата."?
@UCanDo
@UCanDo 5 лет назад
Вариантов много. Можно использовать любой, какой больше всего вам подходит.
@victorbrynev622
@victorbrynev622 5 лет назад
@@UCanDo , я говорил именно об кнопках на аналоговый.
@babichfx
@babichfx Год назад
6:55 пипец обвязка ради одной кнопки да?!
@ВалентинАндреев-л3т
(ты совсем не экономишь память)
@UCanDo
@UCanDo 6 лет назад
Чем именно? Delay памяти использует гораздо больше. К тому же экономия только ради экономии - это всего лишь трата собственного времени (если, конечно, это не крайне необходимо).
@Gameplayer55055
@Gameplayer55055 6 лет назад
Delay,rs фиксатор , конденсатор
@ВалентинАндреев-л3т
почему прерывание срабатывает только после повторения цикла loop?
@UCanDo
@UCanDo 6 лет назад
Прерывание срабатывает постоянно. В основном цикле происходит вывод в сериал. Прерывание от loop не зависит
@andriuha_m
@andriuha_m 3 года назад
У меня видимо кнопка вообще изнасилована, мне пришлось выставить не 70 а 500 для нормального срабатывания
@cedric69graf
@cedric69graf 5 лет назад
Здравствуйте! Могу я попросить Вас стать моим преподавателем-онлайн. Предложение платное. Тонкости можно обсудить после вашего ответа.
@UCanDo
@UCanDo 5 лет назад
Добрый день. Я сейчас в отъезде. На два месяца. Все наработки остались дома. Смогу помочь только по приезду.
@cedric69graf
@cedric69graf 5 лет назад
Будем ждать. Спасибо за ответ.@@UCanDo
@UCanDo
@UCanDo 5 лет назад
Напишите мне где-то после 15-го апреля. Тогда я уже буду дома
@Dim_sev
@Dim_sev 6 лет назад
фоновая музыка полный шлак
@UCanDo
@UCanDo 6 лет назад
Посоветуйте другую
@Relevantium
@Relevantium 5 лет назад
Одет проще нормальные кнопки купить?
@UCanDo
@UCanDo 5 лет назад
Все кнопки без исключения имеют дребезг. Не существует кнопок, которые бы не производили помехи.
@vyorkin
@vyorkin 4 года назад
prev_count от слова previous
@algisshaulis8878
@algisshaulis8878 6 лет назад
Нет там ни нуля, ни +5 вольт. Есть уровни логической ЕДИНИЦЫ и логического НУЛЯ. Дребезга кнопки не бывает, как и дёргание выключателя :) Эффект называется ДРЕБЕЗГ КОНТАКТОВ. Ну и прерывание на кнопку это моветон, ещё не дай бог с задержками.
@ЄвгенПритула
@ЄвгенПритула 3 года назад
Погано кнопку прямо на кондюк вішати.
@amid6229
@amid6229 2 года назад
Да во многих схемах так и делают и ничего! Правда ёмкости используют более адекватные (100 nF). Решил погуглить схемы (для примера взял какой-то монитор HP), так там в схеме между кнопками и конденсатором обведена красным область и отмечено, что в правке такой то резисторы R209-R212 номиналом 470 ohm удалены. Решили начать экономить? Или они просто там даром не нужны?
@UCanDo
@UCanDo 2 года назад
В большинстве случаев можно обойтись «малой кровью», без резисторов. Но с ними надежнее.
@amid6229
@amid6229 2 года назад
@@UCanDo Ну… Возьмём внутренний резистор подтяжки 20 кОм (STM32), кондей замыкаемый на кнопку 0.1 микрофарада. Он будет заряжаться до логической единицы 2 миллисекунды (при этом 0.8 миллисекунды будет гарантированно ниже логического нуля). Т.е. если между импульсами менее 1 мс, то они отфильтруются, а срабатывание будет по первому импульсу. А вот при отпускании, срабатывание будет через 2 мс. Если же добавить резистор между конденсатором и кнопкой, то добавится и задержка перед нажатием (что может быть не приятным, когда кнопка работает в качестве концевика). Да и энергии (особенно при напряжении 3.3 В) в конденсаторе 0.1 микрофарад не хватит чтобы как-то навредить контактам. Раньше механический и химический (от влажности и воздуха) износ наступят чем от разрядов конденсатора… Проблема от использования внутренних подтяжек может возникнуть только при длинных проводниках, особенно если они идут в параллель с силовыми.
@stanislavilchenko3368
@stanislavilchenko3368 6 лет назад
Вредное видео) Так как во многих моментах оно людей вводит в заблуждение. 1) Проверять кнопку в основном цикле нельзя потому что любые задержки в основном цикле скажутся на кнопке а при добавлении к Ардуине цветного экрана вообще такой код кнопки перестанет работать 2) Подтягивающий резистор в ЖЕЛЕЗНОЙ или ХАРДВАРНОЙ но не технической схеме не нужен, так как чип в Ардуине уже имеет встроенные подтяжки, только они подтягивают к плюсу. 3) более правильный, со всех сторон, способ работы с кнопкой - обрабатывать нажатие и осуществлять фильтрация в прерывании, а этого в видео к сожалению нет.
@UCanDo
@UCanDo 6 лет назад
хм.. давайте рассмотрим по-порядку. 1) Если кнопку не опрашивать в основном цикле, то где? (При условии что прерывания не доступны). Приведите рабочий пример опроса кнопки не в основном цикле программы и без прерываний. Применение цветных дисплеев делает невозможным использование внешних прерываний. Пример: Если использовать цветной TFT дисплей то он занимает весь порт PD (PD0-PD7), то есть все цифровые пины D0 - D1, в том числе пины 2 и 3 которые являются входом для прерывания, а значит на них кнопки уже не повешать. По этому приведите рабочий пример опроса кнопки не в основном цикле программы и без прерываний. 2) Внутренний подтягивающий резистор ничем не поможет, так как между R-C цепочкой и микроконтроллером должен стоять еще триггер шмидта. Как вы его поставите внутрь микроконтроллера??? 3) Покажите пример фильтрации в прерывании, Без DELAY и каких-либо пауз. В моем примере фильтрацию выполняет R-C цепочка и триггер. А весь код выглядит вот так: void setup() { attachInterrupt(1, blink, RISING); } void loop() { // основной цикл программы } void blink() { // кнопка нажата // действие произойдет только 1 раз при нажатии кнопки } И все отлично работает, без дребезга и без нагрузки МК ненужным кодом
@stanislavilchenko3368
@stanislavilchenko3368 6 лет назад
Ну, я гуглить вместо Вас не буду. Прерывания доступны и на всех остальных пинах с той лишь разницей что обработчик прерывания идет сразу на весь порт и срабатывает по изменению состояния. Опрос пина, если не по прерыванию по входу, можно повесить на таймер, он будет инициировать прерывание так часто как быстро это нужно но с гарантированной регулярностью. Замечание по резистору было потому что резистор в схеме были и есть лишним, достаточно пин перевести в режим чтения и отправить туда единицу, чтоб будет равнозначно резистору 10к между + и ногой. Обычно комбинируют и конденсаторы и программную фильтрацию, либо делают программный триггер с сбросом по таймеру.
@UCanDo
@UCanDo 6 лет назад
Прерывания для всего порта ради одной кнопки? А как быть со всем остальным что на этом порте висит? Опрос пина по таймеру - это тот же millis, с той лишь разницей что, да, можно вынести опрос кнопки в отдельную функцию. Но так делать не хорошо. В прерываниях должен выполнятся максимально простой и короткий код, а чтение пина выполняется довольно долго. Значит в прерывании сделать разрешение на чтение, а читать в основном цикле (после разрешения)... и мы вернулись к той же millis. (поправьте если я не прав). Я не против применения millis или, как в данном случае, прерывание по таймеру. Но у таких способов есть один существенный недостаток: отслеживание по времени (не раньше чем прошло определенное время), и тоже необходимо писать какой-то код для антидребезга. По сути паузы (прерывание по таймеру, delay и millis) разрешают пользователю нажать кнопку только тогда, когда программа это разрешает, при этом можно забыть про быстрые нажатия, на пример двойное. На счет гугления - это ведь вы говорите что мой код не верен. Это вам стоит привести хороший пример кода, а то просто спор на тему "что кому нравится". Я привел код. Приведите и вы код для примера. Тогда и можно будет говорить какой вариант лучше, а какой плох. На счет применения r-c цепочки: обязательно нужно ставить триггер шмитта. Если просто конденсатор и резистор (пусть даже внутренний подтягивающий) то на выходе вместо логических "0" и "1" мы получим "волну". У ардуино логический "0" считается когда напряжение ниже 0,8 вольт, единица - когда напряжение выше 2 вольта. Так вот, когда "волна" будет подыматься то между 0,8 вольт 2 вотами пин будет в третьем состоянии, а это то же самое что дребезг кнопки. В быстрых программах подключение конденсатора ни на что не влияет так как будет ловиться это третье состояние. Именно по этому вместе с r-c цепочкой нужно ставить триггер шмитта. Конечно, если программа медленная то такой вариант прокатывает.
@shlemkin
@shlemkin 4 года назад
после 15 сек поиска: "Три регистра PCMSK0, PCMSK1 и PCMSK2 (Pin Change Mask Register) используются для указания входов, которым разрешено генерировать сигнал запроса прерывания."... ищите инфу больше 14 секунд!!! таблицу сюдой рисовать, или сами найдете, как конкретным ногам разрешить дергать за pcint прерывания?))
@guliwer1713
@guliwer1713 3 года назад
у меня кнопка подтянута на минус резистором 200 ом и в паралель кнопке сидит конденсатор 0,5 микрофарат и все равно кнопка иногда "сама" нажимается ....
@АлександровичЯ-к5с
Дребезг контактов наблюдается как при нажатии кнопки , так и при её отпускании .
@UCanDo
@UCanDo 3 года назад
Да, это так. Но это никак не влияет на код в целом. Так как отслеживается именно нажатие, но при отпускании кнопка в конечном счете оказывается с разомкнутыми контактами, и дребезг при отпускании кнопки отсеивается программно. По крайней мере, за всю мою практику я не сталкивался с проблемой случайных нажатий при отпускании кнопки. И даже не задумывался об этом до вашего Сообщения.
@АлександровичЯ-к5с
​@@UCanDo А вот какова длительность паузы между двумя последовательными нажатиями ?
@АлександровичЯ-к5с
@@UCanDo Поправлю вопрос , минимальная длительность паузы !
@UCanDo
@UCanDo 3 года назад
Зависит от программной реализации кода кнопки. Я сейчас не у компьютера, код не могу посмотреть и сказать точно.
@UCanDo
@UCanDo 3 года назад
Посмотрел видео. При программном отсеивании минимальная пауза между кнопками будем миллисекунды.
Далее
Сделка 😂
00:27
Просмотров 93 тыс.
Бред с обогревателями
17:50
Просмотров 58 тыс.