Дребезжит не кнопка, дребезжат контакты (везде, не только в кнопках), то есть правильно - дребезг контактов.
@nickmuntyanov28823 жыл бұрын
При нажатии кнопки у вас конденсатор заряжается/разряжается быстро. Можно резистор поставить увеличив время зарядки/разрядки и тем самым не увеличивать емкость бесконечно.
@amid62292 жыл бұрын
А что мешает рассчитать адекватные номиналы резистора и конденсатора? Или подсмотреть в схемы продаваемых изделий? Я в основном видел конденсаторы на 100 nF и резисторы на килоомы (4.7 и выше) или вообще на внутренних подтяжках (20 кОм) Обычно, период колебаний от дребезга менее 1 миллисекунды. Конденсатор 100 nF и резистор 20 кОм гарантирует, что напряжение не поднимется выше 1.15 Вольта раньше 1 с небольшим миллисекунд. Если же мы добавляем резистор между кнопкой и конденсатором, то конденсатор не разрядится мгновенно (практически), и может случиться так, что иногда конденсатор разрядится до 0.9 вольт и успеет зарядиться до 2.2 вольт (при питании 3.3), что приведёт к срабатыванию на единицу, и мы получим дребезг… Ну и задержки срабатывания по обеим сторонам (по нажатию и отпусканию), вместо одной (по отпусканию)…
@GennPen3 жыл бұрын
1) НИКОГДА не подключайте конденсатор параллельно кнопке. Ни в верхнее, ни в нижнее плечо. Разряжая(заряжая) конденсатор у кнопки будут подгорать контакты, а это через определенное время убьет ее в труху, что даже нажиматься может перестать. Используйте RCR-цепочку, т.е. в схеме с конденсатором последовательно кнопке НУЖНО ставить резистор. 2) Триггер Шмитта ставят не для инвертирования сигнала, а за его свойства петли гистерезиса. Грубо говоря, из 0 в 1 он переключается при бОльшем напряжении, чем из 1 в 0. Мало того, все современные контроллеры при включении входа как цифровой переключают его на триггер Шмитта.
@amid62292 жыл бұрын
И что так много адептов резистора перед кнопкой? А как поставить резистор между кнопками и конденсатором образованном ножками кнопки, а так же дорожкой от резистора до кнопки и землёй? Может просто для этих целей не использовать конденсаторы большой ёмкости (микрофарады)? Ещё и схема энергоэффективнее выйдет…
@Palladln Жыл бұрын
можно взять кондер 2-33 нанофарады и резистор сотни Ком. тогда подгорать ничего не будет.
@UCanDo Жыл бұрын
Там ничего подгорать не будет в любом случае. Так как для образования искры и нагара нужны большие токи или высокое напряжение. На кнопках логики такого никогда не бывает.
@NoName-dj6bd3 ай бұрын
@@Palladln Я ставлю 680пФ на порт МК, 10 ом между портом и кнопкой, работает идеально. Уже не помню, но в какой книге вычитал по программированию AVR.
@dmitriyfilatov86583 жыл бұрын
Ахренеть, сколько умных советов))) Я напомню, что у меги (и не только) на входах уже стоят триггеры Шмитта...! На этом, можно было бы и попрощаться, но уверен, не все от этого знания поймут, куда слить все видео аналогичные этому. Поэтому подскажу, все же, последующие шаги. Так как вход можно притянуть программно вверх (к VCC) через внутренний резистор порядка 30-45 кОм, то достаточно будет между линией кнопки и GND (перед входом МК) поставить емкость порядка 0,47 мкФ и аппаратная защита от дребезга с интервалом 14-21 мс будет решена аппаратно. И не хер насиловать МК программно. Нужна длительность задержки на дребезг больше, увеличивайте емкость согласно t = R*C
@UCanDo3 жыл бұрын
Друг, вы видите только один путь решения и его продвигаете как единственно истинный. Но ведь решений может быть много. И совершенно не значит что иные пути решения неверные. По поводу постройки на внутреннем подтягивающем резисторе - у него довольно большое сопротивление, на сколько я помню в Атмегах он имеет сопротивление что-то около 50 кОм. Для того чтобы этот резистор адекватно заработал в связке к конденсатором необходимо значительно уменьшить емкость конденсатора, из-за чего эффект сводится на нет, и работать все это будет только на идеально новых кнопка (и то не факт).
@dmitriyfilatov86583 жыл бұрын
@@UCanDo, совсем нет необходимости значительно уменьшать емкость. При таком высоком входном сопротивлении вентиля на триггере Шмитта, не важно (в разумных пределах) значение емкости. Единственно важным может быть количество энергии, запасенной конденсатором и ее разряд на контакты кнопки. В этом случае (если есть опасение износа контактов) достаточно последовательно кнопке поставить резистор на десятки Ом для гашения броска тока. Я практикую 100 Ом.
@AcademonZx6 жыл бұрын
Очень элегантно. Спасибо!
@Андрей_Чайка6 жыл бұрын
Экспериментировал с кнопками много раз. Нашел пару интересных вариантов: 1. Если паять, то достаточно напаять смд резистор, к примеру, на 10к...100к на землю и паралельно на него паял смд кондёр на 100n. Работает безотказно, паять можно прямо на ардуинку, места не занимает. 2. Если программно, я брал таймер (библиотеку), конкретно: simpleTimer. При нажатии кнопки "включалась" переменная запрета нажатия, которая мониторится при срабатывании кнопки. И запускался таймер, я для своих задач ставил 200 - 300 мс. По окончанию таймера запрет снимается. Из минусов: нельзя держать нажатой кнопку больше чем время таймера, иначе при отжатии будут ложные срабатывания.
@UCanDo6 жыл бұрын
Да, вариантов есть много. И каждый по-своему хорош.
@smilk10007 ай бұрын
Если нет кондера и нужно убрать дребезг, просто создайте переменную типа число и при каждом нажатии увеличивайте ее на 1. В Loop раз в секунду (только не через delay а через mills()) проверяйте если эта переменная больше 0 тогда кнопка была нажата, и сбрасывайте ее опять в 0. Самый простой и работающий способ.
@UCanDo7 ай бұрын
Работать будет, но в использовании устройство будет казаться «тормознутым» и не отзывчивым, так как после нажатия на кнопку пройдёт до 1 секунды, пока устройство отреагирует. А это совсем плохо. Реакция на нажатия кнопки должна быть сразу, без задержек.
@chessalkin99394 жыл бұрын
"5,7..." - и все отлично работает))
@Heorenmaru6 жыл бұрын
я делал так: нажали, контроллер увидел, подождал, проверил снова если еще нажата то обрабатывает нажатие есть еще вариант с двухпозиционной кнопкой, которая будет подавать на порт либо минус либо плюс, перезаряжая при этом конденсатор, который удерживает состояние линии
@UCanDo6 жыл бұрын
Вариантов работы с кнопкой несколько и каждый удобен для конкретного случая.
@mikhailkolokoltsev24815 жыл бұрын
Чет с программным решением намудрил. Я сделал так: в обработчике прерывания if (millis()-lastTime
@UCanDo5 жыл бұрын
Каждому проекту свой подход. Иногда и простого delay() достаточно, а иногда нужно не иметь никакой привязки к паузам (таким как delay, millis или таймер), когда нужно получить чистое нажатие, все равно с какой частотой.
@ПавелХрячков-л7ы5 жыл бұрын
На Ардуино уно тактовая частота 8МГц, а на меге около 80...что в 10 раз чаще. Поменяв контроллер, дребезг будет работать в 10 раз чаще, не говоря уже о моделях с ГГц на тактовом генераторе :) . Получается тайминг на дребезг скрыт в частоте работы контроллера. Поправите если я не прав. И использование таймера (millis) более универсальное решение.
@UCanDo5 жыл бұрын
Uno и Mega (да и почти все остальные Ардуино) работают на частоте 16 МГц. На частоте 8 МГц работают только низковольтные микроконтроллеры, которые работают от 3.3 вольт. На частоте 80 МГц работает плата DUE, но она редкость, ею почти никто не пользуется. Об Ардуино, работающей на частотах в ГГц первый раз слышу. Дребезг - это физическое свойство кнопки. Плохой контакт в момент нажатия. У новых кнопок он меньше, у старых - больше. Но он присутствует всегда. И он не зависит от скорости работы микроконтроллера. Кстати, приведённый код я применял на STM, там частота 160 МГц, работает отлично. Лишь некоторые значения выставлял другие. Вообще нет такого правили что нужно делать только так, а не иначе. Каждый использует то что ему удобно. Единственное замечание могу сказать: профессионалы не используют паузы, даже millis не применяют.
@Nevzoroff_3 жыл бұрын
@@UCanDo Я так понимаю, в отношении к кнопкам не применяют, а вообще если скетч маленький то работать будет, а если штук 20 флоат переменных и лишнюю строку не добавить, этот алгоритм будет тупо пропускать нажатия...
@UCanDo3 жыл бұрын
Не играет роли сколько кнопок. Они все будут обрабатываться «почти» одновременно. И пропусков не будет.
@amid62292 жыл бұрын
@@UCanDo , пропуски будут рразве что если основное тело программы очень тяжелое и не постоянное по времени исполнения (т.е. один цикл проходит за десятые доли миллисекунду, а другой за десятки или сотни). Но это скорее всего будет связано с кривыми ручками, навтыкавшими кучу задержек…
@PiseBankProduction4 жыл бұрын
Спасибо братуха,очень помог!
@юрийворонцов-ж7з3 жыл бұрын
кнопка is 300$
@bubuii6 жыл бұрын
Это всё-равно Delay. ЦП отсчитывает счётчик - а это значит он занят.Есть ещё много вариантов: Таймер-счётчик, пороговый диод. Но дилэй самый простой.
@UCanDo6 жыл бұрын
Работу микроконтроллера можно сравнить с работой повара. Вод представим что повару нужно сварить картошку в мундирах. Но картофель бывает разный и варится разное время. сила огня бывает разной. Какой сейчас картофель и как быстро он сварится - не известно. Картофель может вариться от 10 минут до 40 минут. Как будет действовать повар в сравнении с работой микроконтроллера: DELAY: Повар закинул картофель, поставил таймер на 40 минут (максимум, что бы точно сварилась) и стоит все 40 минут и смотрит на кастрюлю. За это время он больше ничего не делает, только ждет. После 40 минут достает картофель. Продуктивность минимальная + картофель мог быть тот который быстро варится и он мог развариться. MILLIS: Повар закинул картофель, поставил таймер на 40 минут (максимум, что бы точно сварилась). Пока идет таймер повар занимается другими делами. Продуктивность в таком случае максимальная, но картофель все так же мог развариться. ПРЕРЫВАНИЕ: у повара есть помощник, который проверяет когда картофель сварится, как только сварится - зовет повара. Продуктивность максимальная, картофель сварен правильно. ОТСЕИВАНИЕ ДРЕБЕЗГА (мой пример): повар ставит картофель и время от времени вилкой проверяет готовность. Продуктивность максимальная, картофель сварен правильно. Если все это перевести в работу микроконтроллера: DELAY: микроконтроллер стоит на месте и не выполняет никакой работы. Продуктивность минимальная. Невозможно отследить быстрые нажатия (двойные, тройные) и невозможно нормально обработать удерживание кнопки - это полное зависание МК. MILLIS: Микроконтроллер выполняет другую работу. Но все так же невозможно отследить быстрые нажатия (двойные, тройные) и невозможно (или очень проблематично) обработать удерживание кнопки. ПРЕРЫВАНИЕ: Микроконтроллер выполняет другую работу. Нормально обрабатываются быстрые нажатия (двойные, тройные). А вот удерживание кнопки обработать очень проблематично. ОТСЕИВАНИЕ ДРЕБЕЗГА (мой пример): Микроконтроллер выполняет другую работу. Нормально обрабатываются быстрые нажатия (двойные, тройные) и нормально обрабатывается удерживание кнопки. Во всех случаях есть свои исключения и сферы применения. Так же все зависит от сложности всей остальной программы и как быстро основной код выполняется. Но все же мой пример - это никак не Delay. Delay - зло :))
@Palladln Жыл бұрын
@@UCanDo офигенно объяснил!
@reodos36 жыл бұрын
Триггер шмидта имеет гистерезис и это классический способ борьбы с дребезгом. Но насколько я знаю у ардуинок тоже есть гистерезис, поэтому достаточно только конденсатора. Но я бы его подключал по другому, возможно параллельно резистору?
@UCanDo6 жыл бұрын
Я взял самую распространённую схему на r-c фильтре. Можете поэкспериментировать, может есть и лучшие решения.
@m131184m Жыл бұрын
Спасибо!
@TDMLab6 жыл бұрын
По аппаратному устранению дребезга почти согласен, конденсатор такой емкости не нужен, лучше например так kzbin.info/www/bejne/f5bRd3x_gq6Vr80 (ТШ перед ФНЧ не обязательны)
@UCanDo6 жыл бұрын
Я в большинстве случаев ставлю на 1 мкф. Хватает. Просто в видео я показывал работу с кнопкой наихудшего состояния (вытянул эту кнопку из мусорного ведра:)))
@TDMLab6 жыл бұрын
Home Made - То, что ты можешь сделать Я имел ввиду, что можно совсем маленькую ёмкость использовать на 10-100нФ по немного другой схеме. В любом случае я согласен что delay не надо применять никогда, от слова вообще.
@UCanDo6 жыл бұрын
Да, я с вами полностью согласен!
@f33net6 жыл бұрын
Худьщий кнопка - это проводочком касаться. Вот потестируй оно на этом массовом алгоритме или аппаратуре. :)
@f33net6 жыл бұрын
Там ФНЧ примитивный первого порядка с очень пологой характеристикой, он не спасёт от шуршащей в нажатом состоянии кнопки, что случается в промышленной автоматике очень часто, особенно у любителей кнопок IEK. :). Программная реализация такого фильтра ничуть не уступит. Нужен ФНЧ второго порядка, либо два ФНЧ первого порядка, но инверсно на RS-триггер включенные.
@SergeyBelotserkovskiy6 жыл бұрын
Первый раз вижу такой алгоритм борьбы с дребезгом контактов
@UCanDo6 жыл бұрын
Способов очень много. Мне больше всего понравился этот.
@80cahek6 жыл бұрын
Sergei Belotserkovskii стоит такой алгоритм на освещении в квартире, причем на входе идет разбивка по уровням от нескольких ADC (кнопки через резисторные делители и несколько выключателей). лет 5 уже без сбоев.
@mikurrey4166 ай бұрын
А можно ли (и целесообразно ли) триггер Шмидта заменить программно, если обрабатывать ввод как аналоговый и реагировать на переход порогового значения? Т. е. использовать конденсатор, но обойтись без дополнительной микросхемы. Ваш программный способ очень интересный, но я бы предложил ему другое применение: тестировать кнопки и по коэффициенту определять износ (для этого можно даже сделать его изменяемым через Serial или как-то ещё). А если по назначению, то, похоже, что со временем готовое устройство придется перепрошивать для увеличения коэффициента.
@UCanDo6 ай бұрын
Отвечу на ваш вопрос с конца: Со временем нужно будет не перепрошивать (подстраивать коэффициент) а менять кнопку, которая израсходовала свой ресурс. Кнопки - это расходный материал. В остальном конструкция и код сильно зависят от потребностей и конкретного кода. Если нужно быстродействие то используют программные способы устранения дребезга, и аналоговый вход не подходит из-за медленной обработки. Если же быстродействие не важно, то можно и просто delay(); поставить… Так что все очень сильно зависит от конкретной программы и конкретных требований.
@mikurrey4166 ай бұрын
@@UCanDo спасибо, буду знать :) Delay - нет, не надо, не рекомендуйте её новичкам) Только-только закончил возиться с первым обучающим набором, и уже сам понял, на сколько это плохо. Может, delay применим там, где действительно нужен фриз контроллера на N миллисекунд, но некоторые обучающие блогеры (не вы, другие) на полном серьёзе рекомендуют именно так бороться с дребезгом.
@UCanDo6 ай бұрын
@@mikurrey416 да, delay() -зло! 😁
@_i_m_6 жыл бұрын
подскажите, почему первая и вторая нага триггера Шмитта закорочены?
@UCanDo6 жыл бұрын
У меня используется микросхема с двумя входами "и". Пришлось соединить оба входа, для того чтобы получить прямой вход. Смотрите даташит на ту микросхему, которую будете использовать.
@victorsi19925 жыл бұрын
Варіант з конденсатором, криє в собі ще одну підставу. Гарно розглянувши схему, ми побачимо що кнопка, своїми контактами розряджає конденсатор. Струм, який виникає при розряджанні конденсатора через контакти кнопки, дуже швидко вкорочує їй віку. Проведіть експеримент знявши осцилограму з шунта (резистор 5-10 ом, підключеного послідовно з кнопкою. Будете вражені. ))
@UCanDo5 жыл бұрын
При замыкании конденсатора через кнопку потечёт ток менее 50 мА (при расчете что конденсатор емкостью не более 1 мкф). Время полного разряда около 10 мс. Признаюсь серьезных расчетов не делал, лишь «грубо» прикинул. Я не учитывал esr конденсатора (что снижает силу тока, так как у конденсаторов малой емкости, обычно, очень высокое внутреннее сопротивление), и некоторые другие факторы, на пример силу тока протекающую через резистор. Но в целом нагрузка на кнопку будет столь незначительна, что никак не повлияет на продолжительность службы кнопки.
@ВладиславР-щ4ъ Жыл бұрын
А если в кнопке 12v ? Нужно ли увеличивать номиналы? Мне грубо очистить надо сигнал.
@UCanDo Жыл бұрын
Не может микроконтроллер работать с 12-тивольтовым сигналом. Что именно, куда и как у вас подключено и что вы хотите сделать?
@ВладиславР-щ4ъ Жыл бұрын
@@UCanDo микроконтроллер вообще не использую, работать будет работать с реле задержки времени. Мне нужно к этому контроллеру через 20 см водного раствора пропустить сигнал для датчика уровня. Поэтому предположил что 12 В лучше тем более блок питания на 12, вот интересуюсь по поводу номиналов резистора и конденсатора, нужно ли увеличить их номинальная мощность или номинальные характеристики
@UCanDo Жыл бұрын
@@ВладиславР-щ4ъ хм.. 🤔 У меня есть группа в Иелеграмм, там можно пообщаться на любую тему и задать любой вопрос, так что можешь за советом обратиться туда: t.me/HomeMadeChannel
@ВладиславР-щ4ъ Жыл бұрын
@@UCanDo как бы не совсем удобно в Instagram меня нет. Хотелось бы узнать хотя бы в правильном направлении я копаю или нет
@f33net6 жыл бұрын
Забыл сказать про православный алгоритм... :) Использовать двунаправленный таймер, который при нажатой кнопке назад считает, при отпущенной вперёд, а по достижении нуля и значение защёлки генерит прерывание, в котором проверяется значение таймера и решается что с кнопкой. Во время дребезга таймер будет туда сюда метяться в каком-то значении и лишь при устойчивом контакте дойдёт до края. Реализуется аппаратно и программно весьма просто.
@UCanDo6 жыл бұрын
Тоже самое что и в примере, только используется аппаратный таймер
@f33net6 жыл бұрын
Трандец схемотехника... Если уж просто и по-колхозному кондюк, то нафига т.с. необычно вверх ногами? Обычно кнопочные команда на землю даются. Вообще нужен ФНЧ, со срезом Герц так 10, т.е. максимально сколько чел может настучать. С учётом высокоомности входов МК, ёмкости большой не потребуется. Вместо триггера Шмитта (он не инвертирует, с чего ты взял эту глупость, тебе такая микруха досталась, он вообще, на любом операционнике или логическом элементе делается за счёт резистора обратной связи) уже давно созданы специализированные микрухи давить дребезг. Синхронизацией развёртки научись у осциллографа пользоваться - будет красиво и удобно видеть переходные процессы не уползающие вбок, даже разглядеть пики можно . :) Алгоритм "ой, что-то с кнопкой, подождём пока устаканится и посмотрим что с ней" ооочень распространённый, но кнопка может шуршать и в нажатом состоянии. А уж к матрице этот алгоритм прикручивать вообще некузяво. Нужен тот же ФНЧ, но программyый. Т.е. изменение состояния быстрее 1/10 секунды игнорировать. Но самое надёжное - это переключающийся контакт на RS триггер заведённый (на два входа МК). :)
@egorkusnezov6 жыл бұрын
Но самое надёжное - это переключающийся контакт на RS триггер заведённый (на два входа МК). :) Вот где-б пример увидеть...
@АлександрНефедов-о2н4 жыл бұрын
@@egorkusnezov нам на первом курсе института эту схему показали мимоходом: кнопка переключает "единицу" между R или S - подтяжки и прочие перелести по вкусу. в этом случае дребезг и "шуршания" никак не влияют на выход триггера. про "два входа МК" не понял.
@KobalyanTV5 жыл бұрын
вместо того чтобы считать импульсы можно просто задать время паузы при нажатии\отжатии.
@UCanDo5 жыл бұрын
Delay - зло :) Но иногда целесообразнее использовать его. Все зависит от конкретного проекта
@KobalyanTV5 жыл бұрын
@@UCanDo под словом пауза я подразумевал death time при котором контроллер не будит видеть ненужные нажатия, необязательно delay. Согласен зло тоже можно иногда использовать - Дарт Вейдер одобряет.))
@amid62292 жыл бұрын
@@UCanDo должна быть библиотека, которую можно легко подключить и настроить к любому проекту. Глупо под каждый конкретный случай изобретать очередной велосипед, если задача типовая и без особой специфики. Да и программное решение дребезга актуально только для макетирования (чтоб не загромождать макетку и не коротнуть случайно чего) и навесного монтажа (ну коли дело дошло до разработки и изготовления печатной платы, наверняка найдётся и возможность впаять пару SMD компонентов).
@Master_Q2 жыл бұрын
Динистор помогает в борьбе с дребезгом контактов?
@UCanDo2 жыл бұрын
Очень сомневаюсь. Динистор - это по сути диод, только немного «хитро» устроенный.
@yehorpererva68036 жыл бұрын
Переворачивает - только инвертирующий тригер Шмидта.
@UCanDo6 жыл бұрын
Да, все верно, забыл об этом упомянуть
@kamesm5 жыл бұрын
Зачем его вообще использовать, если ножки микроконтроллера все равно превращают импульс в логический?
@UCanDo5 жыл бұрын
Триггер Шмидта превращает аналоговый сигнал в меандр.
@ЄвгенПритула3 жыл бұрын
@@UCanDo а в контролері АЦП? :))
@UCanDo3 жыл бұрын
Применять АЦП для обработки кнопок - так себе решение…
@kostya13066 жыл бұрын
Слишком сложно. Почему бы не взять только первое срабатывание кнопки и увеличить переменную на 1. А далее просто неучитывать следующие срабатывания втечение какого-то времени. Я руководствуюсь тем, что человек физически не может нажимать кнопку 5-10 раз в секунду. Соответственно, какое-то время вообще не обрабатывать кнопку, а затем снова проверять ее состояние до следующего нажатия. Я получил такую задержку опытным путем в 400мс. Если надо быстро бегать по менюшке, то можно и до 300мс уменьшить.
@UCanDo6 жыл бұрын
Паузы - беда всех программ... Нет, конечно можно и без delay, через millis, но это все равно будет "начальный" уровень программирования. К тому же можно забыть про быстрые нажатия ( на пример двойное, тройное). Пауза делает их невозможными. В примере что я привел максимальная пауза = время "успокоения" кнопки, а это очень мало.
@DjleonLeon6 жыл бұрын
Home Made - проблема возникнет, когда будет работать не этот короткий цикл, а полноценная (большая) программа: тогда время затраченное процессором на выполнение всего цикла будет скажем 0.3 секунд и время удержания кнопки (для уверенного срабатывания будет 21 секунда! Тоесть вся программа длится 0.3 секунд и опрос кнопки будет раз в 0.3 секунд (0.3*70=21), если в прирывании, то программа будет остановлена, пока не наберёт 70, а это всё равно как делей. Эффективнее с таймером: программа остановилась, проверена таймер, если превышен интервал дребезга, кнопка нажата, если нет продолжаем работу... Так цикл тоже останавливается, но на наносекунды, а не на милли... Запусти в основном цикле для проверки отсчёт секунд в цикле, а в прирывании опрос кнопки, по нажимай пару десятков раз и увидеть отставание таймера (как при делей).
@ВалентинАндреев-л3т6 жыл бұрын
Djleon_ Leonid прав у вас даже хуже делэй получилось
@UCanDo6 жыл бұрын
Нет, не хуже. Вы же не будете добавлять задержку в цикл, который и так длится целых 300 мс!!! В таких случаях кнопка вешается на прерывание + техническая защита от дребезга (резистор + конденсатор + триггер Шмидта). Djleon_ Leonid, пересмотрите видео еще раз. В прерывании нет никакого +70. Прерывание срабатывает сразу после нажатия кнопки и только 1 раз. Будьте внимательны. P.S. если один цикл программы длится целых 300 мс то программа явно не оптимизированна. Работа с кнопками в такой программе в принципе будет не возможной (даже на прерываниях), так как на любое действие будет тратиться слишком много времени.
@DjleonLeon6 жыл бұрын
Home Made - Хорошо, объясню по другому: есть программа на нулевом прирывании счётчик Гейгера, на втором кнопка меню, с вашим алгоритмом. При нажатии срабатывает прерывание 1 и длится обработка дребезга, тоесть программа считает до 70 в любую сторону, за это время вы теряете много импульсов счётчика, ваша программа работает плохо, если при прирывании от кнопки ничего не считать, а просто сравнить значение счётчика миллисекунд, вы потеряете меньше импульсов (отсчёт 70 сложений дольше, чем операция сравнения) ваша программа будет на много корректнее.
@BRICKonYourHead6 жыл бұрын
Такой программный метод подходит ТОЛЬКО для повелителей светодиода. Для более сложных проектов, с несколькими быстро меняющимися данными на входах будут глюки, и не срабатывания основного цикла кода. И ведь есть хорошая функция на millis(), зачем изобретать велосипед, при этом такой, что по аналогии при повороте руля, полностью тормозится ведущее колесо?
@UCanDo6 жыл бұрын
В чем аналогия? И чем мой пример хуже той же millis и чем он может тормозить программу?
@BRICKonYourHead6 жыл бұрын
А как Вы думаете, во время выполнения отдельной функции, будет ли опрашиваться какие либо входы в основном цикле? Функция хороша тогда, когда от её присутствия не будет вреда, либо когда её наличие не критично влияет на остальной код. Вы же являясь публичным лицом, по сути, этот способ объявляете универсальным, что не есть верно. В отличии от этого, millis() работающая в основном цикле (и естественно без while и прочего) не затормаживает выполнение кода ни на миллисекунду, и выполняется максимум за 2-5 тактов таймера при каждом проходе цикла.
@UCanDo6 жыл бұрын
Простите, но вы так и не сказали чем он хуже. Мой код не тормозит программу. Использование функций делает программу более читабельной и понятной другим, но, опять же, никак не влияет на скорость выполнения. Понятно что подобный подход применим не к медленным программам, где основной код выполняется 300 мс. В таком случае нужно применять прерывание. Я не против применения millis. Но у millis есть один существенный недостаток: отслеживание по времени (не раньше чем прошло определенное время), и тоже необходимо писать какой-то код для антидребезга. По сути паузы (delay и millis) разрешают пользователю нажать кнопку только тогда, когда программа это разрешает, при этом можно забыть про быстрые нажатия, на пример двойное. Я не встречал хорошего кода с использованием millis, где можно было бы полноценно (быстро) использовать кнопку. Если вы встречали хороший код с millis, то пожалуйста, напишите его здесь, или дайте на него ссылку. Это будет полезным всем кто прочтёт.
@BerlogerX4 жыл бұрын
Как подобрана величина емкости конденсатора? Методом тыка?
@UCanDo4 жыл бұрын
Можно рассчитать скорость разряда конденсатора. Но проще поставить на 1 мкф. чем пытаться подобрать емкость под возможную частоту нажатия кнопок.
@СергейНиколаев-у9х6ц4 жыл бұрын
Я обычно выдерживаю короткую временнУю паузу (без delay), перед тем, как считать следующее состояние кнопки.
@UCanDo4 жыл бұрын
Без примера кода сложно догадаться как у вас это реализовано :)
@СергейНиколаев-у9х6ц4 жыл бұрын
@@UCanDo создаём переменную типа unsigned long, присваиваем этой переменной текущее время (millis). Создаём функцию "опроса кнопки", прописываем в ней условие: если текущее время, минус вышеуказанная переменная, меньше например 200 мс, то выходим из функции, не опрашивая состояние кнопки, в противном случае читаем статус кнопки и присваиваем переменной текущее время. Правда не учтён дребезг, когда кнопка продолжительное время в нажатом состоянии и когда контакты уже немного окислившиеся. Я на дверь и в отверстия в косяке, куда входят ригели замка, ставил концевые переключатели, вроде пока норм регистрируют.
подскажите как сделать нажал и отпустил кнопку светодиод загорелся , нажал и отпустил кнопку второй раз светодиод потух , работа по нажатию кнопки + анти-дребезг
@slv85076 жыл бұрын
Как то уж больно сложно все. Опросил кнопку, подождал 10 мс, опросил повторно - и все.
@UCanDo6 жыл бұрын
За эти 10 мс микроконтроллер может сделать много чего. А так получается простаивает. Delay - это зло! :))
@slv85076 жыл бұрын
Согласен, но чаще не хватает выводов, чем быстродействия. Я, например, вешаю на один аналоговый вход несколько кнопок. А как повесить на один пин прерывания несколько кнопок?
@UCanDo6 жыл бұрын
Увы, на прерывание несколько кнопок нельзя установить. Да, я тоже иногда сталкиваюсь с проблемой недостатка выводов МК. Во всех случаях спасала переделка проекта. Как вариант, можно использовать I2C расширитель портов.
@Yupitrer6 жыл бұрын
slv Да, и я так делаю. Ставлю 50мс. Для тех кто считает что 10мс это много то скажу что это время тратится только тогда когда нажать кнопку. Если ее не трогать то оно обходит стороной. Зато код простенький. А на Тини13 место нужно экономить.
@scrypto6 жыл бұрын
Установить несколько кнопок на одно прерывание - можно, проблем никаких нет. Посмотрите видео на моем канале, рассказал пару методов, как это сделать.
@victorbrynev6226 жыл бұрын
14:50 не проще сделать следующее: "создать две переменые, програмную задержку, в проверке указать, если одно значени и пред. значение установились, то есть равны, и время более 0.15-0.33 сек, то значение верное, и идем сравнивать, какая кнопка нажата."?
@UCanDo6 жыл бұрын
Вариантов много. Можно использовать любой, какой больше всего вам подходит.
@victorbrynev6226 жыл бұрын
@@UCanDo , я говорил именно об кнопках на аналоговый.
@romankrv4 жыл бұрын
@Home Made - То, что ты можешь сделать || Покажите, как устранить дребезг на ноутбутчной клавиатуре. У меня на Linovo T440p клавиша Enter совсем с ума сошла.
@UCanDo4 жыл бұрын
Никак. Только заменой клавиатуры.
@Palladln Жыл бұрын
перепаяй кнопку, подпаяй кондер на 3-10 нанофарад, керамику..
@poweredbysergey6 жыл бұрын
Usefull
@БорисЕгоров-у4р2 ай бұрын
If if if три функции подряд. Как понять?
@ВалентинАндреев-л3т6 жыл бұрын
почему прерывание срабатывает только после повторения цикла loop?
@UCanDo6 жыл бұрын
Прерывание срабатывает постоянно. В основном цикле происходит вывод в сериал. Прерывание от loop не зависит
@vyorkin4 жыл бұрын
prev_count от слова previous
@radiotechnician17576 жыл бұрын
беда( блогеры которые юзают ардуино мимоходом решают дребезг.
@UCanDo6 жыл бұрын
А почему беда?
@UCanDo6 жыл бұрын
Понятно. Спасибо
@Gameplayer550556 жыл бұрын
Delay,rs фиксатор , конденсатор
@ЕвгенийМельник-я6в6 жыл бұрын
Нормальные люди кнопки опрашивают по таймеру, внешние прерывания не для этого.
@babichfx Жыл бұрын
6:55 пипец обвязка ради одной кнопки да?!
@cedric69graf5 жыл бұрын
Здравствуйте! Могу я попросить Вас стать моим преподавателем-онлайн. Предложение платное. Тонкости можно обсудить после вашего ответа.
@UCanDo5 жыл бұрын
Добрый день. Я сейчас в отъезде. На два месяца. Все наработки остались дома. Смогу помочь только по приезду.
@cedric69graf5 жыл бұрын
Будем ждать. Спасибо за ответ.@@UCanDo
@UCanDo5 жыл бұрын
Напишите мне где-то после 15-го апреля. Тогда я уже буду дома
@andriuha_m3 жыл бұрын
У меня видимо кнопка вообще изнасилована, мне пришлось выставить не 70 а 500 для нормального срабатывания
@Master_Q2 жыл бұрын
Насколько это надёжное решение?
@UCanDo2 жыл бұрын
Существует много способов для борьбы с дребезгом. Применять можно любой, все зависит от задачи. На счет программного решения - лучшего чем в этом видео я не встречал.
@ВалентинАндреев-л3т6 жыл бұрын
(ты совсем не экономишь память)
@UCanDo6 жыл бұрын
Чем именно? Delay памяти использует гораздо больше. К тому же экономия только ради экономии - это всего лишь трата собственного времени (если, конечно, это не крайне необходимо).
@АлександровичЯ-к5с3 жыл бұрын
Дребезг контактов наблюдается как при нажатии кнопки , так и при её отпускании .
@UCanDo3 жыл бұрын
Да, это так. Но это никак не влияет на код в целом. Так как отслеживается именно нажатие, но при отпускании кнопка в конечном счете оказывается с разомкнутыми контактами, и дребезг при отпускании кнопки отсеивается программно. По крайней мере, за всю мою практику я не сталкивался с проблемой случайных нажатий при отпускании кнопки. И даже не задумывался об этом до вашего Сообщения.
@АлександровичЯ-к5с3 жыл бұрын
@@UCanDo А вот какова длительность паузы между двумя последовательными нажатиями ?
@АлександровичЯ-к5с3 жыл бұрын
@@UCanDo Поправлю вопрос , минимальная длительность паузы !
@UCanDo3 жыл бұрын
Зависит от программной реализации кода кнопки. Я сейчас не у компьютера, код не могу посмотреть и сказать точно.
@UCanDo3 жыл бұрын
Посмотрел видео. При программном отсеивании минимальная пауза между кнопками будем миллисекунды.
@stanislavilchenko33686 жыл бұрын
Вредное видео) Так как во многих моментах оно людей вводит в заблуждение. 1) Проверять кнопку в основном цикле нельзя потому что любые задержки в основном цикле скажутся на кнопке а при добавлении к Ардуине цветного экрана вообще такой код кнопки перестанет работать 2) Подтягивающий резистор в ЖЕЛЕЗНОЙ или ХАРДВАРНОЙ но не технической схеме не нужен, так как чип в Ардуине уже имеет встроенные подтяжки, только они подтягивают к плюсу. 3) более правильный, со всех сторон, способ работы с кнопкой - обрабатывать нажатие и осуществлять фильтрация в прерывании, а этого в видео к сожалению нет.
@UCanDo6 жыл бұрын
хм.. давайте рассмотрим по-порядку. 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 раз при нажатии кнопки } И все отлично работает, без дребезга и без нагрузки МК ненужным кодом
@stanislavilchenko33686 жыл бұрын
Ну, я гуглить вместо Вас не буду. Прерывания доступны и на всех остальных пинах с той лишь разницей что обработчик прерывания идет сразу на весь порт и срабатывает по изменению состояния. Опрос пина, если не по прерыванию по входу, можно повесить на таймер, он будет инициировать прерывание так часто как быстро это нужно но с гарантированной регулярностью. Замечание по резистору было потому что резистор в схеме были и есть лишним, достаточно пин перевести в режим чтения и отправить туда единицу, чтоб будет равнозначно резистору 10к между + и ногой. Обычно комбинируют и конденсаторы и программную фильтрацию, либо делают программный триггер с сбросом по таймеру.
@UCanDo6 жыл бұрын
Прерывания для всего порта ради одной кнопки? А как быть со всем остальным что на этом порте висит? Опрос пина по таймеру - это тот же millis, с той лишь разницей что, да, можно вынести опрос кнопки в отдельную функцию. Но так делать не хорошо. В прерываниях должен выполнятся максимально простой и короткий код, а чтение пина выполняется довольно долго. Значит в прерывании сделать разрешение на чтение, а читать в основном цикле (после разрешения)... и мы вернулись к той же millis. (поправьте если я не прав). Я не против применения millis или, как в данном случае, прерывание по таймеру. Но у таких способов есть один существенный недостаток: отслеживание по времени (не раньше чем прошло определенное время), и тоже необходимо писать какой-то код для антидребезга. По сути паузы (прерывание по таймеру, delay и millis) разрешают пользователю нажать кнопку только тогда, когда программа это разрешает, при этом можно забыть про быстрые нажатия, на пример двойное. На счет гугления - это ведь вы говорите что мой код не верен. Это вам стоит привести хороший пример кода, а то просто спор на тему "что кому нравится". Я привел код. Приведите и вы код для примера. Тогда и можно будет говорить какой вариант лучше, а какой плох. На счет применения r-c цепочки: обязательно нужно ставить триггер шмитта. Если просто конденсатор и резистор (пусть даже внутренний подтягивающий) то на выходе вместо логических "0" и "1" мы получим "волну". У ардуино логический "0" считается когда напряжение ниже 0,8 вольт, единица - когда напряжение выше 2 вольта. Так вот, когда "волна" будет подыматься то между 0,8 вольт 2 вотами пин будет в третьем состоянии, а это то же самое что дребезг кнопки. В быстрых программах подключение конденсатора ни на что не влияет так как будет ловиться это третье состояние. Именно по этому вместе с r-c цепочкой нужно ставить триггер шмитта. Конечно, если программа медленная то такой вариант прокатывает.
@shlemkin4 жыл бұрын
после 15 сек поиска: "Три регистра PCMSK0, PCMSK1 и PCMSK2 (Pin Change Mask Register) используются для указания входов, которым разрешено генерировать сигнал запроса прерывания."... ищите инфу больше 14 секунд!!! таблицу сюдой рисовать, или сами найдете, как конкретным ногам разрешить дергать за pcint прерывания?))
@guliwer17133 жыл бұрын
у меня кнопка подтянута на минус резистором 200 ом и в паралель кнопке сидит конденсатор 0,5 микрофарат и все равно кнопка иногда "сама" нажимается ....
@Relevantium5 жыл бұрын
Одет проще нормальные кнопки купить?
@UCanDo5 жыл бұрын
Все кнопки без исключения имеют дребезг. Не существует кнопок, которые бы не производили помехи.
@decoratorr6 жыл бұрын
Четко объясняешь)
@algisshaulis88786 жыл бұрын
Нет там ни нуля, ни +5 вольт. Есть уровни логической ЕДИНИЦЫ и логического НУЛЯ. Дребезга кнопки не бывает, как и дёргание выключателя :) Эффект называется ДРЕБЕЗГ КОНТАКТОВ. Ну и прерывание на кнопку это моветон, ещё не дай бог с задержками.
@ЄвгенПритула3 жыл бұрын
Погано кнопку прямо на кондюк вішати.
@amid62292 жыл бұрын
Да во многих схемах так и делают и ничего! Правда ёмкости используют более адекватные (100 nF). Решил погуглить схемы (для примера взял какой-то монитор HP), так там в схеме между кнопками и конденсатором обведена красным область и отмечено, что в правке такой то резисторы R209-R212 номиналом 470 ohm удалены. Решили начать экономить? Или они просто там даром не нужны?
@UCanDo2 жыл бұрын
В большинстве случаев можно обойтись «малой кровью», без резисторов. Но с ними надежнее.
@amid62292 жыл бұрын
@@UCanDo Ну… Возьмём внутренний резистор подтяжки 20 кОм (STM32), кондей замыкаемый на кнопку 0.1 микрофарада. Он будет заряжаться до логической единицы 2 миллисекунды (при этом 0.8 миллисекунды будет гарантированно ниже логического нуля). Т.е. если между импульсами менее 1 мс, то они отфильтруются, а срабатывание будет по первому импульсу. А вот при отпускании, срабатывание будет через 2 мс. Если же добавить резистор между конденсатором и кнопкой, то добавится и задержка перед нажатием (что может быть не приятным, когда кнопка работает в качестве концевика). Да и энергии (особенно при напряжении 3.3 В) в конденсаторе 0.1 микрофарад не хватит чтобы как-то навредить контактам. Раньше механический и химический (от влажности и воздуха) износ наступят чем от разрядов конденсатора… Проблема от использования внутренних подтяжек может возникнуть только при длинных проводниках, особенно если они идут в параллель с силовыми.