Азы - debounce

godForgottenBeginner
Offline
Зарегистрирован: 12.09.2017

Добрый день, недавна начал изучать ардуино по книге Джеремми Блума. Повторно вернулся к теме дребезга контактов, хочу попросить разъеснения простым языком следующей части кода...

 

Вот весь супер код дебоунса :

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. 

 

Буду рад за понятное разъеснение.

 

Коментарии типа "ЛОХ это ж просто" прошу писать более развёрнуто. 

godForgottenBeginner
Offline
Зарегистрирован: 12.09.2017

разъяснения*

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

delay(5); // ждём затухание дребезга

это Блум такому гавну учит?

смотри тут про дребезг https://github.com/Klapautsiy/titanium-bicycle-for-button/wiki

подробнее здесь https://github.com/Klapautsiy/titanium-bicycle-for-button/blob/master/Click.h 114-я строка.

 

Logik
Offline
Зарегистрирован: 05.08.2014

godForgottenBeginner пишет:

Коментарии типа "ЛОХ это ж просто" прошу писать более развёрнуто. 

ОК. Разверну. Очевидно вопрос идет о 26 строке, ну понятно загадки любят все, но искать нужную строку по содержимому не интересн. Очевидно Вы считаете это тривиально простым. Допустим, но тогда какого перца Вы не поискали где еще в коде встречается это самое currentButton, которое в стр.26 присваеваем переменной "currentButton" значение вызываемой функции "debounce. Там к коменту просто добавит нечего. А встречается currentButton аж два раза в 27 и 31 строках. Причем в 31 currentButton сохраняется в lastButton.

Теперь смотрим стр 27. Проверка условия.  lastButton в котором сохранено значение currentButton из предыдущего цикла должно быть низким а свеженькое currentButton - уже высоким. А что это вместе и одновременно может означать еще кроме как изменения состояния входного сигнала с низкого на высокий?! Что в коментах откровенно и написано. Ну и кто Вы после этого?

ПС. Я эту книгу не читал. Пример мне не понравился. Вопервых тема борьбы с дребезгом - плохая, проблема сильно надуманая. Во вторых подход с делеем для формирования временных интервалов сильно плох, заслужено заплеван на форуме. Выучившись писать так прийдется переучиватся, причем сильно "поперек" этого подхода. Переворачивать мозги трудней чем сразу учится правильному.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Logik пишет:

Вопервых тема борьбы с дребезгом - плохая, проблема сильно надуманая.

да, но зачем тогда практически во всех серийных бытовых приборах с плёночными или резиновыми кнопками стоят задержки срабатывания чуть ли не по 400 миллисекунд?

Logik
Offline
Зарегистрирован: 05.08.2014

Действительно, зачем?! Вот даже  и на клавиатуре есть. И я её ща уберу  до нуля........ОООООООООККККККККК....ППППоооооллллллуууччччииииииллллооосььььь.... ввввввеееееррррррррррнуууууууу ввввввв зззззззаааааадддддд. 

Можете сами убедится. Эта задержка только мешает и снижает скорость ввода ;) Только был ли это дребезг?;)

ПС. Эту тему ТС создал чтоб о его лоховстве писали, а не о лоховстве Клапауция, не флудь, о твоем лоховстве тут тем хватает.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Logik пишет:

ПС. Эту тему ТС создал чтоб о его лоховстве писали, а не о лоховстве Клапауция, не флудь, о твоем лоховстве тут тем хватает.

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

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Logik пишет:

Только был ли это дребезг?;)

не - это не дребезг. это, сцуко, утка.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

godForgottenBeginner пишет:
Добрый день, недавна начал изучать ардуино по книге Джеремми Блума. Повторно вернулся к теме дребезга контактов, хочу попросить разъеснения простым языком следующей части кода...
 

Опять этот Джеремми Блум. Изучение программирование по нему это очень хитрая диверсия или заговор. Это как учить математику римскими  цифрами или славянскими знаками. Мол раз они появились раньше, то и новичкам следует начинать с них. 

 Теперь по теме. Для чего нужны кнопки. Разумеется управлять устройством. Но если в схемотехнике это понятно. Нажал кнопку , потек ток, зажглась лампочка. По в программировании в использовании кнопок народ тупит по черному. Нажатие кнопки прежде всего должна вызывать функцию сделать что-то. Чаще всего однократное нажатие должно вызывать однократное действие. Но из-за того что кнопка механическая, и контакт дребезжит, то идет серия импульсов при нажатии и серия импульсов при отжатии. Вот и получается что однократное нажатие вызывает несколько раз функции обрабатывающие это нажатие.  Поэтому если вы начались бороться с дребезгом , то определите вначале программа дожна сделать в случае нажатия кнопки. Опять же у кнопки может как минимум 4 события - кнопка нажата, кнопка отжата , кнопка только что нажата и кнопка только что отжата. И это еще не все. 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

