класс титановый велосипед для тактовой кнопки.
- Войдите на сайт для отправки комментариев
Чт, 06/08/2015 - 20:46
класс титановый велосипед для тактовой кнопки.
фильтр дребезга, отслеживание событий: нажатие, отпускание, двойное нажатие(doubleclick), нажато и удерживается в течении определённого времени, отпущено и неактивно в течении определённого времени.
пример, объясняющий отличия работы с кнопкой классическим способом и с использованием предложенного класса:
пример скетча с использованием класса:
UPD: упустил из вида очевидное - надеюсь, ползателям ясно, что эти переменные можно настраивать по своему хотению:
07
//================================================================
08
static
const
byte
bounce_ = 50;
// длительность отслеживания дребезга.
09
static
const
byte
doubleclick_ = 200;
// длительность отслеживания двойного клика.
10
static
const
unsigned
long
timer_ = 5000;
// длительность отслеживания неактивности.
11
static
const
unsigned
int
retention_ = 2000;
// длительность отслеживания нажатия и удержания.
12
//================================================================
Щас 10-ка ставится, потому много не напишу с телефона, но
Имена локальных переменных - мама роди меня обратно. Автор через неделю забудет что это и для чего. Для либы - это смерть. Утрирую, но так и есть, имена переменных должны пониматься без переводчика. Далее, все, что есть в классе имеет доступ public. Блджад, так нельзя. Нужно исходить из мысли, что члены класса не должны меняться снаружи никогда, только методами set и т.п. А щас, что хочу, то и ворочу. Это неправильно.
private - все, что никто не увидит. protected - это увидят только здесь и в порождённое классе. public - увидят все. Типа так
Огромное человеческое спасибо за данный класс. В своем новом проекте(новый контроллер для пивоварни) я полностью использую события данного класса.
Проект на стадии 50% готовности, кому интересно код прилагаю.
Проект разбит на 6 файлов.
попробовал и я велосипед
при двойном клике или удержании кнопки одиночное нажатие всё равно срабатывает, что иногда не приемлемо
при двойном клике или удержании кнопки одиночное нажатие всё равно срабатывает, что иногда не приемлемо
в версии Дуино ИДЕ arduino-1.6.6 класс можно подключить как библиотеку:
схема подключения кнопки некоторым ползателям класса оказалась неочевидной - прилагаю расово правильную схему
если эта схема расово правильная, то почему большинство схем в гугле не имеют сопротивления R1? На что оно влияет?
Резистор ограничивает ток через контакты кнопки при её нажимании.
Смотреть про второй закон коммутации:
https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D1%8B_%D0%B2_%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%86%D0%B5%D0%BF%D1%8F%D1%85
Хотя при 0.1 без резистора будет и не смертельно для кнопки...... какое-то время......
Поставьте для "пробы" 2200.0 - могут и контакты "свариться"
если эта схема расово правильная, то почему большинство схем в гугле не имеют сопротивления R1? На что оно влияет?
*большинство схем в гугле имеют сиськи.
R1 , если:
1. если ты по запарке что-то не то зальёшь в дуино и пин у тебя окажется оутпут.
2. см. #128
отлично. Беру на вооружение.
и еще один дурацкий вопрос - а конденсатор зачем? от скачков напряжения?
он забирает на себя дребезг контактов. Кое-что, конечно, прорывается, но для МК все же легче.
алгоритм борьбы с дребезгом, используемый в класс титановый велосипед для тактовой кнопки.
в версии Дуино ИДЕ arduino-1.6.6 класс можно подключить как библиотеку:
*работает только в версии arduino-1.6.7
что бы работало в версиях младше вплоть до Arduino 1.0, нужно в код #1 добавить первой строкой
**проверяем.
Попробовал класс, понравилось. Но я так и не догнал как сделать повторяющиеся нажатия?
Но я так и не догнал как сделать повторяющиеся нажатия?
после нажатия кнопки, повторяешь действие.
а можно сделать, чтобы при даблклике не выполнялось действие одного клика (т.е. поставить небольшую задержку одиночного нажатия, и если обнаружено двойное нажатие, то не выполнять действие по одиночному нажатию)?
а можно сделать, чтобы при даблклике не выполнялось действие одного клика (т.е. поставить небольшую задержку одиночного нажатия, и если обнаружено двойное нажатие, то не выполнять действие по одиночному нажатию)?
а, можно у тебя узнать алгоритм предсказания действий пользователя кнопки и попросить тебя прочитать топик полностью или начиная отсюда #100 ?
Только вот одно не понятно, почему на хорошую вещь сначала пытаются нагадить.
жёстким БДСМпричинно-следственными связями.3. всё оказалось совсем не так, как на самом деле.
желающим познать дзен - странный диалог Клапауций&Logik начало отсюда #62
*подписчикам, срочно отписаться - титановый велосипед подготавливается к переплавке в титановый костыль на три кнопки. :D
делаю зарядное для LI-Io и Ni-Mh ...
в контексте обсуждения класс титановый велосипед для тактовой кнопки. - эта информация не имеет значения и впредь прошу не засорять тему схемами и другими фактами автобиографии, не относящимися в обсуждению работы и практическому применению класс титановый велосипед для тактовой кнопки.
1. Подскажите, плз, где глянуть примеры с разными действиями на разное количество нажатий кнопки?
заведи переменную, считающую количество нажатий кнопки - будешь что-то делать не просто по условию нажатия, а по условию нажатия и значения этой переменной.
т.е.:
2. Как организовать запрет опроса кнопки после того, как процесс будет запущен, т.е. на РВ3( Ардуино 2) будет лог 1 и Тини 13 не должна реагировать на нажатие кнопки.
#4
if (!условие) {BUTTON_01.read();}
// обновляем состояние переменных кнопки BUTTON_01.
При паузе между нажатиями более 5 сек, фиксируется последнее состояние портов, которое можно изменить следующим нажатием кнопки (если на порту РВ3 лог 0).
здесь не понятно - последнее состояние фиксируется в момент изменения состояния и сохраняется навсегда до следующего события изменения состояния и никак не зависит от времени.
если ты желаешь сбросить счётчик нажатий, то выше в примере реализовано. и настраивается
ооооо! Клапауций 232, гораздо понятнее стало.
спасибо!
а про тему я понял что ошибся, да уже ничё не исправить.
Клапацуй 232, попробовал Ваш класс (после того как в своём обнаружил баг (при создании более одного экземпляра класса защита от дребезга не производится, в данный момент ищу причину).
Использовал для проверки следующий код
К удевлению задержку между нажатием кнопки и реакцией на неё в течении длительности отслеживания дребезга я не обнаружил. В чем может быть проблемма? Код класса взят из поста #1.
К удевлению задержку между нажатием кнопки и реакцией на неё в течении длительности отслеживания дребезга я не обнаружил. В чем может быть проблемма? Код класса взят из поста #1
для обнаружения реакции на дребезг нужно симулировать ситуацию дребезга - нажатия кнопки чаще, чем
static
const
byte
bounce_
:для проверки вручную и визуально установи
static
const
byte
bounce_ = 1000;
// длительность отслеживания дребезга.
нажатия реже, чем один раз в секунду у тебя будут отрабатываться - чаще, чем один раз в секунду будут игнорироваться.
или сгенери аппаратным образом нажатие кнопки чаще, чем
static
const
byte
bounce_ = 50
при дефолтных настройках класса, если владеешь осциллографом.*код класса работает по следующему алгоритму - если время между нажатиями кнопки меньше
static
const
byte
bounce_
, то событие считается дребезгом и игнорируются, если больше, то нажатием и отрабатывается немедленно.** начиная отсюда #173 пытаюсь объяснить, почему так, а не иначе.
Провел эксперимент. Если на вход пина кнопки подавать прямоугольные импульсы (имитация дребезга) на выходе класса должны видеть 0.
Начал с 50Гц и снижал частоту до 10Гц, и Ваш и мой класс отработали одинаково, вплоть до 11Гц на выходе у них ничего небыло, а вот на 10Гц и Ваш и мой начал переодически устанавливать выход т.к. длина импульса при частоте 10Гц около 50мс.
Так что оба решения состоятельны.
Так что оба решения состоятельны.
как же состоятельны, если
далее, я тебе объяснил, что бабушку хоронят потому, что она умерла, а не потому, что выкопана могила.
Тогда лично я не очень понял, зачем Вы текст тут разместили, если юзать будете сами? Чтобы не забыть? Или все таки для того, чтобы им могли пользоваться другие? Если второй вариант, то тогда надо позаботится об удобстве будущих пользователей и добавить в описание класа одну строчку private: в нужном месте, а не становится в позицию оскорбленного справедливой критикой.
Тогда лично я не очень понял, зачем Вы текст тут разместили, если юзать будете сами? Чтобы не забыть? Или все таки для того, чтобы им могли пользоваться другие? Если второй вариант, то тогда надо позаботится об удобстве будущих пользователей и добавить в описание класа одну строчку private: в нужном месте, а не становится в позицию оскорбленного справедливой критикой.
и, кто мне это переведёт на русский язык?
кому я снова недодал личного внимания или недостаточно убедительно послал в пень?
Боюсь Вас огорчить, но послать меня достаточно убедительно в пень Вам удасться лет через 15-20 занятий встроенным программированием.
Есть такая очаровательная фраза "В Уставе караульной службы каждая строчка написана кровью людей, которые пытались делать по своему". Вы, похоже, решили пройти путь по хорошо освещенным граблям самостоятельно, в добрый путь.
Мое же мнение состоит в том, что программировать можно или хорошо, или никак. Поскольку Ваша программа до уровня хорошо не дотягиваем явно, и советы по ее улучшению Вы категорически отвергаете, то готов оставить Вас с программой уровня никак.
Если Вы действительно считаете, что потрясающие в своей эффективности алгоритмы и необычные, не приходящие до сего момента никому в голову решения, примененные в Вашем чудесном коде, вызывают злопыхания завистников, который в бессильной злобе пытаются своими грязными лапами обеспечить Ваше прекрасное детище, то боюсь, Вы живете в вымышленном мире.
Ни в коей мере не претендуя на личное внимание столь продвинутого программиста, тем не менее мог бы порекомендовать посмотреть исходные коды обработки событий мыши в древней системе Turbo Pascal, где то, что Вы считаете невозможным без заглядывания в будущее, реализуется вполне понятными и довольно таки тривиальными конструкциями.
Боюсь Вас огорчить...
я тебя огорчать не боюсь - т.к. у тебя несколько вариантов поведения:
- ты пишешь хороший код для работы с кнопкой и публикуешь его на этом форуме.
- ты исправляешь ошибки в код класс титановый велосипед для тактовой кнопки.
- ты идёшь в пень, как программист-пустомеля.
*кретинам, обзывающим меня программистом, повторяю: я - радиомонтажник.
Уважаемый GarryC, не сочтите за труд прочитать.
Тогда лично я не очень понял, зачем Вы текст тут разместили, если юзать будете сами? ...то тогда надо позаботится об удобстве будущих пользователей и добавить в описание класа одну строчку private: в нужном месте.
Если Вы пришли к нам в "песочницу" из "конструкторского бюро", так помогите, если не затруднит. Если обратите внимание на попытки написать альтернативу этому коду, то увидите, что никто не довел дела до конца и/или его теория оказалась не состоятельной.
Боюсь Вас огорчить, но послать меня достаточно убедительно в пень Вам удасться лет через 15-20 занятий встроенным программированием.
Мда, сколько таких тут мимо проходило, ни один не доказал своей состоятельности ДЕЛОМ.
..., и советы по ее улучшению Вы категорически отвергаете, ..
Достаточно часто проглядываю топики, чего-то не увидел дельных советов.
... Если Вы действительно считаете, что потрясающие в своей эффективности алгоритмы и необычные, не приходящие до сего момента никому в голову решения, примененные в Вашем чудесном коде, вызывают злопыхания завистников, который в бессильной злобе пытаются своими грязными лапами обеспечить Ваше прекрасное детище...
Ежу понятно, что нет предела совершенству. Вот только где эти "супер коды-алгоритмы" в законченном виде? Где-то выше, только один человек написал "я использую вот такой код" но он мне не подходит, а кде все остальные???
...тем не менее мог бы порекомендовать посмотреть исходные коды обработки событий мыши в древней системе Turbo Pascal, где то, что Вы считаете невозможным без заглядывания в будущее, реализуется вполне понятными и довольно таки тривиальными конструкциями.
Мог (я) бы сказать СПАСИБО, ЕСЛИ БЫ такой продвинутый человек за "спасибо" (как это сделал Клапауций 232) подарил БЫ сообществу сие чудо.
Ну и, чтоб не из пустоты писать. Вот мой четвертый или пятый код в жизни (вполне рабочий говнокод), чтоб Вы понимали уровень многих участников, для которых код написан.
UPD
так я и не понял этой фразы....
...мог бы порекомендовать посмотреть исходные коды обработки событий мыши в древней системе Turbo Pascal, где то, что Вы считаете невозможным без заглядывания в будущее, реализуется вполне понятными и довольно таки тривиальными конструкциями.
объяснитесь, пожалуйста, так я собираюсь нажать, кликнуть 2 раза или подержать (ну скажем 5 секунд). И как там это реализовано?
пост 100
при двойном клике или удержании кнопки одиночное нажатие всё равно срабатывает, что иногда не приемлемо
опиши мне словами алгоритм, который будет предсказывать будущее, например:
я нажал кнопку и... [здесь девайс смотрит в будущее и он точно знает, что]....
так я и не понял этой фразы....
Гриша, если бы хоть у одного, пострадавшего от класс титановый велосипед для тактовой кнопки., было желание вести конструктивный диалог с целью улучшения, исправления, приведения к некоему стардарту кода класса, то это звучало бы следующим образом - в языке Z++ кнопки обрабатываются таким кодом по такому алгоритму.
т.е. забей на этот серый шум профессиональных безработных программистов - времени у них дофига, а код бесплатно написать им профессиональность не позволяет.
анонс.
на днях выложу переписанную заново версию кода класса - через более чем год многие вещи вижу иначе.
анонс.
на днях выложу переписанную заново версию кода класса - через более чем год многие вещи вижу иначе.
Ждем. Юзаю более или менее данный класс. Немного переписал под себя, убрал лишние примочки.
Ждем. Юзаю более или менее данный класс. Немного переписал под себя, убрал лишние примочки.
и чего мешает поделиться результатом (ну соответственно, с описание переделок.)? Я пример использования кинул в посте 243 (тока там без переделок, я их не делал)
Прежде всего, хотелось бы подчеркнуть, что воспитанный человек не может обращаться на ты к незнакомому человеку в русском языке, поскольку это невежливо. В других языках, где понятия ты И Вы сливаются, это вполне допустимо, но даже в них при общении с малознакомыми людьми принято применять безличные Mrs и Ms вместо You. Но это так заметка по поводу, конечно, можно быть хорошим разработчикам и при этом пренебрегать правилами поведения в обществе, но мне подобное сочетания представляется маловероятным в силу ряда причин, излагать которые в данном комменте считаю излишним.
Насчет первого варианта поведение - предложение интересное, своего рода вызов, конечно, не моего уровня, но вполне себе вызов. У меня такой код есть, написан он лет 15 назад на ассемблере для I8051, в ближайшие выходные постараюсь первратить его в программу для среды Ардуино и выложить.
Второй вариант, простите, не рассматриваю - здесь как раз тот случай, когда проше выкинуть, чем переделать, постараюсь свой интерфейс сделать максимально близким к Вашему.
Третий вариант, с Вашего позволения, пока не рассматриваем до ближайших выходных.
Ну и последнее, по моему мнению, назвать человека программистом - это не обозвать его, поскольку программирование, как профессия, требует весьма высокого уровня интеллектуального развития и не может быть оскорбительныи. А что касается того, чем Вы зарабатываете в реальной жизни - по Вашему, это существенно? Я должен сделать скидку и относится к Вашей программе, исходя из иных критериев, нежели к своей или к программе коллеги? Это почему, собственно?
Если я Вам принесу криво собранную плату со "слепыми " пайками и в ответ на Ваши замечания гордо заявлю, что я программист, это как-то улучшит качество этой платы?
Сразу отвечу на вопрос из следующего Вашего комментария о заглядывании в будущее - Вы увидите это в коле, который я обещал написать за выходные, но сразу изложу основную идею - событие нажатия задерживается до того момента, когда достоверно станет известно, что это не двойной клик и не длительное нажатие - довольно таки несложно. Постараюсь обратить внимание на данный момент в комментариях.
1. В том то и дело, что я прочитал комменты в начале и там уважаемому автору предлагалось другими участниками ввести некоторые элементарные исправления в код, чтобы соблюсти общепринятые соглашения о написании классов. Но, вместо того, чтобы последовать этим несомненно разумным советам, автор начинает вопрошать, зачем это делать (я не буду цитировать содержимое любой книги по ООП, там все наглядно показано с примерами), заявлять, что он и так прекрасно использует свой класс, что и вызвало к жизни мой комментарий относительно намерений, сподвигнувших его на выставление своего кода на всеобщее обозрение. Да, Вы правы, никто из критикующих код не предложил внятной альтернативы; как я и обещал, постараюсь исправить данное упущение.
2. Отосительно проходящих мимо, ничего не могу сказать, надеюсь, что после выходных буду зачислен в другую категорию, пока могу порекомендовать посмотреть мои посты на Хабре, я там пишу исключительно о встроенном программировании и разработке, возможно, они позволят Вам создать первое впечатление о моем уровне.
3. По поводу советов именно они и были в комментах к этому посту - посмотрите внимательнее.
4. Да, это был сарказм, возможно, излишний, наверное, погорячился.
5. Если я выполню свое обещание за эти выходные, то вполне приму Вашу благодарность, ни на что другое я не рассчитываю, мои посты удовлетворяют не нижние уровни пирамиды потребностей.
6. Ваш код (я никогда в своей жизни в письменном виде слово, которым Вы его охаректеризовали, не использовал и использовать не собираюсь), несомненно, тоже посмотрю и постараюсь дать к нему комментарий (по первому впечатлению, там есть, что комментировать в плане улучшения), но сразу хочу заявить, что ..
7. Если Вы занялись программированием, то Вы должны ответственно относиться к данному процессу и постоянно повышать свой уровень, какой бы он в данный момент не был.
Прежде всего, хотелось бы подчеркнуть, что воспитанный человек не может обращаться на ты к незнакомому человеку в русском языке, поскольку это невежливо.
почему ты решил, что ты мне не знаком?
IMHO (лирика) {
Уважаемый GarryC, что касается:
Прежде всего, хотелось бы подчеркнуть, что воспитанный человек не может обращаться на ты к незнакомому человеку в русском языке, поскольку это невежливо.
Давно заметил, что чем дальше на восток, тем больше люди говорят друг - другу Вы. На западе (России) подавляющее большинство ТЫчет :) такая вот диалектика. Это становится для меня вопросом восприятия и, Я лично, отношусь к этому так:
И посылал в иные земли [посланников, как правило, перед объявлением войны] со словами: „Иду на Вы!“
Если копнуть историю, несложно нарыть вагон информации, где среди прочего "Как называть родителей на «ты» или на «вы» ".
Что же касается грубости "Клапауций ХХХ (и его ипостаси)" комментировать не буду, тем более воспитывать, он не один на форуме.
} IMHO (лирика)
Сразу отвечу на вопрос из следующего Вашего комментария о заглядывании в будущее ... событие нажатия задерживается до того момента, когда достоверно станет известно, что это не двойной клик и не длительное нажатие - довольно таки несложно.
пост 110
* возможно!, этот алгоритм поможет следующим пользователям... :
в программе определяется "что" использовать (нажатие, двойное нажатие, удержание) и устанавливается интервал (время) определения - до его окончания никаких действий. Соответственно если использовать только простое нажатие - мгновенное исполнение, во всех других комбинациях - действие исполняется по истечении времени интервала определения - да хоть тройное нажатие!
ты не оригинален в желании программно затупить работу кнопки на время, превышающее bounce_ - длительность отслеживания дребезга.
пост113
UPD пост 109. "залипание кнопки" - если перекрыть все моменты, то необходимо позаботиться в алгоритме о том, что есть "залипание кнопки" и как этот момент обрабатывать!!!
никак не обрабатывать, т.к. при залипании кнопки(постоянном нажатии) обработается один раз событие удержание кнопки и в дальнейшем кнопка перестанет работать совсем от слова СОВСЕМ.
исходя из условий поставленной задачи, можно вообще не обрабатывать "удержание" если кнопку не отпустили!!! НО, это все должен определить РАЗРАБОТЧИК (програмист) согласно алгоритму по ТЗ.
ИМХО. Написать код достаточно просто, правильно составить алгоритм почти - искусство. Это как в школе – правильно составленное условие задачи больше половины решения. А в данном случае, разработчик должен описать все возможные события именно так, как ему это нужно.
Темка понравилась именно тем, что есть код (доступный), который можно допилить под свои нужды – все универсальное слишком громоздко.
PS. тем не менее ждем Вашего расширенного варианта кода
Давно заметил, что чем дальше на восток, тем...
...толще партизаны.(с)
Гриша, неужели моё обращение к GarryC на "ты", является главным из перечисленных им, моих преступлений против человечности в общем и ползателями форума в частности, что бы акцентировать внимание именно на этом, вместо того, что бы осудить меня по совокупности моих ужасных деяний?
весь в сомнениях - ведь, весь этот флуд просто обязан как-то коррелировать к кодом для обработки работы тактовой кнопки... но, как и каким местом?
что GarryC хотел мне и нам донести, потратив время для написания таких длинных и полезных для меня и всех нас постов?
весь в сомнениях - ведь, весь этот флуд просто обязан как-то коррелировать к кодом для обработки работы тактовой кнопки... но, как и каким местом?
да никакак - это ИМХО
уже раз 5 писал:
пост 15
3) Пожалуйста, дайте право ТС дополнять (возможно, и изменять) первый пост всегда!!!
пост 25
Назрела проблема с офф.топом. Много сообщений убивающих время и не несущих полезной информации....
Уважаемый, строка 35, случаем не ошибка?????????? или это pullup?
digitalWrite(_pb, 1);