Очень интересная логическая задача, на опрос состояния кнопок (help)
- Войдите на сайт для отправки комментариев
Друзья, добрый день!) История такая: пишу цикл проверки состояния кнопок. Условие: есть 2 тактовые кнопки, которые должны работать по ИДЕЕ в взаимоисключающем состоянии, другими словами если на кнопке 1 - HIGH, то на кнопке 2 обязательно - LOW, и если HIGH у кнопки, то должно выводиться в сериал определенное сообщение. Так вот, возможна такая ситуация (не спрашивайте, как, почему, зачем, откуда корни), что эти кнопки, будут не в взаимоисключающем состоянии, обе либо в HIGH либо в LOW, что является состоянием ошибки, и на это событие (когда обе в одинаковом состоянии), тоже нужно реагировать определенным сообщением. Я написал определенный код, который делает прерывание событий + обработка дребезга, сравнивает состояние друг с другом и все хорошо, если нажимаешь кнопки по очереди, но есть одно маленькое НО: в моем проекте состоянием ошибки, является ТО состояние, когда кнопки находятся в одинаковом состоянии некоторое время (скажем 1 секунду), а рабочий режим кнопок их поочередное нажатие, другими словами, когда я нажал кнопку 1 и РЕЗКО ее отпускаю и нажимаю кнопку 2, в момент переключения, когда я отпустил кнопку 1, программа сравнивает свое состояние со 2 кнопкой на, которой LOW, и думает, что это состояние ошибки (мой кривокод), вот, а это не состояние ошибки, а рабочий момет переключения, как мне это пофиксить, надеюсь у меня получилось объяснить, код прикладываю)
//1 const int switchPin1 = 2; boolean switchPin1_memory = 0; boolean switchPin1_now_memory = 0; unsigned long switchPin1_lastPress; boolean error1 = true; //2 const int switchPin2 = 3; boolean switchPin2_memory = 0; boolean switchPin2_now_memory = 0; unsigned long switchPin2_lastPress; boolean error2 = false; void setup() { pinMode (switchPin1, INPUT); pinMode (switchPin2, INPUT); Serial.begin(9600); while(!Serial); } void loop() { //порт 1 switchPin1_now_memory = digitalRead(switchPin1); if (switchPin1_now_memory == 1 && switchPin1_memory == 0 && millis() - switchPin1_lastPress > 100) { switchPin1_memory = true; switchPin1_lastPress = millis(); if (switchPin2_memory == switchPin1_memory) { error1 = !error1; Serial.println("Ошибка1"); error1 = !error1; } if (error1 != error2) { error1 = !error1; Serial.println("Кнопка 1 нажата"); } } if (switchPin1_now_memory == 0 && switchPin1_memory == 1) { switchPin1_memory = false; if (switchPin2_memory == switchPin1_memory) { error1 = !error1; } if (error1 != error2) { Serial.println("Ошибка11"); } } // Второй порт switchPin2_now_memory = digitalRead(switchPin2); if (switchPin2_now_memory == 1 && switchPin2_memory == 0 && millis() - switchPin2_lastPress > 100){ switchPin2_memory = true; switchPin2_lastPress = millis(); if (switchPin2_memory == switchPin1_memory) { error2 = !error2; Serial.println("Ошибка2"); error2 = !error2; } if (error1 != error2) { error2 = !error2; Serial.println("кнопка 2 нажата"); } } if (switchPin2_now_memory == 0 && switchPin2_memory == 1){ switchPin2_memory = false; if (switchPin2_memory == switchPin1_memory) { error2 = !error2; } if (error1 != error2) { Serial.println("Ошибка2"); } } }
Сначала читайте состояния обеих кнопок, а потом делайте желаемое в зависимости от результата. Всего 4 возможных случая.
Так я так и делаю
Попробуйте изменить:
Добавить условие, что это уже давно (условие выполняется больше секунды).
И очень неясно назначение вот этих "переворачиваний". Но тут уже дело ваше)
"Переворачивания" - кнопками я эмитирую реле) котакты могут притянуться и зарработает одна цепь питания(кнопка 1 нажата), могут отпасть и заработает совсем другая цепь(2кнопка нажата), а могут застрять в промежуточном положении - это и есть ошибка
Сделать еще временную переменную, например unsigned long ?
"Переворачивания" - кнопками я эмитирую реле) котакты могут притянуться и зарработает одна цепь питания(кнопка 1 нажата), могут отпасть и заработает совсем другая цепь(2кнопка нажата), а могут застрять в промежуточном положении - это и есть ошибка
Так в реальности не две кнопки, а одна (одно реле или одна двухпозиционная кнопка - не важно), но с возможным залипанием в промежуточном состоянии?
Проблема элементарно решаеется RS-триггером. Причём решается полностью, раз и навсегда. А заодно он (триггер) и с дребезгом разберётся, можете забыть о нём (дребезге).
Так что ставьте триггер и не мудрите.
1) аппаратно эту проблему уже решали, и да вы правы можно rs-триггером, но! у меня сейчас задача стоит решить программно, ибо в виду некоторых обстоятельств невозможно решить физически.
2) По поводу "Так в реальности не две кнопки, а одна (одно реле или одна двухпозиционная кнопка - не важно)", так то оно так, но когда реле притянуто, включется одна контактная группа и одна цепь питания, когда реле опускается, размыкая при этом прошлую цепь, и опустившись, замыкает другую контактную группу и включется совершенно другая цепь. И эти положения мне нужно логгировать в ардуино, по этому мне все равно придется с реле брать сигналы на два разных пина, и 2 кнопки сейчас это прекрасно эмулируют.
Вот, такая схема, мне просто тупо (не спрашивая) дают 2 провода с реле, и говорят, что нужно прогррамно сделать проверку
Так делайте программный RS-триггер, чего Вы там лукаво мудрствуете?
Если Вы понимаете, что такое RS-триггер, то должны знать, что это просто операция NOR, которая программно пишется элементарно. Так вот её и надо писать именно в терминах логической операции и таблицы истинности, а не пытаться сделать тоже самое, но так, как будто Вы о логике никогда не слышали.
Распишите в программе таблицу истинности NOR и всё будет отлично работать.
Так пол логике у меня все нормально в коде, просто нужно еще создать какое то условие, чтобы в момент переключения контактов при условии, что в этот момент состояние кнопок будет одинаковое, аррдуино понимало, что это нужно игнорировать, но если этот момент равенста больше определенного кол ва времени, то это уже ошибка
У Ардуины еще пока не зафиксировано наличие сознания и воли - понимать и игнорировать оно не в состоянии по объективным причинам.
У Ардуины еще пока не зафиксировано наличие сознания и воли
Ну, почему, был тут такой деятель, всё ИИ на ардуино создавал.
я вот не пойму, что в этой задаче интересного с логической точки зрения? Две кнопки прочитать не можем? Прочитали одну, вторую, сравнили. Если обе нажаты - запомнили время, когда это случилось. Далее, если кнопки остаются нажатыми более оговоренного интервала - выдаем ошибку. ВСЕ.
Логика на уровне третьего класса, по-моему.
Я вот смотрю все такие "умные", даже сарказма не понимают. Одна из прорблем русского народа "выё*истость", вот человек посоветовал добавить условие временное, до меня сразу дошло, я спросил, как это реализовать мб чере времнную переменную. Нет надо же вые*, как обычно. Спасибо
По любому сидят 40 летние стесняшки и закомплексы. А если у человека просто не хватает банально опыта и знаний в этой области, сразу тапками кидаться? вот после такого на форумы не хочется писать
Откудова оне все вылазиють?
вот после такого на форумы не хочется писать
не писайте в наш форум
По любому сидят 40 летние стесняшки и закомплексы. А если у человека просто не хватает банально опыта и знаний в этой области, сразу тапками кидаться? вот после такого на форумы не хочется писать
Так обманывать нехорошо!
Тема-то объявлена для взрослых людей
Очень интересная логическая задача, на опрос состояния кнопок (help)
а оказывается тут "у человека просто не хватает банально опыта и знаний в этой области"!
Вот дяденьки и обиделись! Думали что будут иметь дело со специалистом, а их оказывается просто дилетант развел!
Я вот смотрю все такие "умные", даже сарказма не понимают. Одна из прорблем русского народа "выё*истость"
Послушай Ежик. Перечитай еще раз мое сообщениею, после которого ты начал вые... Попытайся понять. что я тебе в трех предложения изложил полный алгоритм решения твоей задачи. Совершенно серьезный алгоритм, без подколок и глума.
Если ты не умеешь читать и не понимаешь советов - то это твои проблемы, не надо тут жалиться на то, что тебе форумы не нравятся.
Мне человек с ником Senovik, уже ответил я уже понял в какую сторону "капнуть", зато потом началось "у ардуино еще нет собственного разума, логика на уровне 3 класса,прочитать кнопку не можем". Вообще исходя из "логика на уровне 3 класса", так можно про все сказать, руководствуясь "все гениальное просто". "дяденьки обиделись", как девочки, ну если не интересна тебе эта тема, не пиши и все, в чем проблема? "Тема-то объявлена для взрослых людей", взрослые серьезные люди, которые действительно высококлассные специалисты, которые реально разбираются в "коде" просто не нуждаются в формуах, и не являются их активными участниками, так, что не считайте себя крутыми спецами, особенно если идет речь о разработке на ардуино :D
так, что расслабься боинг)
Ты вообще по братски ответил) Спасибо еще раз)
Ты вообще по братски ответил) Спасибо еще раз)
Алаверды, прими добрый совет: форумы - они разные. У каждого - своя атмосфера. На этом форуме - борзеть не стоит, тут не заржавеет. Тебе и правда b707 дал годный совет, содержащий решение проблемы. Ну а дальше - всё пошло не так.
Честно предупреждаю: если ты продолжишь общение в том же духе - то на этом форуме тебе не прижиться. И я лично - буду всячески этому способствовать.
Очень интересная математическая проблема - 2+2 ?
Ой да ладно тебе чел, согласен совет годный, но если бы этот дядя не начал в духе "Шо за тупые вопросы", я бы сказал ему огромное спасибо. А если люди не понимают, что их пытаются привлесь, как можно быстрее к теме, такими заголовками, то тогда я не понимаю о чем с ними разговаривать, надеюсь я не сильно потратил его драгоценнейшее время, вдруг он второй фейсбук придумал, а тут отвлекся на проблему маленькго характера
Спасибо тебе огромное от всей души, просто огромнейшее, что обратил свой царский взор, что потратил самое дорогое, что у нас есть - время. Брат, не забуду никогда этого
Мне человек с ником Senovik, уже ответил я уже понял в какую сторону "капнуть", зато потом началось "у ардуино еще нет собственного разума, логика на уровне 3 класса,прочитать кнопку не можем". Вообще исходя из "логика на уровне 3 класса", так можно про все сказать, руководствуясь "все гениальное просто". "дяденьки обиделись", как девочки, ну если не интересна тебе эта тема, не пиши и все, в чем проблема? "Тема-то объявлена для взрослых людей",
Так тему для взрослых людей окрывают взрослые люди!
взрослые серьезные люди, которые действительно высококлассные специалисты, которые реально разбираются в "коде" просто не нуждаются в формуах, и не являются их активными участниками, так, что не считайте себя крутыми спецами, особенно если идет речь о разработке на ардуино :D
Так чего тогда обижаться на то что дилетанту ответили дилетанты?
"Так чего тогда обижаться на то что дилетанту ответили дилетанты?"
Проблема в том, что я признаю свою бестолковость в этом вопросе, а другие, считают себя великими спецами и великими кодерами
Это не ты вчера RGB светодиод адресовал?
Нет, я 3 часа назад зарегистрировался
Это не ты вчера RGB светодиод адресовал?
не, не он. Тот был вежливый и называл меня единственным приличным человеком на этом форуме :)))
Жополизом кароч
А если люди не понимают, что их пытаются привлесь, как можно быстрее к теме, такими заголовками, то тогда я не понимаю о чем с ними разговаривать, надеюсь я не сильно потратил его драгоценнейшее время, вдруг он второй фейсбук придумал, а тут отвлекся на проблему маленькго характера
Так люди сразу и поняли, что некто "Вася Пупкин", просто, как можно быстрее, пытается привлечь такими заголовками к своей детской проблеме. Ты пошутил! И с тобой пошутили!!!
Да успокойтесь, взрослые дяди, а то я по настоящему шутить начну)ALEGYR, ты то вообще кто?, с тобой вообще никто не разговаривает)
"Так чего тогда обижаться на то что дилетанту ответили дилетанты?"
Проблема в том, что я признаю свою бестолковость в этом вопросе, а другие, считают себя великими спецами и великими кодерами
Если признаешь свою бестолковость, то и начинать надо скромнее, а не с использования современных маркетинговых технологий. Люди все-таки тут тусуются и делятся СВОИМ опытом, а не обучают, чтобы уже не один год, каждый день, по нескольку раз в день, серьезно решать НЕ серьезные задачки!
"Так чего тогда обижаться на то что дилетанту ответили дилетанты?"
Проблема в том, что я признаю свою бестолковость в этом вопросе, а другие, считают себя великими спецами и великими кодерами
Если признаешь свою бестолковость, то и начинать надо скромнее, а не с использования современных маркетинговых технологий. Люди все-таки тут тусуются и делятся СВОИМ опытом, а не обучают, чтобы уже не один год, каждый день, по нескольку раз в день, серьезно решать НЕ серьезные задачки!
Я же тебе еще раз говорю, с тобой тут диалог вообще никто не ведет, ты можешь не писать твои сообщения вообще не интересны. По крайней мере моя задача, как маркетолога выполнена, вы заинтересовались. А писать в духе "пфф, 2+2 - это интересно? это интересная логическая задача", бля*ь да, мне интересно, для меня это какой то шаг в изучении чего то нового, если кто то из вас сверх разум и ему это соответственно не интересно, могли сразу закрыть тему?
Да успокойтесь, взрослые дяди, а то я по настоящему шутить начну)
Это будет интересно!
В отличие от тебя, Я тут уже почти "старик", и делюсь своим опытом с салагой!
Да кто-нибудь, вынесите этого старика уже вперед ногами с этого форума, сколько раз мне ему написать, что его сообщения не интересны? это же простая логика, еще проще чем моя задача, да мистер боинг?)
Я же тебе еще раз говорю, с тобой тут диалог вообще никто не ведет, ты можешь не писать твои сообщения вообще не интересны. По крайней мере моя задача, как маркетолога выполнена, вы заинтересовались.
Не заинтересовались, а развлеклись!
Это повод для развлечения и проведения досуга!
Когда мне что-то было интересно, я читал книжки, а не бежал в двор, чтобы у взрослых пацанов узнать "откуда беруться дети".
Когда мне что-то было интересно, я читал книжки, а не бежал в двор, чтобы у взрослых пацанов узнать "откуда беруться дети".
Ты по этому до сих пор девственник? Слишком много теории было?
Да кто-нибудь, вынесите этого старика уже вперед ногами с этого форума, сколько раз мне ему написать, что его сообщения не интересны? это же простая логика, еще проще чем моя задача, да мистер боинг?)
ого, делаешь успехи. 20 минут на форуме, а уже кое-что понял. АЛЕГИР - старик не плохой. но отвязаться от него невозможно. Единственный вариант - просто не вступать в разговор.
Да кто-нибудь, вынесите этого старика уже вперед ногами с этого форума, сколько раз мне ему написать, что его сообщения не интересны?
Поздно! Ты уже успел нахамить старшим! И они уже теперь просто смотрят как первоклашка бодается с второклашкой!
Если бы у тебя было нормально с логикой, то ты давно-бы нажал на кнопочку "выход", и занялся бы реализоцией тех советов, которые ты тут уже получил!
yozhikovd, ты спашивал меня "Кто я такой?", вот тебе и ответ
Видишь, сынок, я на форуме почти месяц, а меня тут уже здешние деды уважают!
А все потому, что я не использую современные маркетинговые уловки, и, постаринке, взрослым людям задаю взрослые вопросы!!!
Больше !!!!!!, Алегир, в сообщениях!!!!!!!
Ты по этому до сих пор девственник? Слишком много теории было?
Дружок, не надо так шутить! Это я с виду девственник, а по жизни могу оказазаться твоим биологическим папой!
Я и не шучу, шутила твоя мамка, когда говорила твоему бате, что сделает аборт от него) так смешно, когда вотаны или взрослые люди, пытаются тролить
Очень интересная математическая проблема - 2+2 ?
А мы таки покупаем или продаем?
Веселуха - ёжик троллит тролля :) Я уже во всеоружии:
Я и не шучу, шутила твоя мамка, когда говорила твоему бате, что сделает аборт от него) так смешно, когда вотаны или взрослые люди, пытаются тролить
Ну ладно, твоим биологическим папой я действтительно быть не могу! Вижу не мои гены!