qwone пишет:

Опять же у кнопки может как минимум 4 события - кнопка нажата, кнопка отжата , кнопка только что нажата и кнопка только что отжата. И это еще не все. 

[разжигает в пыточном камине огонь и аккуратно раскладывает в нём крючья]

*только что - это когда?

Logik
Offline
Зарегистрирован: 05.08.2014

qwone пишет:

 Опять же у кнопки может как минимум 4 события - кнопка нажата, кнопка отжата , кнопка только что нажата и кнопка только что отжата. И это еще не все. 

Нет. Здесь 2 события и 2 состояния.

Кнопку нажимает человек. И его возможности и желания ограничены. Он не может нажимать кнопку чаще 200мсек и удерживать её менее 100мсек. Потому проверять её часто, чаще 20-50мсек безсмыслено. Как только этот факт приймете - дребезг перестанет обнаруживатся вобще. Пишите софт грамотно - и о дребезге узнаете только из сочинений теоретиков. Мал того, сформировав интервал опроса кнопок допустим в 50мсек все остальные интервалы работы с клавой формируются уже не в мсек а в интервалах опроса, т.е. вместо 500мсек до повтора обработки нажатия будет 10 интервалов опроса. Что явно компактней хранить и считать. Приучайтесь к красивому, удобному и простому.

// Чаще всего однократное нажатие должно вызывать однократное действие.

Да. А длительное удержание - многократный повтор действия. Перед вами клавиатура, повторяем функционал, зачем выдумывать велосипед. Обнаружилось нажатие - выполняем действие а нажатость кнопки просто игнорим полсекунды, затем если все еще нажата - повторяем действие, а после него снова игнорим кнопку, но уже 200мсек и т.д. Нажать и удержать куда полезней чем долбить. Особенно в навигации по меню, регулировке уровней, управлении механизмами и др. типичных применениях. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Мужики, но вопрос-то вовсе не про дребезг. Вопрос чисто синтаксический, он мог возникнуть и по любому другому поводу.

godForgottenBeginner пишет:

