Азы - debounce
- Войдите на сайт для отправки комментариев
Втр, 19/09/2017 - 00:06
Добрый день, недавна начал изучать ардуино по книге Джеремми Блума. Повторно вернулся к теме дребезга контактов, хочу попросить разъеснения простым языком следующей части кода...
Вот весь супер код дебоунса :
const int LED=9; // задаём значение контакта const int BUTTON=2; // задаём значение контакта boolean lastButton = LOW; // задаём переменную boolean currentButton = LOW; // задаём переменную boolean ledOn = false; // задаём переменную void setup() { pinMode (LED, OUTPUT); pinMode (BUTTON, INPUT); } boolean debounce(boolean last) // создаём функцию устранения дребезга типа "булиан" с присваевоемой переменной last определяющей её значение { boolean current = digitalRead(BUTTON); // присваеваем переменной current значения с пина кнопки if (last != current) // сравниваем текущее и предидущее если не равно значит возможно есть нажатие { delay(5); // ждём затухание дребезга current = digitalRead(BUTTON); // повторно считываем устоявшееся значение return current; // возвращаем (присваеваем) значение current значению основной функции т.е. переменной last } } void loop() { currentButton = debounce(lastButton); // присваеваем переменной "currentButton" значение вызываемой функции "debounce" if (lastButton == LOW $$ currentButton == HIGH) // если предидущее значение было "LOW" и текущее "HIGH" то { ledOn = !ledOn; // инвертируем значение ledOn } lastButton = currentButton; // "переводим" текущее значение в прошлое значение digitalWrite(LED, ledOn); // Присваиваем пину LED значение ledOn }
Помогите понять зачем вот тут:
void loop() { currentButton = debounce(lastButton); // присваеваем переменной "currentButton" значение вызываемой функции "debounce"
к значению функции debounce в скобках как бы дано значение lastButton.
Буду рад за понятное разъеснение.
Коментарии типа "ЛОХ это ж просто" прошу писать более развёрнуто.
разъяснения*
delay(5);
// ждём затухание дребезга
это Блум такому гавну учит?
смотри тут про дребезг https://github.com/Klapautsiy/titanium-bicycle-for-button/wiki
подробнее здесь https://github.com/Klapautsiy/titanium-bicycle-for-button/blob/master/Click.h 114-я строка.
Коментарии типа "ЛОХ это ж просто" прошу писать более развёрнуто.
ОК. Разверну. Очевидно вопрос идет о 26 строке, ну понятно загадки любят все, но искать нужную строку по содержимому не интересн. Очевидно Вы считаете это тривиально простым. Допустим, но тогда какого перца Вы не поискали где еще в коде встречается это самое currentButton, которое в стр.26 присваеваем переменной "currentButton" значение вызываемой функции "debounce. Там к коменту просто добавит нечего. А встречается currentButton аж два раза в 27 и 31 строках. Причем в 31 currentButton сохраняется в lastButton.
Теперь смотрим стр 27. Проверка условия. lastButton в котором сохранено значение currentButton из предыдущего цикла должно быть низким а свеженькое currentButton - уже высоким. А что это вместе и одновременно может означать еще кроме как изменения состояния входного сигнала с низкого на высокий?! Что в коментах откровенно и написано. Ну и кто Вы после этого?
ПС. Я эту книгу не читал. Пример мне не понравился. Вопервых тема борьбы с дребезгом - плохая, проблема сильно надуманая. Во вторых подход с делеем для формирования временных интервалов сильно плох, заслужено заплеван на форуме. Выучившись писать так прийдется переучиватся, причем сильно "поперек" этого подхода. Переворачивать мозги трудней чем сразу учится правильному.
Вопервых тема борьбы с дребезгом - плохая, проблема сильно надуманая.
да, но зачем тогда практически во всех серийных бытовых приборах с плёночными или резиновыми кнопками стоят задержки срабатывания чуть ли не по 400 миллисекунд?
Действительно, зачем?! Вот даже и на клавиатуре есть. И я её ща уберу до нуля........ОООООООООККККККККК....ППППоооооллллллуууччччииииииллллооосььььь.... ввввввеееееррррррррррнуууууууу ввввввв зззззззаааааадддддд.
Можете сами убедится. Эта задержка только мешает и снижает скорость ввода ;) Только был ли это дребезг?;)
ПС. Эту тему ТС создал чтоб о его лоховстве писали, а не о лоховстве Клапауция, не флудь, о твоем лоховстве тут тем хватает.
ПС. Эту тему ТС создал чтоб о его лоховстве писали, а не о лоховстве Клапауция, не флудь, о твоем лоховстве тут тем хватает.
так, не я же утверждаю, что программно фильтровать дребезг плохая идея - нужно донести сию гениальную мысль до мировых производителей кнопочных девайсов, предварительно запатентовав.
Только был ли это дребезг?;)
не - это не дребезг. это, сцуко, утка.
Опять этот Джеремми Блум. Изучение программирование по нему это очень хитрая диверсия или заговор. Это как учить математику римскими цифрами или славянскими знаками. Мол раз они появились раньше, то и новичкам следует начинать с них.
Теперь по теме. Для чего нужны кнопки. Разумеется управлять устройством. Но если в схемотехнике это понятно. Нажал кнопку , потек ток, зажглась лампочка. По в программировании в использовании кнопок народ тупит по черному. Нажатие кнопки прежде всего должна вызывать функцию сделать что-то. Чаще всего однократное нажатие должно вызывать однократное действие. Но из-за того что кнопка механическая, и контакт дребезжит, то идет серия импульсов при нажатии и серия импульсов при отжатии. Вот и получается что однократное нажатие вызывает несколько раз функции обрабатывающие это нажатие. Поэтому если вы начались бороться с дребезгом , то определите вначале программа дожна сделать в случае нажатия кнопки. Опять же у кнопки может как минимум 4 события - кнопка нажата, кнопка отжата , кнопка только что нажата и кнопка только что отжата. И это еще не все.
Опять же у кнопки может как минимум 4 события - кнопка нажата, кнопка отжата , кнопка только что нажата и кнопка только что отжата. И это еще не все.
[разжигает в пыточном камине огонь и аккуратно раскладывает в нём крючья]
*только что - это когда?
Опять же у кнопки может как минимум 4 события - кнопка нажата, кнопка отжата , кнопка только что нажата и кнопка только что отжата. И это еще не все.
Нет. Здесь 2 события и 2 состояния.
Кнопку нажимает человек. И его возможности и желания ограничены. Он не может нажимать кнопку чаще 200мсек и удерживать её менее 100мсек. Потому проверять её часто, чаще 20-50мсек безсмыслено. Как только этот факт приймете - дребезг перестанет обнаруживатся вобще. Пишите софт грамотно - и о дребезге узнаете только из сочинений теоретиков. Мал того, сформировав интервал опроса кнопок допустим в 50мсек все остальные интервалы работы с клавой формируются уже не в мсек а в интервалах опроса, т.е. вместо 500мсек до повтора обработки нажатия будет 10 интервалов опроса. Что явно компактней хранить и считать. Приучайтесь к красивому, удобному и простому.
// Чаще всего однократное нажатие должно вызывать однократное действие.
Да. А длительное удержание - многократный повтор действия. Перед вами клавиатура, повторяем функционал, зачем выдумывать велосипед. Обнаружилось нажатие - выполняем действие а нажатость кнопки просто игнорим полсекунды, затем если все еще нажата - повторяем действие, а после него снова игнорим кнопку, но уже 200мсек и т.д. Нажать и удержать куда полезней чем долбить. Особенно в навигации по меню, регулировке уровней, управлении механизмами и др. типичных применениях.
Мужики, но вопрос-то вовсе не про дребезг. Вопрос чисто синтаксический, он мог возникнуть и по любому другому поводу.
к значению функции debounce в скобках как бы дано значение lastButton.
Что значит "как бы дано"? Функции передаётся параметр. Читайте ситанксис вызова функций, и вообще начинайте изучать программирование не с Блюма, а с простой книжки по языку программирования. Блюм предполагает, что основы языка читатель уже знает.
Мало кто понял в чем вопрос был...
Я понял тут ключ к пониманию в синтаксисе вызова функции, если не трудно подскажите от чего мне оталкиваться, потому что другие ребята не поняли в чём вообще мой вопрос был начали обвинять Блюма в заговоре против нубов программистов. А синтаксис я параллельно учу.
О госпадзи.... Во время работы
debounce
переменнаяlast
имеет значение какое было уlastButton
на момент вызоваdebounce(lastButton)
. Мы тут о высоком ...Кнопку нажимает человек. И его возможности и желания ограничены. Он не может нажимать кнопку чаще 200мсек и удерживать её менее 100мсек. Потому проверять её часто, чаще 20-50мсек безсмыслено. Как только этот факт приймете - дребезг перестанет обнаруживатся вобще. Пишите софт грамотно - и о дребезге узнаете только из сочинений теоретиков.
Logik, ну снова ты за рыбу деньги - ладно бы ты свои аргументы в пользу уменьшения частоты опроса кнопок для борьбы с дребезгом подкреплял фактами из реальности, но - нет. ты пытаешься натянуть сову на глобус.
так:
Кнопку нажимает человек.
false - не всегда человек.
Он(человек) не может нажимать кнопку чаще 200мсек и удерживать её менее 100мсек.
false - может чаще и менее.
Потому проверять её часто, чаще 20-50мсек безсмыслено.
false - когда один интервал опроса считает пик дребезга, а второй уже устаканившееся состояние нажатия, сколько было нажатий?
*про кнопку, плавно превращающуюся в клаву в процессе дискуссии - не вижу смысла комментировать.
Ответить на вопрос человеку? В обсуждении которое он создал для получения ответа на этот вопрос? Да пошол он на *** *** *****ная. Лучше покажу какой я умный какой я мудрый какой я ****ный.
Ответить на вопрос человеку? В обсуждении которое он создал для получения ответа на этот вопрос? Да пошол он на *** *** *****ная. Лучше покажу какой я умный какой я мудрый какой я ****ный.
тебе ответили и в частности, и в общем - шо ты ещё хочешь?
голых баб с караваями и в кокошниках не будет - только брутальные радиомонтажники.
Ответить на вопрос человеку? В обсуждении которое он создал для получения ответа на этот вопрос? Да пошол он на *** *** *****ная. Лучше покажу какой я умный какой я мудрый какой я ****ный.
Вам был дан ответ "здесь функции передётся параметр".
Какого ответа Вы ещё ждёте? Другого не будет, т.к. его просто не существует в природе.
На случай, если Вам этот ответ непонятен, был дан совет: "начните с чтения простой книжки по языку программирования".
Не вижу, чем ещё можно Вам помочь.
..ладно бы ты свои аргументы в пользу уменьшения частоты опроса кнопок для борьбы с дребезгом подкреплял фактами из реальности, но - нет.
А от тебя какие факты, кроме твоего неумения писать код, приведены? только дрыст непрерывный
Кнопку нажимает человек.
false - не всегда человек.
Иногда свинья рылом может или дятел клювом. Но на использование кнопки тобой, Клапауций, при написании софта ориентироватся не стоит ;)
Он(человек) не может нажимать кнопку чаще 200мсек и удерживать её менее 100мсек.
false - может чаще и менее.
Гыыы!! Видео в студию где ты долбеш кнопку с частотой выше 5 Гц в студию!!! Народ нуждается в зрелищах, показуй долбодятла ))) Как ты там писал "подкреплял фактами из реальности" - самое время тебе продемонстрировать.
Потому проверять её часто, чаще 20-50мсек безсмыслено.
false - когда один интервал опроса считает пик дребезга, а второй уже устаканившееся состояние нажатия, сколько было нажатий?
То, что ты тупой - не новость, но чтоб такие вопросы задавать... Отвечаю - одно нажатие ;)
не вижу смысла комментировать.
Нее, не спрыгивать!! Видео ВЧ долбания кнопки даффай. Потом свалиш нах.. А ща к ноге! зрелища требую!
не понимаю, насколько нужно быть упоротым, что бы наложить такую кучу кирпича и построить пирамиду своей глупости.
итак:
Он(человек) не может нажимать кнопку чаще 200мсек и удерживать её менее 100мсек.
false - может чаще и менее.
Логик говорит, что "не может чаще и менее" - я подтверждаю фактами, что может чаще и менее.
итак: здесь GitHub у меня есть демка логического блока кнопки, где каждый желающий может убедиться, что можно нажимать кнопку укладываясь в два периода опроса хтмл-странички яваскриптом(120 миллисекнуд) и удерживать кнопку не более одного опроса(60 миллисекунд).
частота опроса кнопки яваскриптом: 60 миллисекунд.
*масштабирование графика : выделить мышью интересующий участок графика по горизонтали - растянется. два раза щёлкнуть мышью в график - вернётся к 1:1.
картинко, кому лень нажимать кнопку и расшифровка графиков: жёлтый - кнопка, сиреневенький - событие нажатия кнопки. ширина сиреневенького пика 60 миллисекунд - для оценки временного масштаба.
Всем спасибо за ответы. Правда спасибо.