Перейти к содержанию

обработка нажатия кнопки микроконтроллером


Рекомендуемые сообщения

Есть устройство, управляемое одной кнопкой, в связи с этим у кнопки есть 3 вида нажатий: одиночное нажатие, двойное нажатие и долгое нажатие. При написании кода для МК столкнулся с проблемой обработки одиночного и двойного нажатия, как их отличить? Полазив по форумам узнал, что многие советуют таймером замерять время нажатия и время между нажатиями. Да, это работает, но есть серьезное "НО". У них таймер после первого нажатия еще какое-то время ждет второе нажатие, и если он его не получает в заданный промежуток времени обрабатывает как одинарное нажатие. При таком подходе на одинарный клик программа будет реагировать с запозданием т.к. будет тупо сидеть и ждать второго клика которого в принципе не будет. Но ведь в компьютерной мыши нет такого, она четко без задержек реагирует на двойной клик и на одинарный. После одинарного клика окна и пр. открываются мгновенно. Задав этот вопрос знакомому программисту получил ответ что одинарный и двойной клик отличаются по времени, это и следует брать за основу обработки нажатия. Хорошо, написал. Теперь у меня если приходит клик длительность меньше 100мс ожидается второй клик чтобы засчитать его как двойной (второй тоже должен быть меньше 100мс). А все что больше 100мс считается как одинарный. И вроде даже работает, НО! Людям теперь приходится объяснять что двойной клик должен быть коротким, а одинарным чуть подольше, и это не удобно. Старикам, например, которые не могут так быстро кликать. Как же быть? Обращал внимание как написан алгоритм в других устройствах, и там все нормально. Брелок автосигнализации, например. Там хоть медленно 2 раза нажми, он засчитает как двойной. Подскажите какой алгоритм реализовать чтобы избавиться от проблемы. Спасибо!
P.S. кнопка обрабатывается в прерывании. Считаем кнопку вообще без дребезга, я это поборол. Нажал-лог. 1, отпустил-лог.0. С этим проблем нет.

Ссылка на комментарий
Поделиться на другие сайты

Зачем кнопку обрабатывать в прерывании? Ну чушь же!

Просто заводим конечный автомат с состояниями каждой кнопки. Проверяем: если вдруг состояние изменилось, фиксируем текущее время в миллисекундах и новое состояние. Чтобы не было дребезга, в течение 30-100мс после этого не реагируем на изменения состояний. Далее, если кнопку отпустили, переводим в состояние "RELEASED". Если через Nмс нахождения в состоянии RELEASED оно опять сменяется на PRESSED, заменяем на DBL_PRESSED… Если в течение Mмс нахождения в состоянии PRESSED или DBL_PRESSED кнопку не отпустили, даем ей состояние HOLD.

Вот так просто я делал свою реализацию, но мне не нужно было состояние DBL_PRESSED.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Альберт116 сказал:

Но ведь в компьютерной мыши нет такого

Это вам показалось. Там точно так же "старикам неудобно", есть время ожидания второго клика, а в драйверах мыши времена двойного клика даже настраиваются:
1945954529_.png.d9f4b1f81186b3ba10800f5d9925b57f.png

Чтобы хорошо работало, писать надо под конкретные применяемые в этом устройстве кнопки. Нарисуйте одну под другой временные диаграммы одиночного и двойного щелчка, и сразу поймёте, какие времена надо анализировать, и что чудес не бывает.

 

 

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

@Eddy_Em у вас та же проблема что я описывал, какое-то время программа ничего не делает и ждет второго клика, а если его не будет? получаем задержку в обработке. В прерывании обрабатываю чтобы лишний раз не занимать МК, кнопка обрабатывается только тогда, когда с ней взаимодействуют.  И да, дребезга у меня нет, совсем

 @Lexter диаграммы рисовал, смотрел в анализаторе уровней. двойные нажатия получались 100-120 мс, одинарное нажатие больше 120, но это только у меня, мне так надо было и организм видимо подстроился. позвал другого человека и все...тайминги начали плыть

Изменено пользователем Альберт116
Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

2 часа назад, Альберт116 сказал:

Подскажите какой алгоритм реализовать чтобы избавиться от проблемы.

Если нажатие длиннее 0,1с (время подбирается), то однозначно одиночное нажатие, отпускания не ждём, отрабатываем. Если кнопка отпущена ранее этих 0,1с, ждём повторного нажатия (возможно с другим временем). Пришло нажатие - двойной клик, отрабатываем, отпускания не ждём. Кончилось время ожидания - одинарное нажатие.
Вот как-то так. :)

Только что, Альберт116 сказал:

позвал другого человека и все...

Так на диаграмме и надо показать эти времена, в пределах которых могут "болтаться" длительности нажатия и промежутков между нажатиями.

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

 

Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, Альберт116 сказал:

Нужен универсальный вариант

Вместо двойного клика ставьте отдельную кнопку.
Ещё раз: чудес не бывает.  :)

Включите мозг и подумайте сами: Человек нажал два раза с интервалом в одну секунду. Это двойное нажатие или два одиночных?

Изменено пользователем Lexter
Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Альберт116 сказал:

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

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

Ссылка на комментарий
Поделиться на другие сайты

27 minutes ago, Альберт116 said:

а если его не будет?

Будет другое состояние. Логично же. В компьютерах мыши именно так и обслуживаются: сначала ты получаешь сигнал CLICK, а лишь после него - DBLCLICK.

 

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Альберт116 сказал:

потом приходит старик и ломает эту систему, тайминги у него другие

 

3 часа назад, Альберт116 сказал:

Но ведь в компьютерной мыши нет такого,

Есть. Но там в обработку вовлечена визуализация. То есть человеку легко приспособиться, имея четкую и недвусмвсленную ответную реакцию на нажатие. 

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

Вот и  в данном случае подозреваю, что можно отлично без двойного щелчка обойтись, просто введя реакцию на события "нажал", "отпустил" и "удерживаешь". Я как-то шутки ради сделал ввод текста одной кнопкой - морзянкой. Правда, т.к. морзянки не знаю, даже коммит в гитхаб с этой порнухой не делал. Так и канула в /dev/null.

Ссылка на комментарий
Поделиться на другие сайты

Не понимаю, а нафига нужен двойной клик в самоделке?

Гораздо проще программно сделать по принципу, например:

короткое нажатие (< 0,5 секунд) - 1 команда

среднее нажатие (0,6-2 секунды) - 2 команда

длительное нажатие (2,1-5 секунд) - 3 команда

очень длительное нажатие (> 5,1 секунд) - 4 команда

Время отработки команд можно подобрать по собственному желанию.

Программно можно и "антидребезг" кнопки заложить.

Изменено пользователем Shahabbas

Технические вопросы решаю в теме , в личке не обсуждаю !!!

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, Альберт116 сказал:

P.S. кнопка обрабатывается в прерывании. Считаем кнопку вообще без дребезга, я это поборол. Нажал-лог. 1, отпустил-лог.0. С этим проблем нет.

В этом и есть проблемма. Система должна игнорировать "короткие нажатия".  

Итого: кнопка нажалась, начинается счет времени:

-а) если кнопка отпущена раньше 40 мсек, начинается отсчет времени отпущенного состояния. Если кнопку не нажали вновь - все забыли, счет обнулен. Если же кнопку нажали вновь  через, к примеру 20 мсек, считается длительность второго нажатия и если это не дребезг (опять насчитали 40 мсек) - то выставляется признак двойного нажатия.

-б) если кнопка не была отпущена и её "долержали" без отпускания до 80- 100 мсек и после отпустили, ввставляется признак однократного нажатия

-в) если кнопка ниразу не была отпущена в течении более 100-120 мсек - ввставляется признак длинного нажатия.

Можно продвинуть интуитивность, приняв что человеку несложно ритмически делать паузу между кликами равной клику. Ну типа как в вальсе: клик1- пауза-клик2. Если все  три длительности примерно равны (или даже достаточно если клик1 равен паузе), то двойное нажатие - ок.

 

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, Альберт116 сказал:

предлагаете оставить как есть и переучивать пользователей?

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

12 часов назад, Lexter сказал:

Человек нажал два раза с интервалом в одну секунду. Это двойное нажатие или два одиночных?

Как вы тут будете реализовывать "универсальный" алгоритм?

Да даже проще, взять к примеру ваше "длинное нажатие". Заложили вы, положим, четыре секунды. А пользователь упорно нажимает 3,9... Ну считает он даже до пяти быстрее, чем за 4 секунды...
Какая тут может быть "универсальность"?!

А вообще, если Human Interface плохо или неудобно работает, то это значит, что что-то в нём не продумано.
Может огласите исходные требования, чем надо управлять, какие команды вводить?

Ссылка на комментарий
Поделиться на другие сайты

да, вы правы, при таких нажатиях различить одиночное и двойное нажатие невозможно, МК пока еще не научились мысли читать)
устройство это бортовой компьютер для автомобиля (иномарка). представляет из себя экран 128*128 пикселей, экран разделен на 2 части и в каждой половинке выводится по параметру. кнопками надо было листать эти параметры в каждой половинке и необходимо было реализовать вход в меню настроек. сейчас алгоритм реализован так: одинарное нажатие-листает параметры в верхней половине экрана, двойное нажатие-в нижней половине экрана, а долгое нажатие вход в меню. изначально все управление было по трем кнопкам, но люди возмущались что приходится сверлить пластик торпеды и вообще выглядит колхозно, поэтому перешел на сенсорную кнопку, у неё и дребезга нет и сверлить ничего не надо.

Ссылка на комментарий
Поделиться на другие сайты

В таком случае просто сама напрашивается сенсорная панель поверх экранчика! И не нужно сверлить пластик под кнопки.

Экран, кстати, можно и побольше сделать, хотя бы дюймов 6 в диагонали: что можно на 128×128 пикселей разглядеть? И тыкать можно будет по менюшкам пальцем, а не стило.

Ссылка на комментарий
Поделиться на другие сайты

проблема в том, что приборка закрыта еще прозрачным пластиком, и расстояние от экранчика до пластика к тому же приличное. А так согласен, сенсорный экранчик был бы чудом!)

