Jump to content

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


 Share

Recommended Posts

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

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

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

 

 

Link to comment
Share on other sites

Вебинар «Новые тенденции сетевых технологий: Ethernet по одной витой паре» (09.12.2021)

Приглашаем 9 декабря всех желающих посетить вебинар, посвященный технологии Ethernet и её новому стандарту 10BASE-T1S/L. Стандарт 802.3cg описывает передачу данных на скорости до 10 Мбит в секунду по одной витой паре. На вебинаре будут рассмотрены и другие новшества, которые недавно вошли в семейство технологий Ethernet: SyncE, PTP, TSN. Не останется в стороне и высокоскоростной 25G+ Ethernet от Microchip.

Подробнее

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

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

Edited by Альберт116
Link to comment
Share on other sites

DC/DC-преобразователи Mornsun со склада Компэл

В сложный период для рынка электронных компонентов, когда производители увеличивают сроки поставки продукции, со склада Компэл можно приобрести широкий ассортимент DC/DC-преобразователей производства компании Mornsun. На складе представлены наиболее популярные семейства изолированных и неизолированных DC/DC-преобразователей новых поколений R3 и R4, а также предыдущего, но по-прежнему востребованного поколения R2.

Подробнее

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

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

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

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

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

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

Link to comment
Share on other sites

Новые компоненты STMicroelectronics для учета электроэнергии

Внедрение автоматизированных систем контроля и учета всех видов энергоресурсов, невозможно без инструментов, позволяющих помимо измерения параметров, преобразовывать их для обработки цифровыми интеллектуальными системами. Микросхемы STPM32, STPM33 и STPM34 STMicroelectronics являются наиболее точными и высокопроизводительными представителями своего семейства и способны максимально точно измерять параметры электросети в системах электроснабжения переменного тока, а также осуществлять их первичную обработку. Рассмотрим подробнее их преимущества и средства разработки.

Подробнее

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

 

Link to comment
Share on other sites

Карбид кремния позволяет повысить КПД и удельную мощность ИБП с двойным преобразованием

Построение источников бесперебойного питания с двойным преобразованием, широко используемых в современных хранилищах данных, на базе карбид-кремниевых MOSFETs производства Wolfspeed позволяет уменьшить мощность потерь в них до 40%, а также значительно снизить занимаемый ими объем и стоимость комплектующих.

Подробнее

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

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

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

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

Edited by Lexter
Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

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

 

Link to comment
Share on other sites

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

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

 

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

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

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

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

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

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

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

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

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

Edited by Shahabbas

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

Link to comment
Share on other sites

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

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

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

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

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

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

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

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

 

Link to comment
Share on other sites

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

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

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

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

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

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

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

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

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

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

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

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

 

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

Link to comment
Share on other sites

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

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

8982734324.jpg

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...