Страница 1 из 2
Ждать пока не нажму кнопу
Добавлено: Вт авг 15, 2023 06:50:11
rss-999
Доброго времени коллеги, не могу решить задачу:
На арду Нано повешать 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);
}}}
Re: Ждать пока не нажму кнопу
Добавлено: Вт авг 15, 2023 09:09:18
BOB51
"Совмещенная" со светиком кнопа?
Это только если активный статус вывода МК будет 0 (когда светик горит). Иначе (при активной 1) сделаем козу вывода.
При условии, что горит он не непрерывно, а в некоем подобии ШИМ - даются интервалы для опроса линии "на ввод", во время которых кнопа может быть замкнута и соответственно счтиано ее состояние.
Штука довольно нудная, учитывая практически одновременное сканирование линий на вывод и на ввод.
Но вполне решаемая.
Правда "побочный эффект" - при нажатии кнопы ВСЕГДА зажжется соответствующий светик.

Re: Ждать пока не нажму кнопу
Добавлено: Вт авг 15, 2023 09:55:50
u37
Не обязательно, если поставить ключ. Проблема в другом - ТС поставил на выходе "диоды", на что ему флаг в руки.
Re: Ждать пока не нажму кнопу
Добавлено: Вт авг 15, 2023 10:47:18
Martian
нужно просто пожертвовать одним входом, куда завести общий всех кнопок, с подтяжкой резистором к плюсу или минусу, лишь бы светодиоды при нажатии не светились. и дальше просто:
старт 1
N = 0
cтарт 2
светодиод(N) = 0 (или 1, то есть включили/выключили)
если вход кнопок не равен светодиод(N), то кнопка(N) нажата
N = N +1
проверяем N == 12? если да, возврат на старт 1, если нет - на старт 2
ошибся
Re: Ждать пока не нажму кнопу
Добавлено: Вт авг 15, 2023 12:38:27
rss-999
[uquote="Martian",url="/forum/viewtopic.php?p=4462360#p4462360"]нужно просто пожертвовать одним входом, куда завести общий всех кнопок, с подтяжкой резистором к плюсу или минусу, лишь бы светодиоды при нажатии не светились. и дальше просто:
старт 1
N = 0
cтарт 2
светодиод(N) = 0 (или 1, то есть включили/выключили)
если вход кнопок не равен светодиод(N), то кнопка(N) нажата
N = N +1
проверяем N == 12? если да, возврат на старт 1, если нет - на старт 2[/uquote]
Как тогда определять что нажата правильная кнопка
Re: Ждать пока не нажму кнопу
Добавлено: Вт авг 15, 2023 12:53:32
BOB51
В любом случае или сканирование как при динамической развертке или вариант ШИМ при статике.
Но оба варианта при нажатии кнопы "зажгут" соответствующий светик.

Re: Ждать пока не нажму кнопу
Добавлено: Вт авг 15, 2023 12:59:20
Martian
что-то я сам запутался.
может, так: ловить нажатие кнопки во время гашения:
общий вход кнопок подтягиваем к + резистором. Прогоняем 0 по всем светодиодам, отлавливаем его появление на входе кнопок.
Re: Ждать пока не нажму кнопу
Добавлено: Вт авг 15, 2023 13:03:12
BOB51
Не мудрено то без конкретной схемы ошибиться.
Мы в данном случае вроде "гадалок на кофейной гуще" выступаем.

Re: Ждать пока не нажму кнопу
Добавлено: Вт авг 15, 2023 13:32:53
Martian
о, оказывается, я отправил сообщение, а потом правил. Так-с, пора спать
Не. не получается всё равно. Перетащить поразрядный принцип на посегментный не выйдет, наверное. Можно решить для частного случая, когда вкл-выкл каждого светодиода более-менее равномерно распределены.
Добавлено after 12 minutes 12 seconds:
еще немного подумав, я рискну предложить пожертвовать ещё одним выходом для отключения общего светодиодов. Тогда строб по кнопкам можно прогонять совершенно легко и определять нажатие любой и даже комбинаций.
(токоограничивающий резистор забыл)
Добавлено after 13 minutes 44 seconds:
Вообще, надо иначе сформулировать задачу:
адресация 12 светодиодов и 12 кнопок с минимальным количеством портов мк (возможно, это всего 7, максимум по выше предложенному варианту - 14)
Re: Ждать пока не нажму кнопу
Добавлено: Вт авг 15, 2023 14:20:21
BOB51
Положу "заготовку" для рисовалки типовых адуринкиных схем:
https://img.radiokot.ru/files/20529/37rjtbdpmo.GIF
и файл для splan (закатан в архив)

