Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить

Ждать пока не нажму кнопу

Вт авг 15, 2023 06:50:11

Доброго времени коллеги, не могу решить задачу:
На арду Нано повешать 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

"Совмещенная" со светиком кнопа?
Это только если активный статус вывода МК будет 0 (когда светик горит). Иначе (при активной 1) сделаем козу вывода.
При условии, что горит он не непрерывно, а в некоем подобии ШИМ - даются интервалы для опроса линии "на ввод", во время которых кнопа может быть замкнута и соответственно счтиано ее состояние.
Штука довольно нудная, учитывая практически одновременное сканирование линий на вывод и на ввод.
Но вполне решаемая.
Правда "побочный эффект" - при нажатии кнопы ВСЕГДА зажжется соответствующий светик.
8)

Re: Ждать пока не нажму кнопу

Вт авг 15, 2023 09:55:50

Не обязательно, если поставить ключ. Проблема в другом - ТС поставил на выходе "диоды", на что ему флаг в руки.

Re: Ждать пока не нажму кнопу

Вт авг 15, 2023 10:47:18

нужно просто пожертвовать одним входом, куда завести общий всех кнопок, с подтяжкой резистором к плюсу или минусу, лишь бы светодиоды при нажатии не светились. и дальше просто:

старт 1
N = 0
cтарт 2
светодиод(N) = 0 (или 1, то есть включили/выключили)
если вход кнопок не равен светодиод(N), то кнопка(N) нажата
N = N +1
проверяем N == 12? если да, возврат на старт 1, если нет - на старт 2


ошибся
Последний раз редактировалось Martian Вт авг 15, 2023 13:29:57, всего редактировалось 1 раз.

Re: Ждать пока не нажму кнопу

Вт авг 15, 2023 12:38:27

нужно просто пожертвовать одним входом, куда завести общий всех кнопок, с подтяжкой резистором к плюсу или минусу, лишь бы светодиоды при нажатии не светились. и дальше просто:

старт 1
N = 0
cтарт 2
светодиод(N) = 0 (или 1, то есть включили/выключили)
если вход кнопок не равен светодиод(N), то кнопка(N) нажата
N = N +1
проверяем N == 12? если да, возврат на старт 1, если нет - на старт 2


Как тогда определять что нажата правильная кнопка

Re: Ждать пока не нажму кнопу

Вт авг 15, 2023 12:53:32

В любом случае или сканирование как при динамической развертке или вариант ШИМ при статике.
Но оба варианта при нажатии кнопы "зажгут" соответствующий светик.
8)

Re: Ждать пока не нажму кнопу

Вт авг 15, 2023 12:59:20

что-то я сам запутался.
может, так: ловить нажатие кнопки во время гашения:
общий вход кнопок подтягиваем к + резистором. Прогоняем 0 по всем светодиодам, отлавливаем его появление на входе кнопок.
Последний раз редактировалось Martian Вт авг 15, 2023 13:05:27, всего редактировалось 1 раз.

Re: Ждать пока не нажму кнопу

Вт авг 15, 2023 13:03:12

Не мудрено то без конкретной схемы ошибиться.
8)
Мы в данном случае вроде "гадалок на кофейной гуще" выступаем.
:tea:

Re: Ждать пока не нажму кнопу

Вт авг 15, 2023 13:32:53

о, оказывается, я отправил сообщение, а потом правил. Так-с, пора спать :)

Не. не получается всё равно. Перетащить поразрядный принцип на посегментный не выйдет, наверное. Можно решить для частного случая, когда вкл-выкл каждого светодиода более-менее равномерно распределены.

Добавлено after 12 minutes 12 seconds:
еще немного подумав, я рискну предложить пожертвовать ещё одним выходом для отключения общего светодиодов. Тогда строб по кнопкам можно прогонять совершенно легко и определять нажатие любой и даже комбинаций.
(токоограничивающий резистор забыл)
Изображение

Добавлено after 13 minutes 44 seconds:
Вообще, надо иначе сформулировать задачу:
адресация 12 светодиодов и 12 кнопок с минимальным количеством портов мк (возможно, это всего 7, максимум по выше предложенному варианту - 14)

Re: Ждать пока не нажму кнопу

Вт авг 15, 2023 14:20:21

Положу "заготовку" для рисовалки типовых адуринкиных схем:
https://img.radiokot.ru/files/20529/37rjtbdpmo.GIF
и файл для splan (закатан в архив)
fishNano328P.zip
(4.61 KiB) Скачиваний: 27

:write:

Re: Ждать пока не нажму кнопу

Вт авг 15, 2023 20:34:23

Странный код. В настройке вы порты настраиваете на вход с подтяжкой, тут же пытаетесь в них записывать что-то. Делать надо не так: порт периодически нужно переключать с входа на выход. Когда порт на входе, его и нужно опрашивать.

Re: Ждать пока не нажму кнопу

Вт авг 15, 2023 20:38:23

Стандартный прием для АВРок (адуринок на их базе)
В порт записывается 0, а переключением с режима вывода на режим ввода с "подтяжкой" получаем на линии то 0 то 1 и при 1 ввод данных ("двунаправленность")
8)

Re: Ждать пока не нажму кнопу

Вт авг 15, 2023 21:52:28

Viper_Snake в другой теме упомянул TM1650.

32 светодиодика и 32 кнопки :))

Изображение

Это, конечно, не то, что требуется ТС, но мало ли, на будущее...
Вложения
1810281208_TM-Shenzhen-Titan-Micro-Elec-TM1650_C44444.pdf
(463.99 KiB) Скачиваний: 18

Re: Ждать пока не нажму кнопу

Ср авг 16, 2023 12:01:30

Арду, кнопа, светик... Стыдоба!
Код:
  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

Это с одной кнопкой.
А у топикстартера их за десяток.
Там чуток мудрить надо.
8)

Re: Ждать пока не нажму кнопу

Ср авг 16, 2023 21:02:14

кроме того, проблемы кз или изменения состояния светодиода в момент нажатия этот чудесный код не решает.

Re: Ждать пока не нажму кнопу

Ср авг 16, 2023 22:55:29

TM1637
https://aliexpress.ru/item/100500426559 ... 8568704054

Re: Ждать пока не нажму кнопу

Чт авг 17, 2023 01:35:36

Viper_Snake в другой теме упомянул TM1650....

Даааа! Это прямо палочка-выручалочка. При грамотном использовании работает как часики и память не жрет абсолютно. Особенно хорошо с мелкожопыми контроллерами типа тини13 идет - когда хочется много и недорого. Одна эта мелочь заменяет ораву сдвиговых регистров, не требует обвязки громоздкой и позволяет творить содомЪ. Но ардуинщикам скорее всего она не зайдет, ибо библиотек под эту микросхемку я не нашел в свое время. А так - годнота неоспоримая.

Добавлено after 1 minute 17 seconds:
TM1637

Тоже хороший вариант, но она крупнее TM1650.

Re: Ждать пока не нажму кнопу

Чт авг 17, 2023 01:42:49

Одна эта мелочь заменяет ораву сдвиговых регистров.
Два :))
я именно так и делаю. но... хоть и не орава, но все же сдвиговые регистры требуют 3 ноги, а эта 2, плюс кнопки, так что, она, конечно, функциональней. Когда у меня регистры кончатся, прикуплю этих.

Re: Ждать пока не нажму кнопу

Чт авг 17, 2023 01:49:32

Martian, Очень рекомендую.
Ответить