Переключение действий одной кнопкой

Gambit767
Offline
Зарегистрирован: 21.08.2019

Народ вопрос такой, с ардуинотолько знакомлюсь, пытаюсь понять логику работы. Так не могу начать, к ардуино подключено 2 транзистора и 1 кнопка, нужно что бы по 1 клику на кнопку активировался один транзистор а по 2 нажатию второй и соответственно по 1 повторному нажатию выключился 1й а по 2му второй, с чего начать? пины на ввод Д8 на вывод Д11 и Д13

b707
Онлайн
Зарегистрирован: 26.05.2017

одно действие по кнопке выполнять умеете?

Gambit767
Offline
Зарегистрирован: 21.08.2019

ну диод включал и выключал уже

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Gambit767 пишет:

 по 1 клику на кнопку активировался один транзистор а по 2 нажатию второй и соответственно по 1 повторному нажатию выключился 1й а по 2му второй, с чего начать? пины на ввод Д8 на вывод Д11 и Д13

Пишите словами и подробнее. Что такое "по 1 клику"? По первому? По одиночному? Как отличить "а по 2" от "1 повторному"? Вот пришёл второй клик - это второй? Или "первый повторный"?

Gambit767
Offline
Зарегистрирован: 21.08.2019

Включение: 1 клик(одиночный клик) - активировался пин Д11 , 2 быстрых клика(дабл клик) - включается пин Д13 . Отключать их следующим способом( когда пины Д11 и Д13 активны): 1 клик (одиночный клик) - выключается пин Д11, 2 быстрых клик (дабл клик)а - выключается пин Д13. Все делается одной кнопкой, как это делать двумя я уже знаю. Для уменьшения места мне нужно все это делать 1й кнопкой.

nik182
Онлайн
Зарегистрирован: 04.05.2015

Поищите слово флаг. Это переменные в зависимости от значения которых программа с помощью операторов if while case  ветвит путь исполнения команд. Изменять флаги в программе нужно по нажатию кнопки и в зависимости от значения флагов включать и выключать светодиоды.  

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

#7

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

пример #7 точно не подходит, надо научиться распознавать одиночные и двойные нажатия, ну а дальше проще, флаги не нужны, при одиночном нажатии кнопки инвертируем состояние пина светодиода 1, при двойном - светодиода 2

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

при одиночном нажатии кнопки инвертируем состояние пина светодиода 1, при двойном - светодиода 2

Осталось понять при первом нажатии, что оно одиночное, а не часть двойного.

------------

Gambit767,

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

Вот смотрите. Пришло первое нажатие. Как понять - оно одиночное и пора переключать диод 1 или оно – «первая часть двойного» и надо ждать второй части, а потом переключать диод 2? Ответ - никак, только ждать установленное время. Если за это время пришёл второй клик, значит двойное, а если не пришёл, то одиночное. Таким образом, Вы всегда ждёте время эквивалентное двойному нажатию, чтобы принять решение, что за нажатие Вам пришло. Это будет заметно и при одиночных нажатиях это людей раздражает - типа чего он тормозит-то!

А теперь посмотрите, как сделано в том же виндовс. Одиночное нажатие - "выбрать файл", двойное - "Выбрать и запустить файл". Т.е. действие по двойному нажатию включает в себя действие по одиночному! Реализовано как «пришло нажатие - по любому выбираем файл (ничего и никого не ждём)», а если в течение заданного времени пришло второе нажатие (двойное получается), то запускаем выбранный файл. При таком подходе получается, что и одиночное нажатие, и двойное срабатывают сразу и не надо ничего ждать - ничего не тормозит и не бесит человека.

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

Gambit767
Offline
Зарегистрирован: 21.08.2019

Я понял вас, а как же мне это все реализовать в коде?

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Gambit767 пишет:
Я понял вас, а как же мне это все реализовать в коде?

Надо просто понаписать кучу разных, но подходящих по смыслу для решения задачи, операторов языка Си. 

Gambit767
Offline
Зарегистрирован: 21.08.2019

Я имел ввиду в Ардуино IDE

b707
Онлайн
Зарегистрирован: 26.05.2017

Gambit767 пишет:
Я имел ввиду в Ардуино IDE

ардуино программируется на языке С

Gambit767
Offline
Зарегистрирован: 21.08.2019

Я в курсе , просто не корректно понял ваш предыдущий ответ

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Gambit767 пишет:
Я имел ввиду в Ардуино IDE

Надо в Ардуино IDE понаписать кучу разных, но подходящих по смыслу для решения задачи, операторов языка Си, скомпилировать и загрузить в Ардуино.

Gambit767
Offline
Зарегистрирован: 21.08.2019

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

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Готовых скеччей у нас нет.   

Gambit767
Offline
Зарегистрирован: 21.08.2019

Ну если не сложно, можете написать? Я не спешу

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

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

 Если хотите что бы это сделал кто то за вас, то тогда вам  в "Ищу исполнителя"

Gambit767
Offline
Зарегистрирован: 21.08.2019

Ясно

b707
Онлайн
Зарегистрирован: 26.05.2017

Gambit767 пишет:
Ну если не сложно, можете написать? Я не спешу

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

Такой алгоритм значительно проще реализовать, чем дабл-клики. Если вы действительно умееете включать один диод одной кнопкой - я могу вам подсказать, как переделать этот скетч для двух диодов, если хотите. Только приготовтесь - Вы все будете делать сами, я буду только подсказывать. Если такой вариант устроит - выкладывайте свой код для одной кнопки и одного диода.

Если Вам надо, чтобы кто-то написал готовое - это только за деньги с соответвующем разделе.

Pyotr
Offline
Зарегистрирован: 12.03.2014
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Gambit767 пишет:
Я понял вас, а как же мне это все реализовать в коде?

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

Вы не поняли главного посыла моего поста.

На данном этапе Ваша главная проблема не в коде и не в инструкциях. Вам нужно придумать интерфейс так, чтобы нажатия отрабатывались "естественно". Именно придумать словами: "пришло нажатие - делаем то-то, если менее, чем через X мс, пришло ещё одно - делаем то-то".

Сейчас проблема именно такова. Нужно решить её - придумать интерфейс. Словами. И только тогда можно будет думать о коде.

На данный же момент, Вы не знаете не только "как" написать, но, главное, Вы не знаете "что" написать. А без последнего, Вам никто помочь не сможет ни за деньги, ни за так.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:

при одиночном нажатии кнопки инвертируем состояние пина светодиода 1, при двойном - светодиода 2

Осталось понять при первом нажатии, что оно одиночное, а не часть двойного.

так я же и написал - надо научиться распознавать одиночные и двойные нажатия

Клапауций 003
Offline
Зарегистрирован: 20.07.2019

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

чавойта?

великий русский языка - по одному слову понимаю, а вместе - нед.

DIVGENY
Offline
Зарегистрирован: 23.08.2016

 в соседней теме есть кое-что для ТС

http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/ne-menyaetsya-...

Green
Онлайн
Зарегистрирован: 01.10.2015

Так уже ж несколько людей, почти забесплатно, написали ТС решение!

MaksVV
Offline
Зарегистрирован: 06.08.2015

ЕвгенийП пишет:
Вот смотрите. Пришло первое нажатие. Как понять - оно одиночное и пора переключать диод 1 или оно – «первая часть двойного» и надо ждать второй части, а потом переключать диод 2? Ответ - никак, только ждать установленное время. Если за это время пришёл второй клик, значит двойное, а если не пришёл, то одиночное. Таким образом, Вы всегда ждёте время эквивалентное двойному нажатию, чтобы принять решение, что за нажатие Вам пришло. Это будет заметно и при одиночных нажатиях это людей раздражает - типа чего он тормозит-то!

to ТС. Вышенаписанного можно избежать , если в качестве второго типа нажатия выбрать не даблклик, а лонг клик, только короткий клик при этом придётся выполнять по отпусканию кнопки, а не по нажатию. Тогда ждать время (эквивалетное лонгклику для принятия решения какой клик пришёл) не придётся. 

почитайте внимательно тему титановый велосипед, только лучше там не писать, особенно про это) 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Gambit767,

if(жмут кнопку){
  разрешить процесс;
}else{
  запретить процесс; //подсказка: bool
}

процесс{
  if(критерий>=/==/<=N) чото делать;
  if(критерий>=/==/<=N) делать чото другое;
}

критерий время - переменная типа unsigned long, millis()

критерий номер нажатия - переменная типа byte, int, и "нажатие" значит "нажали" и потом "отпустили", то есть надо проработать обе ветки if(жмут кнопку).

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

N - конкретное (заранее определённое, известное) число. Ещё N принято называть исходными данными или дефайном, потому что используют ключевое слово (как правило пишется большими буквами) и объявляют наверху программы через #define на случай если в программе N повторяется

#define MY_SUPA_BEAST_ANTICHRIST_NUMBER (666)

 

Так понятно?

b707
Онлайн
Зарегистрирован: 26.05.2017

ребята, хватит уже ... ТС уже давно ничего не нужно. Он обманом выцыганил код у ДетСимена и сбежал