Re: Ждать пока не нажму кнопу
Добавлено: Вт авг 15, 2023 20:34:23
Viper_Snake
Странный код. В настройке вы порты настраиваете на вход с подтяжкой, тут же пытаетесь в них записывать что-то. Делать надо не так: порт периодически нужно переключать с входа на выход. Когда порт на входе, его и нужно опрашивать.
Re: Ждать пока не нажму кнопу
Добавлено: Вт авг 15, 2023 20:38:23
BOB51
Стандартный прием для АВРок (адуринок на их базе)
В порт записывается 0, а переключением с режима вывода на режим ввода с "подтяжкой" получаем на линии то 0 то 1 и при 1 ввод данных ("двунаправленность")

Re: Ждать пока не нажму кнопу
Добавлено: Вт авг 15, 2023 21:52:28
Martian
Viper_Snake в другой теме упомянул TM1650.
32 светодиодика и 32 кнопки
Это, конечно, не то, что требуется ТС, но мало ли, на будущее...
Re: Ждать пока не нажму кнопу
Добавлено: Ср авг 16, 2023 12:01:30
OKF
Арду, кнопа, светик... Стыдоба!
Код: Выделить всё
for (int i = 0; i < 3000; i++) {
pinMode(LED, OUTPUT);
digitalWrite(LED, HIGH);
delay(1);
pinMode(LED, INPUT_PULLUP);
if (!digitalRead(LED))
break;
}
Re: Ждать пока не нажму кнопу
Добавлено: Ср авг 16, 2023 18:20:29
BOB51
Это с одной кнопкой.
А у топикстартера их за десяток.
Там чуток мудрить надо.

Re: Ждать пока не нажму кнопу
Добавлено: Ср авг 16, 2023 21:02:14
Martian
кроме того, проблемы кз или изменения состояния светодиода в момент нажатия этот чудесный код не решает.
Re: Ждать пока не нажму кнопу
Добавлено: Ср авг 16, 2023 22:55:29
pasha_zv
Re: Ждать пока не нажму кнопу
Добавлено: Чт авг 17, 2023 01:35:36
Viper_Snake
[uquote="Martian",url="/forum/viewtopic.php?p=4462780#p4462780"]Viper_Snake в другой теме упомянул TM1650....[/uquote]
Даааа! Это прямо палочка-выручалочка. При грамотном использовании работает как часики и память не жрет абсолютно. Особенно хорошо с мелкожопыми контроллерами типа тини13 идет - когда хочется много и недорого. Одна эта мелочь заменяет ораву сдвиговых регистров, не требует обвязки громоздкой и позволяет творить содомЪ. Но ардуинщикам скорее всего она не зайдет, ибо библиотек под эту микросхемку я не нашел в свое время. А так - годнота неоспоримая.
Добавлено after 1 minute 17 seconds:
[uquote="pasha_zv",url="/forum/viewtopic.php?p=4463284#p4463284"]TM1637[/uquote]
Тоже хороший вариант, но она крупнее TM1650.
Re: Ждать пока не нажму кнопу
Добавлено: Чт авг 17, 2023 01:42:49
Martian
[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4463327#p4463327"]Одна эта мелочь заменяет ораву сдвиговых регистров.[/uquote] Два

я именно так и делаю. но... хоть и не орава, но все же сдвиговые регистры требуют 3 ноги, а эта 2, плюс кнопки, так что, она, конечно, функциональней. Когда у меня регистры кончатся, прикуплю этих.
Re: Ждать пока не нажму кнопу
Добавлено: Чт авг 17, 2023 01:49:32
Viper_Snake
Martian, Очень рекомендую.