Переключение действий одной кнопкой
- Войдите на сайт для отправки комментариев
Ср, 21/08/2019 - 20:21
Народ вопрос такой, с ардуинотолько знакомлюсь, пытаюсь понять логику работы. Так не могу начать, к ардуино подключено 2 транзистора и 1 кнопка, нужно что бы по 1 клику на кнопку активировался один транзистор а по 2 нажатию второй и соответственно по 1 повторному нажатию выключился 1й а по 2му второй, с чего начать? пины на ввод Д8 на вывод Д11 и Д13
одно действие по кнопке выполнять умеете?
ну диод включал и выключал уже
по 1 клику на кнопку активировался один транзистор а по 2 нажатию второй и соответственно по 1 повторному нажатию выключился 1й а по 2му второй, с чего начать? пины на ввод Д8 на вывод Д11 и Д13
Пишите словами и подробнее. Что такое "по 1 клику"? По первому? По одиночному? Как отличить "а по 2" от "1 повторному"? Вот пришёл второй клик - это второй? Или "первый повторный"?
Включение: 1 клик(одиночный клик) - активировался пин Д11 , 2 быстрых клика(дабл клик) - включается пин Д13 . Отключать их следующим способом( когда пины Д11 и Д13 активны): 1 клик (одиночный клик) - выключается пин Д11, 2 быстрых клик (дабл клик)а - выключается пин Д13. Все делается одной кнопкой, как это делать двумя я уже знаю. Для уменьшения места мне нужно все это делать 1й кнопкой.
Поищите слово флаг. Это переменные в зависимости от значения которых программа с помощью операторов if while case ветвит путь исполнения команд. Изменять флаги в программе нужно по нажатию кнопки и в зависимости от значения флагов включать и выключать светодиоды.
#7
:)) Вот только #7 пример изучать только севшему за прогромирование. Пусть для начала почитает форум пр титановый велосипед, может ему этого будет достаточно.
пример #7 точно не подходит, надо научиться распознавать одиночные и двойные нажатия, ну а дальше проще, флаги не нужны, при одиночном нажатии кнопки инвертируем состояние пина светодиода 1, при двойном - светодиода 2
при одиночном нажатии кнопки инвертируем состояние пина светодиода 1, при двойном - светодиода 2
Осталось понять при первом нажатии, что оно одиночное, а не часть двойного.
------------
Gambit767,
Вы совершаете типичную новичковую ошибку проектирования интерфейса - делаете одиночные и двойные нажатия независимыми. При таком подходе интерфейсы получаются тормозными, раздражающими и, в итоге, ненадёжными.
Вот смотрите. Пришло первое нажатие. Как понять - оно одиночное и пора переключать диод 1 или оно – «первая часть двойного» и надо ждать второй части, а потом переключать диод 2? Ответ - никак, только ждать установленное время. Если за это время пришёл второй клик, значит двойное, а если не пришёл, то одиночное. Таким образом, Вы всегда ждёте время эквивалентное двойному нажатию, чтобы принять решение, что за нажатие Вам пришло. Это будет заметно и при одиночных нажатиях это людей раздражает - типа чего он тормозит-то!
А теперь посмотрите, как сделано в том же виндовс. Одиночное нажатие - "выбрать файл", двойное - "Выбрать и запустить файл". Т.е. действие по двойному нажатию включает в себя действие по одиночному! Реализовано как «пришло нажатие - по любому выбираем файл (ничего и никого не ждём)», а если в течение заданного времени пришло второе нажатие (двойное получается), то запускаем выбранный файл. При таком подходе получается, что и одиночное нажатие, и двойное срабатывают сразу и не надо ничего ждать - ничего не тормозит и не бесит человека.
Надо стараться примерно так проектировать интерфейсы, чтобы одиночное нажатие была первой частью двойного - тогда они будут выглядеть органично и профессионально. Попробуйте перепродумать интерфейс.
Я понял вас, а как же мне это все реализовать в коде?
Надо просто понаписать кучу разных, но подходящих по смыслу для решения задачи, операторов языка Си.
Я имел ввиду в Ардуино IDE
ардуино программируется на языке С
Я в курсе , просто не корректно понял ваш предыдущий ответ
Надо в Ардуино IDE понаписать кучу разных, но подходящих по смыслу для решения задачи, операторов языка Си, скомпилировать и загрузить в Ардуино.
Ну, мне нужен скетч , я сам его не понимаю как написать без инструкций, которых Овер дохрена.
Готовых скеччей у нас нет.
Ну если не сложно, можете написать? Я не спешу
Если хотите что бы это сделал кто то за вас, то тогда вам в "Ищу исполнителя"
Ясно
у вас в первом сообщении был совсем другой алгоритм. Все действия происходили по одиночному нажатию - первый раз нажал - включился первый диод, второй раз - включился второй. Следующие два нажатия последовательно выключают. И так по кругу.
Такой алгоритм значительно проще реализовать, чем дабл-клики. Если вы действительно умееете включать один диод одной кнопкой - я могу вам подсказать, как переделать этот скетч для двух диодов, если хотите. Только приготовтесь - Вы все будете делать сами, я буду только подсказывать. Если такой вариант устроит - выкладывайте свой код для одной кнопки и одного диода.
Если Вам надо, чтобы кто-то написал готовое - это только за деньги с соответвующем разделе.
Может пригодится ТС... http://arduino.ru/forum/programmirovanie/snova-o-knopke#comment-399557
Ну, мне нужен скетч , я сам его не понимаю как написать без инструкций, которых Овер дохрена.
Вы не поняли главного посыла моего поста.
На данном этапе Ваша главная проблема не в коде и не в инструкциях. Вам нужно придумать интерфейс так, чтобы нажатия отрабатывались "естественно". Именно придумать словами: "пришло нажатие - делаем то-то, если менее, чем через X мс, пришло ещё одно - делаем то-то".
Сейчас проблема именно такова. Нужно решить её - придумать интерфейс. Словами. И только тогда можно будет думать о коде.
На данный же момент, Вы не знаете не только "как" написать, но, главное, Вы не знаете "что" написать. А без последнего, Вам никто помочь не сможет ни за деньги, ни за так.
при одиночном нажатии кнопки инвертируем состояние пина светодиода 1, при двойном - светодиода 2
Осталось понять при первом нажатии, что оно одиночное, а не часть двойного.
так я же и написал - надо научиться распознавать одиночные и двойные нажатия
чавойта?
великий русский языка - по одному слову понимаю, а вместе - нед.
в соседней теме есть кое-что для ТС
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/ne-menyaetsya-...
Так уже ж несколько людей, почти забесплатно, написали ТС решение!
to ТС. Вышенаписанного можно избежать , если в качестве второго типа нажатия выбрать не даблклик, а лонг клик, только короткий клик при этом придётся выполнять по отпусканию кнопки, а не по нажатию. Тогда ждать время (эквивалетное лонгклику для принятия решения какой клик пришёл) не придётся.
почитайте внимательно тему титановый велосипед, только лучше там не писать, особенно про это)
Gambit767,
критерий время - переменная типа unsigned long, millis()
критерий номер нажатия - переменная типа byte, int, и "нажатие" значит "нажали" и потом "отпустили", то есть надо проработать обе ветки if(жмут кнопку).
"процесс" также может принудительно сбросить "номер" нажатия, чтобы он "забылся", по критерию. Например через время.
N - конкретное (заранее определённое, известное) число. Ещё N принято называть исходными данными или дефайном, потому что используют ключевое слово (как правило пишется большими буквами) и объявляют наверху программы через #define на случай если в программе N повторяется
Так понятно?
ребята, хватит уже ... ТС уже давно ничего не нужно. Он обманом выцыганил код у ДетСимена и сбежал