Доброго времени коллеги, не могу решить задачу: На арду Нано повешать 12 диодов и 12 кнопок. Решил вешать диод и кнопу на один пин Смысл работы такой: Зажечь светодиод от рандома, ждать 3 сек, нажать соответствующую кнопку, считать нажатие, ... дальше сам) Но вот незадача, Delay вешает контроллер и не считывает нажатие, millis не ждет 3 секунды, Ниже представлю код, может где то я ошибся? И получается: или цикл пробегает и я не успеваю нажать кнопу или вешается делеем и не считывает нажатие Если не использовать рандом а прописать +5 на конкретный пин, то нажатие кнопки считывается.
Код:
long randNumber; unsigned long timing; int p, r, d; void setup() { Serial.begin(9600); for (p = 4; p < 9; p++) {pinMode(p, INPUT_PULLUP);} pinMode(17, OUTPUT); for (d = 4; d < 9; d++) {digitalWrite(d, LOW);} } void loop() { if (millis() - timing > 3000) { // Вместо 10000 подставьте нужное вам значение паузы timing = millis(); label: randNumber = random(4, 8); // Выбрать число
if (r == randNumber) {goto label;} //что бы рандом не повторялся r = randNumber; //delay(3000); digitalWrite(randNumber, HIGH); // вкл светодиод bool buttonState = digitalRead(randNumber); // считать состояние пина в переменную для дальнейшего определения нажатия кнопки путем падения напряжения при замыкании пина на землю
if (!buttonState) { // замкнуть пин на землю - определить нажатие кнопки digitalWrite(randNumber, LOW); }}}
"Совмещенная" со светиком кнопа? Это только если активный статус вывода МК будет 0 (когда светик горит). Иначе (при активной 1) сделаем козу вывода. При условии, что горит он не непрерывно, а в некоем подобии ШИМ - даются интервалы для опроса линии "на ввод", во время которых кнопа может быть замкнута и соответственно счтиано ее состояние. Штука довольно нудная, учитывая практически одновременное сканирование линий на вывод и на ввод. Но вполне решаемая. Правда "побочный эффект" - при нажатии кнопы ВСЕГДА зажжется соответствующий светик.
нужно просто пожертвовать одним входом, куда завести общий всех кнопок, с подтяжкой резистором к плюсу или минусу, лишь бы светодиоды при нажатии не светились. и дальше просто:
старт 1 N = 0 cтарт 2 светодиод(N) = 0 (или 1, то есть включили/выключили) если вход кнопок не равен светодиод(N), то кнопка(N) нажата N = N +1 проверяем N == 12? если да, возврат на старт 1, если нет - на старт 2
ошибся
Последний раз редактировалось Martian Вт авг 15, 2023 13:29:57, всего редактировалось 1 раз.
нужно просто пожертвовать одним входом, куда завести общий всех кнопок, с подтяжкой резистором к плюсу или минусу, лишь бы светодиоды при нажатии не светились. и дальше просто:
старт 1 N = 0 cтарт 2 светодиод(N) = 0 (или 1, то есть включили/выключили) если вход кнопок не равен светодиод(N), то кнопка(N) нажата N = N +1 проверяем N == 12? если да, возврат на старт 1, если нет - на старт 2
В любом случае или сканирование как при динамической развертке или вариант ШИМ при статике. Но оба варианта при нажатии кнопы "зажгут" соответствующий светик.
что-то я сам запутался. может, так: ловить нажатие кнопки во время гашения: общий вход кнопок подтягиваем к + резистором. Прогоняем 0 по всем светодиодам, отлавливаем его появление на входе кнопок.
Последний раз редактировалось Martian Вт авг 15, 2023 13:05:27, всего редактировалось 1 раз.
о, оказывается, я отправил сообщение, а потом правил. Так-с, пора спать
Не. не получается всё равно. Перетащить поразрядный принцип на посегментный не выйдет, наверное. Можно решить для частного случая, когда вкл-выкл каждого светодиода более-менее равномерно распределены.
Добавлено after 12 minutes 12 seconds: еще немного подумав, я рискну предложить пожертвовать ещё одним выходом для отключения общего светодиодов. Тогда строб по кнопкам можно прогонять совершенно легко и определять нажатие любой и даже комбинаций. (токоограничивающий резистор забыл)
Добавлено after 13 minutes 44 seconds: Вообще, надо иначе сформулировать задачу: адресация 12 светодиодов и 12 кнопок с минимальным количеством портов мк (возможно, это всего 7, максимум по выше предложенному варианту - 14)
Странный код. В настройке вы порты настраиваете на вход с подтяжкой, тут же пытаетесь в них записывать что-то. Делать надо не так: порт периодически нужно переключать с входа на выход. Когда порт на входе, его и нужно опрашивать.
_________________ Не важно чем все начнется. Важно чем кончится!
Стандартный прием для АВРок (адуринок на их базе) В порт записывается 0, а переключением с режима вывода на режим ввода с "подтяжкой" получаем на линии то 0 то 1 и при 1 ввод данных ("двунаправленность")
Даааа! Это прямо палочка-выручалочка. При грамотном использовании работает как часики и память не жрет абсолютно. Особенно хорошо с мелкожопыми контроллерами типа тини13 идет - когда хочется много и недорого. Одна эта мелочь заменяет ораву сдвиговых регистров, не требует обвязки громоздкой и позволяет творить содомЪ. Но ардуинщикам скорее всего она не зайдет, ибо библиотек под эту микросхемку я не нашел в свое время. А так - годнота неоспоримая.
Одна эта мелочь заменяет ораву сдвиговых регистров.
Два я именно так и делаю. но... хоть и не орава, но все же сдвиговые регистры требуют 3 ноги, а эта 2, плюс кнопки, так что, она, конечно, функциональней. Когда у меня регистры кончатся, прикуплю этих.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения