Доброго времени коллеги, не могу решить задачу: На арду Нано повешать 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, плюс кнопки, так что, она, конечно, функциональней. Когда у меня регистры кончатся, прикуплю этих.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения