Нетипичные кнопки
- Войдите на сайт для отправки комментариев
Добрый день. В ардуино и программировании новичок, но кое что знаю и кое что могу.
Хочу сделать 2 поста с кнопками и светодиодами. Логика такова:
1. При нажатии btn1 загорается светодиод led1, а при нажатии btn2 загорается светодиод led2.
2. После нажатия кнопки светодиод должен гореть n-секунд и гаснуть.
3. При нажатии одной из кнопок должен блокировать (или игнорирование)нажатие второй кнопки (исключаем одновременное нажатие) . Данное условие я хочу реализовать именно на стороне кнопок, а не светодиодов. В дальнейшем схема будет обрастать функционалом и основным триггером для всей программы будут состояния кнопок. Поэтому "действие пока горит светодиод" не подходит в решении моей задачи.
Теперь вопросы:
1. Как реализовать защиту от одновременного нажатия кнопок
2. С данным кодом есть баг: первое нажатие кнопки зажигает светодиод буквально на секунду, а повторное нажатие отрабатывает millis как положено. Думал это дребезг контактов и сделал защиту, но это не оно.
Готовый код не нужен, просто подопните в нужном направлении
int btn1 = 11; // кнопка №1 — порт 11 int btn2 = 12; // кнопка №2 — порт 12 int led1 = 13; // порт 13, для светодиода int led2 = 14; // порт 14, для светодиода // статусы состояний #define B1HOLD B00000001 // нажата первая кнопка #define B2HOLD B00000010 // нажата вторая кнопка #define B1TO B00000100 // у первой кнопки произошёл таймаут #define B2TO B00001000 // у второй кнопки произошёл таймаут // таймеры кнопок unsigned long timer1; unsigned long timer2; #define DEBOUNCE 300 unsigned long debounceTimer; byte flags = 0; // флаг состояния void setup() { Serial.begin(9600); //включаем com порт // Установим порты кнопок как входящие: pinMode(btn1, INPUT_PULLUP); pinMode(btn2, INPUT_PULLUP); // Установим порт светодиода как исходящий: pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); // Выключим светодиоды digitalWrite(led1, LOW); digitalWrite(led2, LOW); } void loop() { if (!digitalRead(btn1)) flags = B1HOLD; if (!digitalRead(btn2)) flags = B2HOLD; //if (B2HOLD && B1HOLD) // Serial.println("WTF?!"); switch (flags) { case 0: // никаких событий не зафиксировано break; case B1HOLD: if (millis() - debounceTimer > DEBOUNCE) { digitalWrite(led1, HIGH); Serial.println("B1HOLD"); flags = B1TO; debounceTimer = millis(); } break; case B2HOLD: if (millis() - debounceTimer > DEBOUNCE) { digitalWrite(led2, HIGH); Serial.println("B2HOLD"); flags = B2TO; debounceTimer = millis(); } break; case B1TO: if (millis() - timer1 >= 4000) { digitalWrite(led1, LOW); flags = 0; Serial.println("B1TO"); timer1 = millis(); } break; case B2TO: if (millis() - timer2 >= 4000) { digitalWrite(led2, LOW); flags = 0; Serial.println("B2TO"); timer2 = millis(); } break; //default: // if (millis() - timer1 > 4000) // digitalWrite(led1, LOW); // digitalWrite(led2, LOW); // timer1 = millis(); // Serial.println("Конец"); //flags = 0; } }
Прям точное направление указать?
Какая то логика непонятная. Со стороны кнопок, со стороны светодиодов... Это как? Есть программа и ей всё равно - кнопки или светодиоды. Всё что описано как задание делается через автоматное программирование - в вики есть большая статья. Прочитайте и попробуйте реализовать. С кнопками тоже беда. Возьмите титановый велосипед для кнопки из раздела программирование и получайте чистое нажатие.
По второму пункту - строки 13 и 14, неинициализированные переменные. Перенесите их в loop() в самое начало, объявите static и инициализируйте
По первому пункту непонятно - защиту от нажатия именно пока нажата кнопка? Если да, то просто добавьте в условие проверку второй кнопки
flickster - курсовик?
Вы уже не первый в этом месяце, кому надо кнопки с блокировкой нажимать.
Как же вы надоели, двоешники
Вы бы всех под одну гребенку бы не чесали. Нет, не курсовик. Я пейнтболист и хочу сделать кнопки для банера.
Блокировка кнопок нужна для исключения спорных моментов из разряда "я первый нажал! нет, я первый!"
И нет, я не двоешик. Я сисадмин и поэтому частично знаком с кодом.
ОК, это не вы спрашивали на Гайвере тоже самое 2 дня назад?
Зажигание двух светодиодов двумя кнопками с блокировкой пишется в 6 строчек, никакие флаги вообще не нужны.
Что вы там накрутили в коде, непонятно.
По второму пункту - строки 13 и 14, неинициализированные переменные. Перенесите их в loop() в самое начало, объявите static и инициализируйте
По первому пункту непонятно - защиту от нажатия именно пока нажата кнопка? Если да, то просто добавьте в условие проверку второй кнопки
таймеры поправил.
Условие проверки поставил, и появился еще один баг: светодиод теперь залипает. По наблюдение после B*HOLD не уходит в B*TO. Нажимаю еще раз и все срабатывает. Это только после одновременного нажатия кнопок.
Добавка - посмотрел - на гайвере точно вы.
И что-то вы путаетесь в показаниях (попросту подвираете) - там вы писали что новичок и в коде не сечете, здесь строите из себя знающего и типа с кодом пришли... а код-то чужой притащили, который вам на гайвере написали. Некрасиво.
Вам там написали код, нафига вы оттуда сюда пришли? Продолжали бы в той же ветке - это было бы логично, дописали бы вместе с автором кода
Добавка - посмотрел - на гайвере точно вы.
И что-то вы путаетесь в показаниях (попросту подвираете) - там вы писали что новичок и в коде не сечете, здесь строите из себя знающего и типа с кодом пришли... а код-то чужой притащили, который вам на гайвере написали. Некрасиво.
Вам там написали код, нафига вы оттуда сюда пришли? Продолжали бы в той же ветке - это было бы логично.
ВЫ либо меня с кем то путаете, либо ту тему одним глазом читали.
Из моего там было 15 строк "типичного для работы с кнопками" кода.
А от меня сейчас конкретно что именно хотите? Если Вы весь из себя детектив, то найдите в вк одноименную с моим ником тут страницу. Там много меня и пейнтбола. Там Вы кстати сможете увидеть, что я давненько закончил учиться ;)
А сюда я пришел потому, что как и там есть люди которые не читают видимо название раздела и включают "папку програмера", который тут же кучей критики впустую сотрясает воздух.
ВЫ либо меня с кем то путаете, либо ту тему одним глазом читали.
Простите, наверно это совпадение, тема с такой же задачей и с автором с таким же ником...
Все такие хитрые, блин.
ВЫ либо меня с кем то путаете, либо ту тему одним глазом читали.
Простите, наверно это совпадение, тема с такой же задачей и с автором с таким же ником...
Вы между строк читает или Вам все равно?
Добавка - посмотрел - на гайвере точно вы.
И что-то вы путаетесь в показаниях (попросту подвираете) - там вы писали что новичок и в коде не сечете, здесь строите из себя знающего и типа с кодом пришли... а код-то чужой притащили, который вам на гайвере написали. Некрасиво.
Вам там написали код, нафига вы оттуда сюда пришли? Продолжали бы в той же ветке - это было бы логично, дописали бы вместе с автором кода
И раз уж на то пошло, то я взял оттуда часть кода с объявлением переменных. А все что в цикле писал сам строка за строкой
Откровенно говоря, в этот раздел за критикой и приходят. Когда хотят похвалиться, идут в раздел "Проекты". Вам же нужен именно папка - программер. Точнее, вам нужен платный исполнитель
дел
И раз уж на то пошло, то я взял оттуда часть кода с объявлением переменных. А все что в цикле писал сам строка за строкой
ладно согласен, не по делу выступил.
flickster, приношу извинения.
И сюда на форум лезут почти сплошь школьники и птушники за курсовыми, время такое.
настроение херовое, задолбали все :)
Откровенно говоря, в этот раздел за критикой и приходят. Когда хотят похвалиться, идут в раздел "Проекты". Вам же нужен именно папка - программер. Точнее, вам нужен платный исполнитель
А как Вы решили, что мне нужен платный исполнитель? Я пытаюсь научиться и разбраться в непонятных моментах. А сейчас для меня самое непонятное это отношение знающих людей к новичкам.
Когда к нам в пейнтбол приходят новички, мы им даже маркера свои даём пострелять. Тут же я за неделю на двух форумах вижу одно и тоже: "ля какой вы тупой. тут ведь все просто..." и 200 строк непонятного кода или максимально клёвый ответ "там за 6 строк все кодится". На руборде для таких есть раздел андеграунд, а тут почему то вся "элита" лезет в раздел для помощи новичкам
И раз уж на то пошло, то я взял оттуда часть кода с объявлением переменных. А все что в цикле писал сам строка за строкой
ладно согласен, не по делу выступил.
flickster, приношу извинения.
И сюда на форум лезут почти сплошь школьники и птушники за курсовыми, время такое.
настроение херовое, задолбали все :)
вот. Теперь бы хотелось конструктивного диалога) К сожалению почему вторую неделю только через такие "атаки" все дела решаются =( Луна в какой то фазе что ли....
И раз уж на то пошло, то я взял оттуда часть кода с объявлением переменных. А все что в цикле писал сам строка за строкой
ладно согласен, не по делу выступил.
flickster, приношу извинения.
И сюда на форум лезут почти сплошь школьники и птушники за курсовыми, время такое.
настроение херовое, задолбали все :)
я понимаю общие принципы т.к. я сиадмин (не по профилю, просто как говорится душа лежит) и на информатике QBASIC мне хорошо заходил. Но вот нюансов я не понимаю и большинство уроков в инете сводятся к копипасту друг друга
Условие проверки поставил, и появился еще один баг: светодиод теперь залипает. По наблюдение после B*HOLD не уходит в B*TO. Нажимаю еще раз и все срабатывает. Это только после одновременного нажатия кнопок.
Это к условиям проверки никаким боком. Смотрите, что еще вы там поправили. Что там в сериал выдает?
В коде Serial.println я использовал для того, чтобы хоть как то понять что происходит и куда я застреваю. Дребезг взят у гайвера, переменные у дяденьки с форума гайвера. Это все что я посчитал полезным из тех 200 строк. Подправил код в соответствии с рекомендациями "v258" и получил нарушение в работе loop. Или что то похожее на это. Сейчас B2 игнорирует нажатие B1, а B1 не игнорирует B2, и более того не переходит в кейс B1TO (по крайней мере светодиод горит и статус в консоли не проходит)
Когда к нам в пейнтбол приходят новички, мы им даже маркера свои даём пострелять.
По постановке задачи понял. Вы же в С++ не рубите и не хотите. Контроллеры копипастингом тяжело программировать. Вам на двух форумах об этом сказали, вы не понимаете..
Условие проверки поставил, и появился еще один баг: светодиод теперь залипает. По наблюдение после B*HOLD не уходит в B*TO. Нажимаю еще раз и все срабатывает. Это только после одновременного нажатия кнопок.
Это к условиям проверки никаким боком. Смотрите, что еще вы там поправили. Что там в сериал выдает?
1
if
(!digitalRead(btn1) && digitalRead(btn2))
2
flags = B1HOLD;
3
else
if
(!digitalRead(btn2) && digitalRead(btn1))
4
flags = B2HOLD
Когда к нам в пейнтбол приходят новички, мы им даже маркера свои даём пострелять.
По постановке задачи понял. Вы же в С++ не рубите и не хотите. Контроллеры копипастингом тяжело программировать. Вам на двух форумах об этом сказали, вы не понимаете..
а про копипаст Вы как решили? гляньте мой код и я объясню назначение в нём всех строк. Копипас в чем заключается? Объявление переменных и Setup? Я пытаюсь научиться делать сам, но это не запрещает мне смотреть чужие работы и разбирать их по кусочкам. Всё и сразу не бывает
без
все кейсы отрабатывали на ок
Ну еще бы им не отрабатывать - кнопок-то нет, никто состояния не меняет ))
Выкладывайте текущий код. Который вот сейчас у вас не работает
без
все кейсы отрабатывали на ок
Ну еще бы им не отрабатывать - кнопок-то нет, никто состояния не меняет ))
Выкладывайте текущий код. Который вот сейчас у вас не работает
flickster, все таймеры запускаете не там. Дебонс надо запускать при нажатии кнопки, таймер светодиода - при окончании таймера дебонсе.
Блокировку кнопок в вашем коде сделать легче легкого - выставляйте новый фоаг только при отсутсвии других флагов.
А кто бы Вам помогал, если не "илита" b707 - другой новичок? Это им нахер не встряло. Вы решите свою задачу и больше не зайдете сюда, как и остальные 99% новичков.
без
все кейсы отрабатывали на ок
Ну еще бы им не отрабатывать - кнопок-то нет, никто состояния не меняет ))
Выкладывайте текущий код. Который вот сейчас у вас не работает
я понял в чем беда) Заменил своей условие проверки Вашим и все поехало.
догадались - молодец
flickster, все таймеры запускаете не там. Дебонс надо запускать при нажатии кнопки, таймер светодиода - при окончании таймера дебонсе.
Блокировку кнопок в вашем коде сделать легче легкого - выставляйте новый фоаг только при отсутсвии других флагов.
таймер светодиода же нужен мне в другом кейсе? мне нужно чтобы после нажатия светодиод горел еще 2 секкунды например.
С флагами я если честно не до конца понял как работать. Толкового объяснения не встретил.
flickster. после такого исправления вы будете утверждать, что понимаете строчки в коде? :)))
я же говорю, перечитал и понял свой косяк)
оставил так. У меня почти 3 часа ночи и я занимаюсь самообразованием пока дочь с женой спят) я тоже чуток устал и глаз замылился за день
Втупую это делается так: в лупе по инпуту1 зажигаем лед1, по инпуту2 зажигаем лед2. Затем дилэй на 10500мс и гасим оба леда.
Дело в помощи, а не в реакции на 99%
с b707 мы уж поняли друг друга, но только после определенной полемики. Я понимаю, что у всех своя жизнь и свои проблемы, но убивать у новичков желание заниматься ардуинкой это тоже не дело
я же говорю, перечитал и понял свой косяк)
оставил так.
ничем не напоминает те 6 строчек. что я вам предлагал вчера? :)
делай мне остановит весь код, а как я говорил выше, это только начало. По задумке после нажатия кнопки будет гореть светоион и еще будет играть аудиофайл с мп3 плеера. Поэтому делэй тут не уместен.
я же говорю, перечитал и понял свой косяк)
оставил так.
ничем не напоминает те 6 строчек. что я вам предлагал вчера? :)
их 4) Я отталкивался немного от другой логики. Не А+ и Б-, а если А+, то Б что то там. Вот она меня и завела не туда
Запусти аудиофайл и уйди в дилэй.
Любой блокирующий код автоматически отсечет вторую кнопку и подавит дребезг.
Не надо сразу комический корабль строить, начни с малого.
я же говорю, перечитал и понял свой косяк)
оставил так.
ничем не напоминает те 6 строчек. что я вам предлагал вчера? :)
я потратил 2 ночи на разбор кода, который мне дали на гайвере. Откровенно говоря я не ожидал увидеть прям настолько голый СИ там. И это прям хардкор какой то оказался.
ничем не напоминает те 6 строчек. что я вам предлагал вчера? :)
их 4)
ну так тогда у вас не было требования держать светодиод включенным еще 4 секунды, они выключались сразу - и для этого было достаточно еще 2х строк
Тот участник, чей код вы в итоге взяли - хороший программист. но в данном случае моя идея явно была лучше... :)
это третья версия моего кода =) Я и так иду маленькими шажочками. Про дилэя с дребезгом думал, но все пишут, что дилэй зло и я решил сразу учиться работать без него
я понял в чем беда) Заменил своей условие проверки Вашим и все поехало.
Ну вот, а то я уже матюкнуться успел )))
В конце концов это придавит все :
if (!flags && !digitalRead(btn1)) flags = B1HOLD;
if (!flags && !digitalRead(btn2)) flags = B2HOLD;
"Комический корабль" - это хорошо :) Отражает суть многих поделок новичков :)
ничем не напоминает те 6 строчек. что я вам предлагал вчера? :)
их 4)
ну так тогда у вас не было требования держать светодиод включенным еще 4 секунды, они выключались сразу - и для этого было достаточно еще 2х строк
Тот участник, чей код вы в итоге взяли - хороший программист. но в данном случае моя идея явно была лучше... :)
[/quote]
повторюсь, я взял идею)
Вторая версия моего кода выглядела вот так:
и если бы я сразу построил логику правильно, я бы в кейсы не полез. Но зато я попробовал кейсы в работе)
Лучше и понятнее для новичка. А это в данной ситуации главное. Я никоем образом не говорю, что он плохой человек или специлист, но его уровень кода слишком сложен для понимания на моей уровне развития. Я разобрал его код и взял с него интересные и полезные кусочки. К слову о том, что "цифры буквами" можно передавать (например B11111001, //1) я узнал как раз в этих раскопках.
вот это уже более похоже на корабль xD
Оптимизация кода для меня еще не скоро откроется)
и к слову про новичков и 99%
Первым делом я бегло пробежался по первым 5-7 страницам форума в нужном разделе и оставил там полезный комент относительно Notepad++ для тех же новичков
Оптимизация кода для меня еще не скоро откроется)
тут нет никакой оптимации, это всего лишь логическое выражение
Оптимизация кода для меня еще не скоро откроется)
тут нет никакой оптимации, это всего лишь логическое выражение
оно сокращено в 1 строку = оптимизированно
Первым делом я бегло пробежался по первым 5-7 страницам форума в нужном разделе и оставил там полезный комент относительно Notepad++ для тех же новичков
я видел. Комент типично новичковый - наивный и немного смешной. Если чо - подсветка синтаксиса есть практически в любом редакторе кода, а не только в Нотепаде. Вы Удивитесь - но она даже в Ардуино ИДЕ есть
case B1HOLD: {
digitalWrite(led1, HIGH);
Serial.println("B1HOLD");
flags = B1TO;
timer1 = millis();
}
break;
...
case B1TO: {
if (millis() - timer1 >= 4000) {
digitalWrite(led1, LOW);
flags = 0;
Serial.println("B1TO");
}
break;
...