Ссылка на комментарий
Поделиться на другие сайты

45 минут назад, Альберт116 сказал:

бортовой компьютер для автомобиля (иномарка). представляет из себя экран 128*128 пикселей

Экран бортового компьютера иномарки 128х128 пикселей... Даже не знаю, смеяться, или плакать. Если экран ещё и 0,96 дюйма, то наверное одновременно и то, и другое. :D

По-моему, таким решением с размером экрана и расположением глубоко в панели, кака заложена изначально. Загнали вы сами себя в угол. Что бы вы ни делали с управлением, оценка будет

52 минуты назад, Альберт116 сказал:

вообще выглядит колхозно

 

Согласен с @Eddy_Em . Лучшее, что на сегодня можно поставить в таком применении - сенсорный экран. Причём адекватного разрешения и размера. Особенно если это не сервисное устройство, а используется при движении. Должно быть прежде всего максимально удобно водителю. Насколько удобно будет разработчику - в расчёт не берётся. Да и необходимость листать, искать и что-то высматривать (кстати, индицируются пиктограммы или текст с легко забывающимися сокращениями? Точек-то мало.) в окошке торпеды во время движения, а тем более лезть в какие-то настройки меню и менять параметры - заложенная повышенная опасность аварии. Должно индицироваться только действительно необходимое и максимально наглядно и просто. Зелёное - норма, красное и мигает - обрати внимание, непорядок.
Ну а если это сервисное устройство, которое используется только при обслуживании, то ему вообще на торпеде не место.
Или вы хотите совместить и то, и другое? Тогда можно сделать так: В движении только необходимая индикация, а при настройке в сервисе - внешний пульт с кнопками, подключающийся по радиоканалу или ИК.

Ссылка на комментарий
Поделиться на другие сайты

нет это не сервисное устройство, экран мал, но надписи на него выводятся крупными буквами/цифрами, заранее выставляется те параметры которые чаще всего нужны (прим. расход и заряд акб) и редко когда меняется. сокращения используются все понятные и на русском, не надо, да и не про это речь. Людям все нравится кроме кнопок, вот и перехожу сейчас на сенсорную кнопку за пластиком торпеды

ну и куда я вам тут влеплю огромный сенсорный экран? что-то не видно или не понятно на дисплее? сначала уточните, потом хайте  Lexter

8982734324.jpg

Ссылка на комментарий
Поделиться на другие сайты

Дисплейчик бы сюда круглый...

5 часов назад, Альберт116 сказал:

перехожу сейчас на сенсорную кнопку за пластиком торпеды

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

Ссылка на комментарий
Поделиться на другие сайты

  • 5 месяцев спустя...
В 10.11.2021 в 17:55, Альберт116 сказал:

 

Ваша задача решается с помощью конечных автоматов. При этом и обработчик кнопки конечный автомат и обработчик меню. Двойное нажатие (неважно сколько нажатий) решается легко. Есть короткое нажатие, есть удержание кнопки. Время удержания можно выставить любое. Есть даже такое: держим три секунды, это первый уровень меню. Держим ещё три секунды, это второй уровень меню. По двойному нажатию. Пусть мы определили, что есть короткое нажатие, то есть. Нажали, событие нажатие. Ессно после подавления дребезга. Отпустили кнопку, событие отжатия, также, после подавление дребезга. Пусть нам нужно двойное нажатие. После отжатия кнопки установка программного таймера. Скажем на 250 мс. Нажали еще раз, опять установка таймера. Время вышло, мы видим, что нажато 2 раза и нет длительного нажатия. Вот тебе и двойное нажатие. Вопрос. Где мы будем за этим следить. В модуле обработки кнопки или в модуле обработки меню. По идее, модуль обработки кнопки должен выдавать события нажатия кнопки, отпускания, удержание и автоповтор. А двойные нажатия и так далее, уже там где надо.

Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...

Тут дело не в том, как организовать программно двойное нажатие, тут дело в том, что одинарное нажатие будет перебиваться двойным нажатием. Следовательно, действие по двойному нажатию не должно противоречить действию по одиночному нажатию, оно должно лишь дополнять его. Примерно так, как это сделано вот тут, в редакторе при наборе текста: одиночное нажатие ЛКМ устанавливает тектовый курсор в указанную мышкой позицию, двойное нажатие ЛКМ выделяет все слово, в котором установлен текстовый курсор, а тройное нажатие выделяет весь абзац, в котором расположено это слово. Таким образом, последующие действия не противоречат, а дополняют предыдущие. Тогда не будет никаких запозданий реакции на одиночное нажатие.

Как это реализовать программно? С помощью флагов и таймеров. После срабатывания одиночного нажатия устанавливается флаг и запускается таймер отсчета интервала окна регистрации повторного нажатия, а так же выполняется действие по одиночному нажатию. Если в этот интервал не было повторного нажатия, флаг сбрасывается. Если же повторное нажатие было зарегистрировано в интервале, значит выполняется действие по двойному нажатию и алгоритм переводится в исходное состояние.

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

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...