1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

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

Ответить

Автор темы
rss-999
здесь недавно
здесь недавно
Сообщения: 2
Зарегистрирован: 18 сен 2020, 08:42
Имя: Сергей
Страна: Казахстан

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

Сообщение 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) { // Таймер задержки, который не работает
  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);
   }}}

Linkel
осмотрелся
осмотрелся
Сообщения: 124
Зарегистрирован: 30 сен 2017, 21:41
Имя: Тимур
Благодарил (а): 17 раз
Поблагодарили: 8 раз

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

Сообщение Linkel »

Is_LED_On = true; в Setup()

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

void loop() 
{ 
if(Is_LED_On == false)
{
  randNumber = random(4, 8);  // Выбрать число
  if (r == randNumber)
   randNumber = random(4, 8);
  else  
    r = randNumber;
  digitalWrite(randNumber, HIGH);
  Is_LED_On = true;
  timing = millis();
}
else
{
buttonState = digitalRead(randNumber);
if(millis() - timing >= 3000 || buttonState)
  digitalWrite(randNumber, LOW);
  Is_LED_On = false;
}}
:ext_sleep:
Ответить

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