c понять зачем вот тут:
void loop() {
  currentButton = debounce(lastButton);                                              // присваеваем переменной "currentButton" значение вызываемой функции "debounce"

к значению функции debounce в скобках как бы дано значение lastButton. 

Что значит "как бы дано"? Функции передаётся параметр. Читайте ситанксис вызова функций, и вообще начинайте изучать программирование не с Блюма, а с простой книжки по языку программирования. Блюм предполагает, что основы языка читатель уже знает.

godForgottenBeginner
Offline
Зарегистрирован: 12.09.2017

Мало кто понял в чем вопрос был...

godForgottenBeginner
Offline
Зарегистрирован: 12.09.2017

Я понял тут ключ к пониманию в синтаксисе вызова функции, если не трудно подскажите от чего мне оталкиваться, потому что другие ребята не поняли в чём вообще мой вопрос был начали обвинять Блюма в заговоре против нубов программистов. А синтаксис я параллельно учу.

Logik
Offline
Зарегистрирован: 05.08.2014

О госпадзи.... Во время работы debounce переменная last  имеет значение какое было у lastButton на момент вызова debounce(lastButton). Мы тут о высоком ...

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Logik пишет:

Кнопку нажимает человек. И его возможности и желания ограничены. Он не может нажимать кнопку чаще 200мсек и удерживать её менее 100мсек. Потому проверять её часто, чаще 20-50мсек безсмыслено. Как только этот факт приймете - дребезг перестанет обнаруживатся вобще. Пишите софт грамотно - и о дребезге узнаете только из сочинений теоретиков. 

Logik, ну снова ты за рыбу деньги - ладно бы ты свои аргументы в пользу уменьшения частоты опроса кнопок для борьбы с дребезгом подкреплял фактами из реальности, но - нет. ты пытаешься натянуть сову на глобус.

так:

Logik пишет:

Кнопку нажимает человек.

false - не всегда человек.

Logik пишет:

Он(человек) не может нажимать кнопку чаще 200мсек и удерживать её менее 100мсек.

false - может чаще и менее.

Logik пишет:

Потому проверять её часто, чаще 20-50мсек безсмыслено.

false - когда один интервал опроса считает пик дребезга, а второй уже устаканившееся состояние нажатия, сколько было нажатий?

*про кнопку, плавно превращающуюся в клаву в процессе дискуссии - не вижу смысла комментировать.

 

godForgottenBeginner
Offline
Зарегистрирован: 12.09.2017

Ответить на вопрос человеку? В обсуждении которое он создал для получения ответа на этот вопрос? Да пошол он на *** *** *****ная. Лучше покажу какой я умный какой я мудрый какой я ****ный. 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

godForgottenBeginner пишет:

Ответить на вопрос человеку? В обсуждении которое он создал для получения ответа на этот вопрос? Да пошол он на *** *** *****ная. Лучше покажу какой я умный какой я мудрый какой я ****ный. 

тебе ответили и в частности, и в общем - шо ты ещё хочешь?

голых баб с караваями и в кокошниках не будет - только брутальные радиомонтажники.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

godForgottenBeginner пишет:

Ответить на вопрос человеку? В обсуждении которое он создал для получения ответа на этот вопрос? Да пошол он на *** *** *****ная. Лучше покажу какой я умный какой я мудрый какой я ****ный. 

Вам был дан ответ "здесь функции передётся параметр".

Какого ответа Вы ещё ждёте? Другого не будет, т.к. его просто не существует в природе.

На случай, если Вам этот ответ непонятен, был дан совет: "начните с чтения простой книжки по языку программирования".

Не вижу, чем ещё можно Вам помочь.

Logik
Offline
Зарегистрирован: 05.08.2014

Клапауций 112 пишет:

..ладно бы ты свои аргументы в пользу уменьшения частоты опроса кнопок для борьбы с дребезгом подкреплял фактами из реальности, но - нет. 

А от тебя какие факты, кроме твоего неумения писать код, приведены? только дрыст непрерывный 

Клапауций 112 пишет:

Logik пишет:

Кнопку нажимает человек.

false - не всегда человек.

Иногда свинья рылом может или дятел клювом. Но на использование кнопки тобой, Клапауций, при написании софта ориентироватся не стоит ;)

 

Клапауций 112 пишет:

Logik пишет:

Он(человек) не может нажимать кнопку чаще 200мсек и удерживать её менее 100мсек.

false - может чаще и менее.

Гыыы!! Видео в студию где ты долбеш кнопку с частотой выше 5 Гц в студию!!! Народ нуждается в зрелищах, показуй долбодятла ))) Как ты там писал "подкреплял фактами из реальности" - самое время тебе продемонстрировать.

Клапауций 112 пишет:

Logik пишет:

Потому проверять её часто, чаще 20-50мсек безсмыслено.

false - когда один интервал опроса считает пик дребезга, а второй уже устаканившееся состояние нажатия, сколько было нажатий?

 

 

То, что ты тупой - не новость, но чтоб такие вопросы задавать... Отвечаю - одно нажатие ;)

 

Клапауций 112 пишет:

не вижу смысла комментировать.

Нее, не спрыгивать!! Видео ВЧ долбания кнопки даффай. Потом свалиш нах.. А ща к ноге! зрелища требую! 

 

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

не понимаю, насколько нужно быть упоротым, что бы наложить такую кучу кирпича и построить пирамиду своей глупости.

итак:

Клапауций 112 пишет:

Logik пишет:

Он(человек) не может нажимать кнопку чаще 200мсек и удерживать её менее 100мсек.

false - может чаще и менее.

Логик говорит, что "не может чаще и менее" - я подтверждаю фактами, что может чаще и менее.

итак: здесь GitHub у меня есть демка логического блока кнопки, где каждый желающий может убедиться, что можно нажимать кнопку укладываясь в два периода опроса хтмл-странички яваскриптом(120 миллисекнуд) и удерживать кнопку не более одного опроса(60 миллисекунд).

частота опроса кнопки яваскриптом: 60 миллисекунд.

*масштабирование графика : выделить мышью интересующий участок графика по горизонтали - растянется. два раза щёлкнуть мышью в график - вернётся к 1:1.

картинко, кому лень нажимать кнопку и расшифровка графиков: жёлтый - кнопка, сиреневенький - событие нажатия кнопки. ширина сиреневенького пика 60 миллисекунд - для оценки временного масштаба.

godForgottenBeginner
Offline
Зарегистрирован: 12.09.2017

Всем спасибо за ответы. Правда спасибо.