Kakmyc_btn.h (удержание кнопки)
- Войдите на сайт для отправки комментариев
Есть кнопка на пине (пусть будет «не важно какой пин»), она использует библиотеку kakmyc_btn, отлично отрабатывает нажатия и долгое удержание. Но есть необходимость кроме кликов / мультикликов / и долгого удержания кнопки ещё и в в событии «нажали и держат». То есть мультиклик сработал но кнопку все ещё держат, не отпускают и такое может длиться овердохрена времени. Как правильно это реализовать?
Либу только ленивый и Andriano (hi!) не знает ))) Но ссылка имеется: https://github.com/kakmyc-github/kakmyc_btn
Не совсем понимаю (так как я не настоящий программист), что будет происходить и какие флаги при этом правильно расставлять.
Собственно это факультатив, сегодня пятница, так что я не против превратить тему в обычное пятничное «потрепаться». А если ещё и результат будет - вот де супер)))
ЗЫ: Ещё раз автору респект, постоянно пользую. 282 байта код, 16 байт озу (в среднем на кнопку).
Она не для этого писалась.
Но если что, иногда тоже бывает нужно и сам делаю так:
Внутри нужного цикла завожу статичную переменную флага, который поднимается при событии LONG_PRESS.
Опускается флаг при условии if(digitalRead(btnPin)==NOT_PRESSED)
Ну и уже работаю в этом цикле с этим флагом.
ЗЫ: в последней итерации там вроде 240 байт сама библиотека и 14 байт ОЗУ на каждый объект кнопки
Берешь пример из библиотеки, заливаешь и смотришь в сериале, что выдается при неотпускании кнопки )))
Стесняюсь спросить, а где там вообще описан такой флаг? ))
Берешь пример из библиотеки, заливаешь и смотришь в сериале, что выдается при неотпускании кнопки )))
Ничего не выдаётся.
Стесняюсь спросить, а где там вообще описан такой флаг? ))
Где там ?
Его нужно описывать, внутри программы.
Где захочешь, там и описывай.
Что то типа этого:
«Девочки не ссорьтесь» (шутка юмора :) )
Я понимаю, что она (библиотека) под это не «заточена», иначе бы вообще вопросов не было.
Что Вы (kakmyc) описали я и так понимаю, но я не хотел бы терять событие долгого удержания, вот тут и весь «косяк». Как отличить «долгое удержание» от «зажали и не отпускают»?
А в чем разница ?
А в чем разница ?
Вот и мне бы понять в чем программно разница. А фактически - долгое удержание 2-4 сек, зажали и не отпускают - гораздо дольше. Хотя может быть в этом и ответ, только как его красиво программно «обыграть»?
А в чем разница ?
Вот и мне бы понять в чем программно разница. А фактически - долгое удержание 2-4 сек, зажали и не отпускают - гораздо дольше. Хотя может быть в этом и ответ, только как его красиво программно «обыграть»?
в смысле - зажал и удерживаешь всю ночь? )))
«Девочки не ссорьтесь» (шутка юмора :) )
Как отличить «долгое удержание» от «зажали и не отпускают»?
Это вопрос философский )) Так-то и 4 секунды - это "зажали и не отпускают"
Это вопрос философский )) Так-то и 4 секунды - это "зажали и не отпускают"
Да, в этом и «загвоздка». (
В библиотеке описаны тайминги, а дальше как быть чтобы и «рыбку пожарить и слона отжарить»?
ЗЫ: Пятница, вечер. Ни деды, ни Евгения Петровича, ни Андриано, никого... Я что-то не знаю?))
Ну вроде ж автор подсказал, как делать.
Но при его варианте теряется событие «долгое удержание».
При событии «долгое удержание» взвести флаг «нажали долго», далее если кнопка пин ещё в высоком состоянии... Все, спасибо. Понял как мне это сделать. Нужно было просто спросить. Спасибо всем!
Надо проверить завтра.
Как отличить «долгое удержание» от «зажали и не отпускают»?
Как по мне, это не просто сделать, т.к. если считать по таймеру - сначала сработает "долгое удержание", а если проверять , что кнопка не отпущена, изменится логика работы кнопки, т. е. "долгое удержание" можно зафиксировать, только нажав, выдержав нужное время, и отпустив кнопку.
Есть кнопка на пине (пусть будет «не важно какой пин»), она использует библиотеку kakmyc_btn, отлично отрабатывает нажатия и долгое удержание. Но есть необходимость кроме кликов / мультикликов / и долгого удержания кнопки ещё и в в событии «нажали и держат».
Это ошибка проектирования.
Не должно быть одновременно событий "долгое нажатие" и "нажали и держат".
Нет, теоретически можно, конечно, реализовать что-то вроде:
- нажали на 0.1 с - действие №1,
- нажали на 0.2 с - действие №2,
- нажали на 0.3 с - действие №3,
...
- нажали на 2.3 с - действие №23,
- нажали на 2.4 с - действие №24,
...
но это приведет к практической невозможности пользоваться такой кнопкой из-за массы ошибочных срабатываний.
Вот и в ситуации с одновременными "долгое нажатие" и "нажали и держат" будет то же самое.
Нет, теоретически можно, конечно, реализовать что-то вроде:
- нажали на 0.1 с - действие №1,
- нажали на 0.2 с - действие №2,
- нажали на 0.3 с - действие №3,
...
-
А как отделить , не отпустив кнопки? Как знать, что действие закончилось, не отпуская?
В то же время юзать кнопку в таком режиме неудобно и непривычно ИМХО.
P.S. Разве что, синхронизируя свои действия с дисплеем, и вовремя отдёргивая руку от кнопки))
А как отделить , не отпустив кнопки? Как знать, что действие закончилось, не отпуская?
Не отпуская кнопки можно определить единственный вариант: "кнопку нажали". Никаких других вариантов нет.
Нет, теоретически можно, конечно, реализовать что-то вроде:
- нажали на 0.1 с - действие №1,
- нажали на 0.2 с - действие №2,
- нажали на 0.3 с - действие №3,
...
-
А как отделить , не отпустив кнопки? Как знать, что действие закончилось, не отпуская?
В то же время юзать кнопку в таком режиме неудобно и непривычно ИМХО.
P.S. Разве что, синхронизируя свои действия с дисплеем, и вовремя отдёргивая руку от кнопки))
2. Если п.1 не приемлем - запрограммировать единственную кнопку на распознавание морзянки, вызов 57 функций к вашим услугам.
Ну у меня если кнопку нажали и держат, через таймаут идёт сброс события кнопка нажата и соответственно сразу идет новое событие нажатие кнопки. Соответственно получается пулемёт выдающий нажатую кнопку. Иногда надо.
Я про то, что привычное для нас "долгое удержание" работает так:
Нажали> держим>держим>что-то произошло>уже потом отпустили, причём можно не спешить отпускать, событие уже произошло.
А если ждать, определённое время, потом отпустить, и смотреть, вовремя ли ты отпустил? произошло ли событие? - Это уже совсем не то...
Здесь скорее самое то будет
Я отказался от этой идеи, много ложных срабатываний. Взял отдельную кнопку.
Всем спасибо за советы.
Имхо, это вопрос терминологии. По мне "нажали и держим" означает, что через определенный промежуток времени кнопка начинает выдавать серию событий "длинный клик", например, при настройке какого то параметра. Или, опять же к примеру, через тот же определенный промежуток времени по одиночному событию "длинный клик" включается, например, помпа и работает, пока кнопка удерживается нажатой. В принципе, одной кнопкой можно выполнять овердохрена действий, главное - хорошенько продумать )))
Подписаться
еще и Q коды придумали для овердохрена сообщений )))
Ну однокнопочный кодовый замок на обсуждаемой библиотеке реализуется элементарно .
Поливалка для цветов. Несколько каналов. Одна кнопка, несколько адресных светодиодов и пищалка
в каждом режиме одиночный клик - переключение канала, длинный клик, в том числе с удержанием кнопки нажатой - настройка параметра или запуск помпы. В некоторых еще и двойной клик. Короче, без шпаргалки хрен вспомнишь, где сколько чего нужно нажать )))
Поливалка для цветов. Несколько каналов. Одна кнопка, несколько адресных светодиодов и пищалка
в каждом режиме одиночный клик - переключение канала, длинный клик, в том числе с удержанием кнопки нажатой - настройка параметра или запуск помпы. В некоторых еще и двойной клик. Короче, без шпаргалки хрен вспомнишь, где сколько чего нужно нажать )))
Это изврат
Знаю. Но я таки это сделал )))) Экран цеплять было некуда, не хотелось делать большую коробку
ЗЫ: там еще один режим пропущен - 4 коротких + 1 длинный ))
«Четыре длинных, два коротких - так в мужской бане господин Морзе изобрёл свою азбуку!» )))))) (Городок)
- 4 коротких + 1 длинный ))
Это четыре в морзе ))))
- 4 коротких + 1 длинный ))
Это четыре в морзе ))))
Блин, а ведь точно ))
ЗЫ: в армии, кстати, как раз радиотелеграфистом был )))
Ради "поиграться" сделал простейшее меню, как раз такого типа. Индикация - минимальна. Удержание кнопки - автопрокрутка позиций меню, отпускание - выбор. Можно сделать столько пунктов, сколько палец сможешь держать))
А в них ещё подпункты...))
P.S. Чуть дополнил
Лично я щитаю, что все эти "очень длинные нажатия" - изобретение лисапедов. Всё уже придумано до нас, одинарное нажатие, двойное нажатие, длинное нажатие и автоповтор последней кнопки, вот и всё, пожалуй, что может пригодиться в ардуино-жизни, но даже нащёт двойного нажатия я не уверен, все равно оно реализуется через одинарное. Если сильно надо "очень длинное нажатие", напишы свой класс Switch(тумблер) у которого два устойчивых состояния, "включен" и "нет".
но даже нащёт двойного нажатия я не уверен
Угу. Это не мышка, тут двойной клик выполнять неудобно чисто физически. А уж всякие тройные, четверные и прочие клики - это вообще за гранью добра )))
ЗЫ: в моем описании выше "3 коротких...", "4 коротких..." и т.д. не есть тройные/четверные и т.д. клики. Там кнопка нажимается неспеша с интервалом не более секунды, ежели случайно пройдет двойной клик, то он не засчитывается. Все должно быть медленно и основательно )))
Да и вообще, вместо кнопки нужно использовать тумблер, а для управления прибором с помощью этого тумблера - секундомер.
И удлинитель ручки тумблера типа «рубильник» ))