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

  Рет қаралды 23,726

Home Made

Home Made

Күн бұрын

Пікірлер: 153
@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), что приведёт к срабатыванию на единицу, и мы получим дребезг… Ну и задержки срабатывания по обеим сторонам (по нажатию и отпусканию), вместо одной (по отпусканию)…
@GennPen
@GennPen 3 жыл бұрын
1) НИКОГДА не подключайте конденсатор параллельно кнопке. Ни в верхнее, ни в нижнее плечо. Разряжая(заряжая) конденсатор у кнопки будут подгорать контакты, а это через определенное время убьет ее в труху, что даже нажиматься может перестать. Используйте RCR-цепочку, т.е. в схеме с конденсатором последовательно кнопке НУЖНО ставить резистор. 2) Триггер Шмитта ставят не для инвертирования сигнала, а за его свойства петли гистерезиса. Грубо говоря, из 0 в 1 он переключается при бОльшем напряжении, чем из 1 в 0. Мало того, все современные контроллеры при включении входа как цифровой переключают его на триггер Шмитта.
@amid6229
@amid6229 2 жыл бұрын
И что так много адептов резистора перед кнопкой? А как поставить резистор между кнопками и конденсатором образованном ножками кнопки, а так же дорожкой от резистора до кнопки и землёй? Может просто для этих целей не использовать конденсаторы большой ёмкости (микрофарады)? Ещё и схема энергоэффективнее выйдет…
@Palladln
@Palladln Жыл бұрын
можно взять кондер 2-33 нанофарады и резистор сотни Ком. тогда подгорать ничего не будет.
@UCanDo
@UCanDo Жыл бұрын
Там ничего подгорать не будет в любом случае. Так как для образования искры и нагара нужны большие токи или высокое напряжение. На кнопках логики такого никогда не бывает.
@NoName-dj6bd
@NoName-dj6bd 3 ай бұрын
@@Palladln Я ставлю 680пФ на порт МК, 10 ом между портом и кнопкой, работает идеально. Уже не помню, но в какой книге вычитал по программированию AVR.
@dmitriyfilatov8658
@dmitriyfilatov8658 3 жыл бұрын
Ахренеть, сколько умных советов))) Я напомню, что у меги (и не только) на входах уже стоят триггеры Шмитта...! На этом, можно было бы и попрощаться, но уверен, не все от этого знания поймут, куда слить все видео аналогичные этому. Поэтому подскажу, все же, последующие шаги. Так как вход можно притянуть программно вверх (к VCC) через внутренний резистор порядка 30-45 кОм, то достаточно будет между линией кнопки и GND (перед входом МК) поставить емкость порядка 0,47 мкФ и аппаратная защита от дребезга с интервалом 14-21 мс будет решена аппаратно. И не хер насиловать МК программно. Нужна длительность задержки на дребезг больше, увеличивайте емкость согласно t = R*C
@UCanDo
@UCanDo 3 жыл бұрын
Друг, вы видите только один путь решения и его продвигаете как единственно истинный. Но ведь решений может быть много. И совершенно не значит что иные пути решения неверные. По поводу постройки на внутреннем подтягивающем резисторе - у него довольно большое сопротивление, на сколько я помню в Атмегах он имеет сопротивление что-то около 50 кОм. Для того чтобы этот резистор адекватно заработал в связке к конденсатором необходимо значительно уменьшить емкость конденсатора, из-за чего эффект сводится на нет, и работать все это будет только на идеально новых кнопка (и то не факт).
@dmitriyfilatov8658
@dmitriyfilatov8658 3 жыл бұрын
@@UCanDo, совсем нет необходимости значительно уменьшать емкость. При таком высоком входном сопротивлении вентиля на триггере Шмитта, не важно (в разумных пределах) значение емкости. Единственно важным может быть количество энергии, запасенной конденсатором и ее разряд на контакты кнопки. В этом случае (если есть опасение износа контактов) достаточно последовательно кнопке поставить резистор на десятки Ом для гашения броска тока. Я практикую 100 Ом.
@AcademonZx
@AcademonZx 6 жыл бұрын
Очень элегантно. Спасибо!
@Андрей_Чайка
@Андрей_Чайка 6 жыл бұрын
Экспериментировал с кнопками много раз. Нашел пару интересных вариантов: 1. Если паять, то достаточно напаять смд резистор, к примеру, на 10к...100к на землю и паралельно на него паял смд кондёр на 100n. Работает безотказно, паять можно прямо на ардуинку, места не занимает. 2. Если программно, я брал таймер (библиотеку), конкретно: simpleTimer. При нажатии кнопки "включалась" переменная запрета нажатия, которая мониторится при срабатывании кнопки. И запускался таймер, я для своих задач ставил 200 - 300 мс. По окончанию таймера запрет снимается. Из минусов: нельзя держать нажатой кнопку больше чем время таймера, иначе при отжатии будут ложные срабатывания.
@UCanDo
@UCanDo 6 жыл бұрын
Да, вариантов есть много. И каждый по-своему хорош.
@smilk1000
@smilk1000 7 ай бұрын
Если нет кондера и нужно убрать дребезг, просто создайте переменную типа число и при каждом нажатии увеличивайте ее на 1. В Loop раз в секунду (только не через delay а через mills()) проверяйте если эта переменная больше 0 тогда кнопка была нажата, и сбрасывайте ее опять в 0. Самый простой и работающий способ.
@UCanDo
@UCanDo 7 ай бұрын
Работать будет, но в использовании устройство будет казаться «тормознутым» и не отзывчивым, так как после нажатия на кнопку пройдёт до 1 секунды, пока устройство отреагирует. А это совсем плохо. Реакция на нажатия кнопки должна быть сразу, без задержек.
@chessalkin9939
@chessalkin9939 4 жыл бұрын
"5,7..." - и все отлично работает))
@Heorenmaru
@Heorenmaru 6 жыл бұрын
я делал так: нажали, контроллер увидел, подождал, проверил снова если еще нажата то обрабатывает нажатие есть еще вариант с двухпозиционной кнопкой, которая будет подавать на порт либо минус либо плюс, перезаряжая при этом конденсатор, который удерживает состояние линии
@UCanDo
@UCanDo 6 жыл бұрын
Вариантов работы с кнопкой несколько и каждый удобен для конкретного случая.
@mikhailkolokoltsev2481
@mikhailkolokoltsev2481 5 жыл бұрын
Чет с программным решением намудрил. Я сделал так: в обработчике прерывания if (millis()-lastTime
@UCanDo
@UCanDo 5 жыл бұрын
Каждому проекту свой подход. Иногда и простого delay() достаточно, а иногда нужно не иметь никакой привязки к паузам (таким как delay, millis или таймер), когда нужно получить чистое нажатие, все равно с какой частотой.
@ПавелХрячков-л7ы
@ПавелХрячков-л7ы 5 жыл бұрын
На Ардуино уно тактовая частота 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 , пропуски будут рразве что если основное тело программы очень тяжелое и не постоянное по времени исполнения (т.е. один цикл проходит за десятые доли миллисекунду, а другой за десятки или сотни). Но это скорее всего будет связано с кривыми ручками, навтыкавшими кучу задержек…
@PiseBankProduction
@PiseBankProduction 4 жыл бұрын
Спасибо братуха,очень помог!
@юрийворонцов-ж7з
@юрийворонцов-ж7з 3 жыл бұрын
кнопка is 300$
@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 фильтре. Можете поэкспериментировать, может есть и лучшие решения.
@m131184m
@m131184m Жыл бұрын
Спасибо!
@TDMLab
@TDMLab 6 жыл бұрын
По аппаратному устранению дребезга почти согласен, конденсатор такой емкости не нужен, лучше например так kzbin.info/www/bejne/f5bRd3x_gq6Vr80 (ТШ перед ФНЧ не обязательны)
@UCanDo
@UCanDo 6 жыл бұрын
Я в большинстве случаев ставлю на 1 мкф. Хватает. Просто в видео я показывал работу с кнопкой наихудшего состояния (вытянул эту кнопку из мусорного ведра:)))
@TDMLab
@TDMLab 6 жыл бұрын
Home Made - То, что ты можешь сделать Я имел ввиду, что можно совсем маленькую ёмкость использовать на 10-100нФ по немного другой схеме. В любом случае я согласен что delay не надо применять никогда, от слова вообще.
@UCanDo
@UCanDo 6 жыл бұрын
Да, я с вами полностью согласен!
@f33net
@f33net 6 жыл бұрын
Худьщий кнопка - это проводочком касаться. Вот потестируй оно на этом массовом алгоритме или аппаратуре. :)
@f33net
@f33net 6 жыл бұрын
Там ФНЧ примитивный первого порядка с очень пологой характеристикой, он не спасёт от шуршащей в нажатом состоянии кнопки, что случается в промышленной автоматике очень часто, особенно у любителей кнопок IEK. :). Программная реализация такого фильтра ничуть не уступит. Нужен ФНЧ второго порядка, либо два ФНЧ первого порядка, но инверсно на RS-триггер включенные.
@SergeyBelotserkovskiy
@SergeyBelotserkovskiy 6 жыл бұрын
Первый раз вижу такой алгоритм борьбы с дребезгом контактов
@UCanDo
@UCanDo 6 жыл бұрын
Способов очень много. Мне больше всего понравился этот.
@80cahek
@80cahek 6 жыл бұрын
Sergei Belotserkovskii стоит такой алгоритм на освещении в квартире, причем на входе идет разбивка по уровням от нескольких ADC (кнопки через резисторные делители и несколько выключателей). лет 5 уже без сбоев.
@mikurrey416
@mikurrey416 6 ай бұрын
А можно ли (и целесообразно ли) триггер Шмидта заменить программно, если обрабатывать ввод как аналоговый и реагировать на переход порогового значения? Т. е. использовать конденсатор, но обойтись без дополнительной микросхемы. Ваш программный способ очень интересный, но я бы предложил ему другое применение: тестировать кнопки и по коэффициенту определять износ (для этого можно даже сделать его изменяемым через Serial или как-то ещё). А если по назначению, то, похоже, что со временем готовое устройство придется перепрошивать для увеличения коэффициента.
@UCanDo
@UCanDo 6 ай бұрын
Отвечу на ваш вопрос с конца: Со временем нужно будет не перепрошивать (подстраивать коэффициент) а менять кнопку, которая израсходовала свой ресурс. Кнопки - это расходный материал. В остальном конструкция и код сильно зависят от потребностей и конкретного кода. Если нужно быстродействие то используют программные способы устранения дребезга, и аналоговый вход не подходит из-за медленной обработки. Если же быстродействие не важно, то можно и просто delay(); поставить… Так что все очень сильно зависит от конкретной программы и конкретных требований.
@mikurrey416
@mikurrey416 6 ай бұрын
@@UCanDo спасибо, буду знать :) Delay - нет, не надо, не рекомендуйте её новичкам) Только-только закончил возиться с первым обучающим набором, и уже сам понял, на сколько это плохо. Может, delay применим там, где действительно нужен фриз контроллера на N миллисекунд, но некоторые обучающие блогеры (не вы, другие) на полном серьёзе рекомендуют именно так бороться с дребезгом.
@UCanDo
@UCanDo 6 ай бұрын
@@mikurrey416 да, delay() -зло! 😁
@_i_m_
@_i_m_ 6 жыл бұрын
подскажите, почему первая и вторая нага триггера Шмитта закорочены?
@UCanDo
@UCanDo 6 жыл бұрын
У меня используется микросхема с двумя входами "и". Пришлось соединить оба входа, для того чтобы получить прямой вход. Смотрите даташит на ту микросхему, которую будете использовать.
@victorsi1992
@victorsi1992 5 жыл бұрын
Варіант з конденсатором, криє в собі ще одну підставу. Гарно розглянувши схему, ми побачимо що кнопка, своїми контактами розряджає конденсатор. Струм, який виникає при розряджанні конденсатора через контакти кнопки, дуже швидко вкорочує їй віку. Проведіть експеримент знявши осцилограму з шунта (резистор 5-10 ом, підключеного послідовно з кнопкою. Будете вражені. ))
@UCanDo
@UCanDo 5 жыл бұрын
При замыкании конденсатора через кнопку потечёт ток менее 50 мА (при расчете что конденсатор емкостью не более 1 мкф). Время полного разряда около 10 мс. Признаюсь серьезных расчетов не делал, лишь «грубо» прикинул. Я не учитывал esr конденсатора (что снижает силу тока, так как у конденсаторов малой емкости, обычно, очень высокое внутреннее сопротивление), и некоторые другие факторы, на пример силу тока протекающую через резистор. Но в целом нагрузка на кнопку будет столь незначительна, что никак не повлияет на продолжительность службы кнопки.
@ВладиславР-щ4ъ
@ВладиславР-щ4ъ Жыл бұрын
А если в кнопке 12v ? Нужно ли увеличивать номиналы? Мне грубо очистить надо сигнал.
@UCanDo
@UCanDo Жыл бұрын
Не может микроконтроллер работать с 12-тивольтовым сигналом. Что именно, куда и как у вас подключено и что вы хотите сделать?
@ВладиславР-щ4ъ
@ВладиславР-щ4ъ Жыл бұрын
@@UCanDo микроконтроллер вообще не использую, работать будет работать с реле задержки времени. Мне нужно к этому контроллеру через 20 см водного раствора пропустить сигнал для датчика уровня. Поэтому предположил что 12 В лучше тем более блок питания на 12, вот интересуюсь по поводу номиналов резистора и конденсатора, нужно ли увеличить их номинальная мощность или номинальные характеристики
@UCanDo
@UCanDo Жыл бұрын
@@ВладиславР-щ4ъ хм.. 🤔 У меня есть группа в Иелеграмм, там можно пообщаться на любую тему и задать любой вопрос, так что можешь за советом обратиться туда: t.me/HomeMadeChannel
@ВладиславР-щ4ъ
@ВладиславР-щ4ъ Жыл бұрын
@@UCanDo как бы не совсем удобно в Instagram меня нет. Хотелось бы узнать хотя бы в правильном направлении я копаю или нет
@f33net
@f33net 6 жыл бұрын
Забыл сказать про православный алгоритм... :) Использовать двунаправленный таймер, который при нажатой кнопке назад считает, при отпущенной вперёд, а по достижении нуля и значение защёлки генерит прерывание, в котором проверяется значение таймера и решается что с кнопкой. Во время дребезга таймер будет туда сюда метяться в каком-то значении и лишь при устойчивом контакте дойдёт до края. Реализуется аппаратно и программно весьма просто.
@UCanDo
@UCanDo 6 жыл бұрын
Тоже самое что и в примере, только используется аппаратный таймер
@f33net
@f33net 6 жыл бұрын
Трандец схемотехника... Если уж просто и по-колхозному кондюк, то нафига т.с. необычно вверх ногами? Обычно кнопочные команда на землю даются. Вообще нужен ФНЧ, со срезом Герц так 10, т.е. максимально сколько чел может настучать. С учётом высокоомности входов МК, ёмкости большой не потребуется. Вместо триггера Шмитта (он не инвертирует, с чего ты взял эту глупость, тебе такая микруха досталась, он вообще, на любом операционнике или логическом элементе делается за счёт резистора обратной связи) уже давно созданы специализированные микрухи давить дребезг. Синхронизацией развёртки научись у осциллографа пользоваться - будет красиво и удобно видеть переходные процессы не уползающие вбок, даже разглядеть пики можно . :) Алгоритм "ой, что-то с кнопкой, подождём пока устаканится и посмотрим что с ней" ооочень распространённый, но кнопка может шуршать и в нажатом состоянии. А уж к матрице этот алгоритм прикручивать вообще некузяво. Нужен тот же ФНЧ, но программyый. Т.е. изменение состояния быстрее 1/10 секунды игнорировать. Но самое надёжное - это переключающийся контакт на RS триггер заведённый (на два входа МК). :)
@egorkusnezov
@egorkusnezov 6 жыл бұрын
Но самое надёжное - это переключающийся контакт на RS триггер заведённый (на два входа МК). :) Вот где-б пример увидеть...
@АлександрНефедов-о2н
@АлександрНефедов-о2н 4 жыл бұрын
@@egorkusnezov нам на первом курсе института эту схему показали мимоходом: кнопка переключает "единицу" между R или S - подтяжки и прочие перелести по вкусу. в этом случае дребезг и "шуршания" никак не влияют на выход триггера. про "два входа МК" не понял.
@KobalyanTV
@KobalyanTV 5 жыл бұрын
вместо того чтобы считать импульсы можно просто задать время паузы при нажатии\отжатии.
@UCanDo
@UCanDo 5 жыл бұрын
Delay - зло :) Но иногда целесообразнее использовать его. Все зависит от конкретного проекта
@KobalyanTV
@KobalyanTV 5 жыл бұрын
@@UCanDo под словом пауза я подразумевал death time при котором контроллер не будит видеть ненужные нажатия, необязательно delay. Согласен зло тоже можно иногда использовать - Дарт Вейдер одобряет.))
@amid6229
@amid6229 2 жыл бұрын
@@UCanDo должна быть библиотека, которую можно легко подключить и настроить к любому проекту. Глупо под каждый конкретный случай изобретать очередной велосипед, если задача типовая и без особой специфики. Да и программное решение дребезга актуально только для макетирования (чтоб не загромождать макетку и не коротнуть случайно чего) и навесного монтажа (ну коли дело дошло до разработки и изготовления печатной платы, наверняка найдётся и возможность впаять пару SMD компонентов).
@Master_Q
@Master_Q 2 жыл бұрын
Динистор помогает в борьбе с дребезгом контактов?
@UCanDo
@UCanDo 2 жыл бұрын
Очень сомневаюсь. Динистор - это по сути диод, только немного «хитро» устроенный.
@yehorpererva6803
@yehorpererva6803 6 жыл бұрын
Переворачивает - только инвертирующий тригер Шмидта.
@UCanDo
@UCanDo 6 жыл бұрын
Да, все верно, забыл об этом упомянуть
@kamesm
@kamesm 5 жыл бұрын
Зачем его вообще использовать, если ножки микроконтроллера все равно превращают импульс в логический?
@UCanDo
@UCanDo 5 жыл бұрын
Триггер Шмидта превращает аналоговый сигнал в меандр.
@ЄвгенПритула
@ЄвгенПритула 3 жыл бұрын
@@UCanDo а в контролері АЦП? :))
@UCanDo
@UCanDo 3 жыл бұрын
Применять АЦП для обработки кнопок - так себе решение…
@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т
@ВалентинАндреев-л3т 6 жыл бұрын
Djleon_ Leonid прав у вас даже хуже делэй получилось
@UCanDo
@UCanDo 6 жыл бұрын
Нет, не хуже. Вы же не будете добавлять задержку в цикл, который и так длится целых 300 мс!!! В таких случаях кнопка вешается на прерывание + техническая защита от дребезга (резистор + конденсатор + триггер Шмидта). Djleon_ Leonid, пересмотрите видео еще раз. В прерывании нет никакого +70. Прерывание срабатывает сразу после нажатия кнопки и только 1 раз. Будьте внимательны. P.S. если один цикл программы длится целых 300 мс то программа явно не оптимизированна. Работа с кнопками в такой программе в принципе будет не возможной (даже на прерываниях), так как на любое действие будет тратиться слишком много времени.
@DjleonLeon
@DjleonLeon 6 жыл бұрын
Home Made - Хорошо, объясню по другому: есть программа на нулевом прирывании счётчик Гейгера, на втором кнопка меню, с вашим алгоритмом. При нажатии срабатывает прерывание 1 и длится обработка дребезга, тоесть программа считает до 70 в любую сторону, за это время вы теряете много импульсов счётчика, ваша программа работает плохо, если при прирывании от кнопки ничего не считать, а просто сравнить значение счётчика миллисекунд, вы потеряете меньше импульсов (отсчёт 70 сложений дольше, чем операция сравнения) ваша программа будет на много корректнее.
@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, то пожалуйста, напишите его здесь, или дайте на него ссылку. Это будет полезным всем кто прочтёт.
@BerlogerX
@BerlogerX 4 жыл бұрын
Как подобрана величина емкости конденсатора? Методом тыка?
@UCanDo
@UCanDo 4 жыл бұрын
Можно рассчитать скорость разряда конденсатора. Но проще поставить на 1 мкф. чем пытаться подобрать емкость под возможную частоту нажатия кнопок.
@СергейНиколаев-у9х6ц
@СергейНиколаев-у9х6ц 4 жыл бұрын
Я обычно выдерживаю короткую временнУю паузу (без delay), перед тем, как считать следующее состояние кнопки.
@UCanDo
@UCanDo 4 жыл бұрын
Без примера кода сложно догадаться как у вас это реализовано :)
@СергейНиколаев-у9х6ц
@СергейНиколаев-у9х6ц 4 жыл бұрын
@@UCanDo создаём переменную типа unsigned long, присваиваем этой переменной текущее время (millis). Создаём функцию "опроса кнопки", прописываем в ней условие: если текущее время, минус вышеуказанная переменная, меньше например 200 мс, то выходим из функции, не опрашивая состояние кнопки, в противном случае читаем статус кнопки и присваиваем переменной текущее время. Правда не учтён дребезг, когда кнопка продолжительное время в нажатом состоянии и когда контакты уже немного окислившиеся. Я на дверь и в отверстия в косяке, куда входят ригели замка, ставил концевые переключатели, вроде пока норм регистрируют.
@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 жыл бұрын
Спасибо. Тоже хороший пример
@volodysarasov
@volodysarasov 4 жыл бұрын
подскажите как сделать нажал и отпустил кнопку светодиод загорелся , нажал и отпустил кнопку второй раз светодиод потух , работа по нажатию кнопки + анти-дребезг
@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 жыл бұрын
Установить несколько кнопок на одно прерывание - можно, проблем никаких нет. Посмотрите видео на моем канале, рассказал пару методов, как это сделать.
@victorbrynev622
@victorbrynev622 6 жыл бұрын
14:50 не проще сделать следующее: "создать две переменые, програмную задержку, в проверке указать, если одно значени и пред. значение установились, то есть равны, и время более 0.15-0.33 сек, то значение верное, и идем сравнивать, какая кнопка нажата."?
@UCanDo
@UCanDo 6 жыл бұрын
Вариантов много. Можно использовать любой, какой больше всего вам подходит.
@victorbrynev622
@victorbrynev622 6 жыл бұрын
@@UCanDo , я говорил именно об кнопках на аналоговый.
@romankrv
@romankrv 4 жыл бұрын
@Home Made - То, что ты можешь сделать || Покажите, как устранить дребезг на ноутбутчной клавиатуре. У меня на Linovo T440p клавиша Enter совсем с ума сошла.
@UCanDo
@UCanDo 4 жыл бұрын
Никак. Только заменой клавиатуры.
@Palladln
@Palladln Жыл бұрын
перепаяй кнопку, подпаяй кондер на 3-10 нанофарад, керамику..
@poweredbysergey
@poweredbysergey 6 жыл бұрын
Usefull
@БорисЕгоров-у4р
@БорисЕгоров-у4р 2 ай бұрын
If if if три функции подряд. Как понять?
@ВалентинАндреев-л3т
@ВалентинАндреев-л3т 6 жыл бұрын
почему прерывание срабатывает только после повторения цикла loop?
@UCanDo
@UCanDo 6 жыл бұрын
Прерывание срабатывает постоянно. В основном цикле происходит вывод в сериал. Прерывание от loop не зависит
@vyorkin
@vyorkin 4 жыл бұрын
prev_count от слова previous
@radiotechnician1757
@radiotechnician1757 6 жыл бұрын
беда( блогеры которые юзают ардуино мимоходом решают дребезг.
@UCanDo
@UCanDo 6 жыл бұрын
А почему беда?
@UCanDo
@UCanDo 6 жыл бұрын
Понятно. Спасибо
@Gameplayer55055
@Gameplayer55055 6 жыл бұрын
Delay,rs фиксатор , конденсатор
@ЕвгенийМельник-я6в
@ЕвгенийМельник-я6в 6 жыл бұрын
Нормальные люди кнопки опрашивают по таймеру, внешние прерывания не для этого.
@babichfx
@babichfx Жыл бұрын
6:55 пипец обвязка ради одной кнопки да?!
@cedric69graf
@cedric69graf 5 жыл бұрын
Здравствуйте! Могу я попросить Вас стать моим преподавателем-онлайн. Предложение платное. Тонкости можно обсудить после вашего ответа.
@UCanDo
@UCanDo 5 жыл бұрын
Добрый день. Я сейчас в отъезде. На два месяца. Все наработки остались дома. Смогу помочь только по приезду.
@cedric69graf
@cedric69graf 5 жыл бұрын
Будем ждать. Спасибо за ответ.@@UCanDo
@UCanDo
@UCanDo 5 жыл бұрын
Напишите мне где-то после 15-го апреля. Тогда я уже буду дома
@andriuha_m
@andriuha_m 3 жыл бұрын
У меня видимо кнопка вообще изнасилована, мне пришлось выставить не 70 а 500 для нормального срабатывания
@Master_Q
@Master_Q 2 жыл бұрын
Насколько это надёжное решение?
@UCanDo
@UCanDo 2 жыл бұрын
Существует много способов для борьбы с дребезгом. Применять можно любой, все зависит от задачи. На счет программного решения - лучшего чем в этом видео я не встречал.
@ВалентинАндреев-л3т
@ВалентинАндреев-л3т 6 жыл бұрын
(ты совсем не экономишь память)
@UCanDo
@UCanDo 6 жыл бұрын
Чем именно? Delay памяти использует гораздо больше. К тому же экономия только ради экономии - это всего лишь трата собственного времени (если, конечно, это не крайне необходимо).
@АлександровичЯ-к5с
@АлександровичЯ-к5с 3 жыл бұрын
Дребезг контактов наблюдается как при нажатии кнопки , так и при её отпускании .
@UCanDo
@UCanDo 3 жыл бұрын
Да, это так. Но это никак не влияет на код в целом. Так как отслеживается именно нажатие, но при отпускании кнопка в конечном счете оказывается с разомкнутыми контактами, и дребезг при отпускании кнопки отсеивается программно. По крайней мере, за всю мою практику я не сталкивался с проблемой случайных нажатий при отпускании кнопки. И даже не задумывался об этом до вашего Сообщения.
@АлександровичЯ-к5с
@АлександровичЯ-к5с 3 жыл бұрын
​@@UCanDo А вот какова длительность паузы между двумя последовательными нажатиями ?
@АлександровичЯ-к5с
@АлександровичЯ-к5с 3 жыл бұрын
@@UCanDo Поправлю вопрос , минимальная длительность паузы !
@UCanDo
@UCanDo 3 жыл бұрын
Зависит от программной реализации кода кнопки. Я сейчас не у компьютера, код не могу посмотреть и сказать точно.
@UCanDo
@UCanDo 3 жыл бұрын
Посмотрел видео. При программном отсеивании минимальная пауза между кнопками будем миллисекунды.
@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 микрофарат и все равно кнопка иногда "сама" нажимается ....
@Relevantium
@Relevantium 5 жыл бұрын
Одет проще нормальные кнопки купить?
@UCanDo
@UCanDo 5 жыл бұрын
Все кнопки без исключения имеют дребезг. Не существует кнопок, которые бы не производили помехи.
@decoratorr
@decoratorr 6 жыл бұрын
Четко объясняешь)
@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 микрофарад не хватит чтобы как-то навредить контактам. Раньше механический и химический (от влажности и воздуха) износ наступят чем от разрядов конденсатора… Проблема от использования внутренних подтяжек может возникнуть только при длинных проводниках, особенно если они идут в параллель с силовыми.
@Dim_sev
@Dim_sev 6 жыл бұрын
фоновая музыка полный шлак
@UCanDo
@UCanDo 6 жыл бұрын
Посоветуйте другую
GY-271. Digital magnetometer and Arduino. Make a compass
12:09
БУ, ИСПУГАЛСЯ?? #shorts
00:22
Паша Осадчий
Рет қаралды 2,6 МЛН
Trapped by the Machine, Saved by Kind Strangers! #shorts
00:21
Fabiosa Best Lifehacks
Рет қаралды 39 МЛН
The Singing Challenge #joker #Harriet Quinn
00:35
佐助与鸣人
Рет қаралды 37 МЛН
«Осень». Самая большая загадка Windows XP
14:36
Девять десятых
Рет қаралды 1,2 МЛН
How to connect the display from a mobile phone to Arduino
13:58
Home Made
Рет қаралды 1,3 МЛН
Зачем ставить Микроконтроллер в простые устройства?
16:38
ElEnBlog - блог об электронике
Рет қаралды 110 М.
We accelerate Arduino more than 20 times!
28:18
Home Made
Рет қаралды 70 М.
БУ, ИСПУГАЛСЯ?? #shorts
00:22
Паша Осадчий
Рет қаралды 2,6 МЛН