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

Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вт авг 15, 2023 06:46:22

Сообщение 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);
   }}}
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15679
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

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

Сообщение u37 »

Не обязательно, если поставить ключ. Проблема в другом - ТС поставил на выходе "диоды", на что ему флаг в руки.
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

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

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


ошибся
Последний раз редактировалось Martian Вт авг 15, 2023 13:29:57, всего редактировалось 1 раз.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вт авг 15, 2023 06:46:22

Сообщение 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]

Как тогда определять что нажата правильная кнопка
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15679
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

В любом случае или сканирование как при динамической развертке или вариант ШИМ при статике.
Но оба варианта при нажатии кнопы "зажгут" соответствующий светик.
8)
Реклама
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

что-то я сам запутался.
может, так: ловить нажатие кнопки во время гашения:
общий вход кнопок подтягиваем к + резистором. Прогоняем 0 по всем светодиодам, отлавливаем его появление на входе кнопок.
Последний раз редактировалось Martian Вт авг 15, 2023 13:05:27, всего редактировалось 1 раз.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15679
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Не мудрено то без конкретной схемы ошибиться.
8)
Мы в данном случае вроде "гадалок на кофейной гуще" выступаем.
:tea:
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

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

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

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

Добавлено after 13 minutes 44 seconds:
Вообще, надо иначе сформулировать задачу:
адресация 12 светодиодов и 12 кнопок с минимальным количеством портов мк (возможно, это всего 7, максимум по выше предложенному варианту - 14)
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15679
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Положу "заготовку" для рисовалки типовых адуринкиных схем:
https://img.radiokot.ru/files/20529/37rjtbdpmo.GIF
и файл для splan (закатан в архив)
fishNano328P.zip
(4.61 КБ) 107 скачиваний
:write:
Электрический кот
Аватара пользователя
Сообщения: 1050
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

Сообщение Viper_Snake »

Странный код. В настройке вы порты настраиваете на вход с подтяжкой, тут же пытаетесь в них записывать что-то. Делать надо не так: порт периодически нужно переключать с входа на выход. Когда порт на входе, его и нужно опрашивать.
Не важно чем все начнется. Важно чем кончится!
Друг Кота
Аватара пользователя
Сообщения: 15679
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Стандартный прием для АВРок (адуринок на их базе)
В порт записывается 0, а переключением с режима вывода на режим ввода с "подтяжкой" получаем на линии то 0 то 1 и при 1 ввод данных ("двунаправленность")
8)
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

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

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

Изображение

Это, конечно, не то, что требуется ТС, но мало ли, на будущее...
Вложения
1810281208_TM-Shenzhen-Titan-Micro-Elec-TM1650_C44444.pdf
(463.99 КБ) 91 скачивание
Контактная информация:
OKF
Это не хвост, это антенна
Сообщения: 1430
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Арду, кнопа, светик... Стыдоба!

Код: Выделить всё

  for (int i = 0; i < 3000; i++) {
    pinMode(LED, OUTPUT);
    digitalWrite(LED, HIGH);
    delay(1);
    pinMode(LED, INPUT_PULLUP);
    if (!digitalRead(LED))
      break;
  }
Друг Кота
Аватара пользователя
Сообщения: 15679
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Это с одной кнопкой.
А у топикстартера их за десяток.
Там чуток мудрить надо.
8)
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

кроме того, проблемы кз или изменения состояния светодиода в момент нажатия этот чудесный код не решает.
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 460
Зарегистрирован: Пт фев 17, 2017 11:18:07
Откуда: Ставрополь-Донское

Сообщение pasha_zv »

LIVE - EVIL
Электрический кот
Аватара пользователя
Сообщения: 1050
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

Сообщение 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.
Не важно чем все начнется. Важно чем кончится!
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4463327#p4463327"]Одна эта мелочь заменяет ораву сдвиговых регистров.[/uquote] Два :))
я именно так и делаю. но... хоть и не орава, но все же сдвиговые регистры требуют 3 ноги, а эта 2, плюс кнопки, так что, она, конечно, функциональней. Когда у меня регистры кончатся, прикуплю этих.
Контактная информация:
Электрический кот
Аватара пользователя
Сообщения: 1050
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

Сообщение Viper_Snake »

Martian, Очень рекомендую.
Не важно чем все начнется. Важно чем кончится!
Ответить

Вернуться в «Arduino»