Нажатие двух кнопок одновременно. Как?
- Войдите на сайт для отправки комментариев
Пт, 22/06/2018 - 00:26
Всем привет! В реализации своего первого проекта мне понадобилась функциональная особенность: хочу делать перезагрузку Ардуинки по удерживанию двух кнопок (зажатых одновременно). Есть ли у кого-то идеи, как это реализовать?
В данный момент использую обычную обработку кнопок с помощью флажков и millis() для устранения дребезга контактов.
Вот часть кода, отвечающего за это:
boolean flag1 = 0; boolean flag2 = 0; boolean butt1; boolean butt2; unsigned long last_press; void setup() { pinMode(A1, INPUT_PULLUP); pinMode(A2, INPUT_PULLUP); Serial.begin(9600); } void loop() { butt1 = !digitalRead(A1); butt2 = !digitalRead(A2); if (butt1 == 1 && flag1 == 0 && millis() - last_press > 150) { // первое действие } if (butt2 == 1 && flag2 == 0 && millis() - last_press > 150) { // второе действие } if (butt1 == 0 && flag1 == 1) { flag1 = 0; } if (butt2 == 0 && flag2 == 1) { flag2 = 0; }
в этом коде у вас какя-то ерунда написана, никакого антидребезга нет, кнопки будут срабатывать по несколько раз при каждом нажатии
Я дичайше извиняюсь, что ввёл вас в заблуждение. Хотел как лучше — очистить код от ненужностей, и оставить только основу. И сам того не желая, удалил из циклов важные строки кода, которые лишили код понимания.
Вот как-то так получается. Единственное, я полагаю, что и переменных last_press две должно быть (last_press1 и last_press2). Но во время тестирования никакого дребезжания не было замечено вроде как.
Возвращаясь к теме, хочу спросить вас b707, есть ли у вас мысли, как обработку одновременного нажатия с удержанием сделать? Заранее благодарю.
Я дичайше извиняюсь, что ввёл вас в заблуждение. Хотел как лучше — очистить код от ненужностей, и оставить только основу.
ситуация не изменилась - все равно код неверный. Например, в условии строки 17 кнопка 1 сработает сразу, а не после антидребезга в 150мс. Да и вообще, код обрывается на середине и компилироваться не будет.
Возможно, вам покажется, что я придираюсь и говорю не по делу - но по мне нет смысла обсуждать добавления новых функций в код, который уже сейчас не работает.
1- Если программа будет работать так как вы хотите, то нажатие кнопок будет вызывать вечный перегруз.
2- А вот если кнопка 1 только что нажата, а кнопка 2 уже нажата то да можно уйти в перегруз, как и ситуация как кнопка 2 только что нажата.....
1- Если программа будет работать так как вы хотите, то нажатие кнопок будет вызывать вечный перегруз.
скорее кто-то кого-то не понял
b707 совершенно не думаю, что вы придираетесь. Я всегда прислушаюсь к советам людей, которые разбираются в той или иной области лучше меня. Так хотя бы чему-то учишься, а не повторяешь вслепую непонятные схемы. А в том, что нет смысла модифицировать корявый код, я с вами полностью согласен. К тому же, заметил, что в ходе тестирования, одна из кнопок всё таки "залипла" пару раз. Т.е. действительно дребезг в моём коде не устраняется. К сожалению было слишком много работы в последнюю неделю и не было времени заниматься по вечерам этим мини-проектом. На днях пересмотрю код и урок, на основании которого я писал этот код, и попробую найти причину.
qwone возможно мы друг друга не поняли, но в пункте 2 своего сообщения вы натолкнули меня на верную мысль. Действительно, нужен алгоритм, который будет проверять состояние другой кнопки, при текущем нажатии первой. И в случае соответствия условию будет выполнятся то, что необходимо. Я даже примерно понимаю, как это должно выглядеть в коде. Спасибо.
Так и не понял я до конца, как улучшить текущий скетч. Проштудировал различные статьи об избавлении от дребезга. В итоге остановился на методе, предложенном уважаемым qwone, которым он оказывается уже давно поделился на форуме.
Разобравшись, что там к чему, и немного модифицировав его скетч, получил вот это:
Добавил три флажка: два из них фиксируют нажатие и удержание одной из кнопок, а третий отвечает за проверку состояния второй кнопки в момент нажатия текущей (чтобы одно и то же действие не выполнилось дважды).
Вобщем-то всё работает идеально. Спасибо всем, кто помогал и отдельное спасибо qwone за его скетч.
P.S.: Для выполнением функции после трёхсекундного удерджания я использовал delay() который, как я понимаю, лучше не использовать в серьёзных проектах, т.к. он полностью останавливает выполнение loop(). По задумке, это действие должно приводить к перезагрузке Ардуины, так что полная приостановка цикла — вполне нормальное явление в данном случае. Но если у кого-то есть мысли, как сделать это с помощью millis(), буду признателен. Я, к сожалению, ещё не настолько продвинулся в изучении программирования.
Много воды утекло с последнего сообщения в этой теме. Тем не менее, код, описанный в нём, верой и правдой служил всё это время. И вот понадобилось мне расширить немного функционал. А именно: добавить функционал «удержания» (или длительного нажатия, если позволите) к одной из кнопок. Программирование не является моей основной деятельностью, и, изрядно поломав голову, я так и не смог придумать, как это сделать.
Прошу помощи в данном вопросе. Возможно qwone увидит это сообщение и подтолкнёт к нужному решению. Всё-таки мой код большей часть основан на его скетче.
Всем заранее спасибо!
Много воды утекло с последнего сообщения в этой теме. Тем не менее, код, описанный в нём, верой и правдой служил всё это время. И вот понадобилось мне расширить немного функционал. А именно: добавить функционал «удержания» (или длительного нажатия, если позволите) к одной из кнопок. Программирование не является моей основной деятельностью, и, изрядно поломав голову, я так и не смог придумать, как это сделать.
Прошу помощи в данном вопросе. Возможно qwone увидит это сообщение и подтолкнёт к нужному решению. Всё-таки мой код большей часть основан на его скетче.
Всем заранее спасибо!
скачайте библиотеку OneButton.
кнопки с внутренней подтяжкой.
там и короткий клик, и двойной, и длинный, и удержание кнопки.
проще с ней разобраться и пользоваться на здоровье...
кнопки с внутренней подтяжкой.
там и короткий клик, и двойной, и длинный, и удержание кнопки.
проще с ней разобраться и пользоваться на здоровье...
За совет спасибо. Библиотеку эту я знаю.
Тем не менее, хочется самому разобраться. Я готовый код не прошу. Прошу лишь подсказать.
хотите сам - посмотрите как в библиотеке работа с кнопкой реализована и повторяйте ...
а я пользуюсь уже давно, мне нравится и удобно.
Хочу ещё добавить, что фиксировать долгое нажатие ПОСЛЕ отпускания кнопки, у меня получилось сразу.
Вот код:
Но вот с отстчётом времени в момент удержания (даже без отпускания кнопки) ничего придумать не получается :(
puhloschiok, прошу выложить мой код, на который вы опирались. Так как я уже много кода на форум писал.
qwone, большое спасибо, что отозвались!
Я попробовал найти тот ваш старый код, но, скорее всего, сообщение, в котором он был, в последствии было отредактирвоано вами в связи с оптимизацией вами кода. http://arduino.ru/forum/programmirovanie/podavlenie-drebezga-bez-delai-i... — вот тут вы описываете свой код антидребезга. Думаю раньше на этом месте и был ныне устаревший вариант... По крайней мере Гугл указывает именно на это сообщение.
То, что вы привели мне в качестве примера в последнем сообщении — это уже довольно прогрессивный и сложный для меня код. Тем не менее, благодарю! Буду разбираться, как он работает.
qwone, невероятно просто! Словами не выразить мою благодарность. Построчно буду сравнивать со старым кодом и разбираться, как же вам удалось это провернуть! =)
qwone, разобрался в вашем коде.
Оказывается, одна из моих неудачных конструкций, была очень похожей. Я не додумался ввести ещё один флаг. Из-за этого программа работала не корректно, и каждый раз я получал предыдущее значение нажатия. Ну и время удержания я записывал просто числом, не константой. Хотя разницы особой нет, вопрос удобства и оптимизации.
По ходу изучения вашего кода у меня возник вопрос по объявлению переменных.
Вот в четвёртой строке вы сделали запись:
Т.е. это означает, что обе переменные типа bool. И такая запись является более оптимальной, чем объявлять один и тот же тип для каждой переменной с новой строки. Даже с точки зрения восприятия скетча, не так много строк (особенно, когда переменных много).
Выходит и другие переменные типа bool этого скетча можно было объявить в этой же строке?
Или я не прав?
Видишь тут такое дело. Обычно считается что программисты пишут программы, но это в 100% не верно. Они пишут исходник, а дальше компиляторы линкеры и прочие механизмы собирают как кто хочет. Так что мой ответ будет такой. https://www.youtube.com/watch?v=7TsQLGimB2I
Нет, программы все же пишут программисты. А все эти компиляторы, линкеры и прочие механизмы - лишь инструменты, которыми программист пользуется.
Выходит и другие переменные типа bool этого скетча можно было объявить в этой же строке?
Или я не прав?
Раз уж взялись за булеаны, то и значения надо использовать - true/false, мне так кажеся.
Видишь тут такое дело. Обычно считается что программисты пишут программы, но это в 100% не верно.
вот вот, согласен )))