Состояние ввода остается HIGH, когда функция, вызываемая с помощью ввода, также использует тот же ввод для вызова другой функции

button input loop functions

Я пишу проект в стиле "выбери свое собственное приключение" для классного проекта. Мой Arduino Uno оснащен 16-значным ЖК-дисплеем и двумя кнопками с выдвижными резисторами. Я хочу, чтобы каждая функция отображала текст на ЖК-дисплее, а затем принимала два пользовательских ввода, да или Нет, с помощью кнопок, а затем вызывала другую функцию, соответствующую нажатию ввода. Каждая последующая функция также будет принимать два входных сигнала, чтобы затем вызвать следующую функцию в серии, и так далее.

Моя проблема заключается в том, что после первого нажатия кнопки ее состояние не меняется. Когда вызывается question1() и пользователь нажимает button1, вызывается question2. Однако функция запускается и никогда не ожидает ввода данных пользователем, и question4 вызывается сразу, потому что состояние button1, по-видимому, остается ВЫСОКИМ после первого нажатия.

Что я упускаю из виду? Есть ли лучший способ собирать данные пользователя? Мои кнопки правильно подключены, а резистор опущен на землю, так что моя проблема, должно быть, связана с моим кодом.

Заранее спасибо за любую помощь.

void loop()
{
  question1();
}

void question1()
{ 
  button1State = digitalRead(9);
  button2State = digitalRead(8);
  if (q1 == false)
  {
    text1();
  }

  if (button1State == HIGH)
  {
    question2();
  }

  if (button2State == HIGH)
  {
    question3();
  }
}

void question2()
{ 
  button1State = digitalRead(9);
  button2State = digitalRead(8);
  if (q2 == false)
  {
    text2();
  }

  if (button1State == HIGH)
  {
    question4();
  }

  if (button2State == HIGH)
  {
    question5();
  }
}

, 👍2

Обсуждение

Вы считываете (физические) состояния кнопок в одном месте, внутри loop () с помощью button1State = digitalRead (9); .... Как только вы вызываете question1 () из loop(), значения buttonState1 и buttonState2 фиксируются и будут не изменяйте, пока ваш код не вернется в loop (), чтобы повторно прочитать физическое состояние кнопки в buttonState1 и buttonState2., @StarCat

Я считывал состояние кнопки в начале каждой функции, и, похоже, это ничего не давало. Позвольте мне повторить это, спасибо, @Snyper

Да, поведение все то же самое. Поскольку состояние кнопки является условием моего оператора если, возможно, это то, что задерживает это?, @Snyper

подумайте об этом .... как вы обнаруживаете два нажатия одной кнопки?, @jsotola

@jsotola Да, это как раз то, что я пытаюсь понять, @Snyper

какова последовательность событий, когда вы дважды нажимаете кнопку?, @jsotola

Если она нажата дважды, ничего не должно произойти до тех пор, пока не будет запущена функция textX (), после чего снова придет время для пользовательского ввода, и нажатие кнопки вызовет следующую функцию, @Snyper

Вы должны дождаться, пока кнопка будет отпущена. В настоящее время вы ждете нажатия кнопки в вопросе 1, и это нормально. После нажатия кнопки 1 вы переходите к вопросу 2, но поскольку кнопка все еще нажата, она немедленно переходит к вопросу 4., @Gerben

Предлагаете ли вы использовать состояние кнопки для присвоения значения переменной, а затем использовать эту переменную для вызова соответствующей функции?, @Snyper

Вы хотите подсчитать каждое нажатие кнопки один раз. Таким образом, вы не хотите искать ВЫСОКИЙ вывод кнопки (так как он будет оставаться высоким в течение довольно долгого времени, например, десятки миллисекунд, возраст для микроконтроллера), вы хотите искать переход от НИЗКОГО к ВЫСОКОМУ. Кроме того, вам нужно учитывать отскок кнопки, поэтому вам нужно отменить блокировку (вы можете это сделать в Google). Я предлагаю вам взглянуть на библиотеку [Bounce2] (https://github.com/thomasfredericks/Bounce2 ), что очень поможет при считывании механических кнопок. Попробуйте привести примеры, чтобы понять, как используется библиотека, @chrisl

[Этот ответ](https://arduinoprosto.ru/q/74803/read-state-from-button-to-check-if-clicked ) также может помочь вам. Наверняка есть еще много вопросов о кнопках чтения на этом сайте. Вы можете просто искать их., @chrisl

прочитать пуговицу не так просто, как кажется на первый взгляд. а для обнаружения нескольких кнопок, длительного нажатия и т.д. код в sketch усложняется. Я пользуюсь библиотекой. Bounce2 поддерживается Томасом О Фредериксом, @Juraj


1 ответ


Лучший ответ:

2

После считывания состояния кнопки должна быть задержка (), чтобы дать ей время вернуться к НИЗКОМУзначению, dumba **.

У вас уже достаточно функции delay() в ваших функциях textN(), просто проверьте состояние кнопки после вызова этой функции, а не раньше. Код должен быть следующим:

void loop()
{
  question1();
}

void question1()
{ 
  if (q1 == false)
  {
    text1();
  }

  button1State = digitalRead(9);
  button2State = digitalRead(8);

  if (button1State == HIGH)
  {
    question2();
  }

  if (button2State == HIGH)
  {
    question3();
  }
}

void question2()
{ 
  if (q2 == false)
  {
    text2();
  }

  button1State = digitalRead(9);
  button2State = digitalRead(8);

  if (button1State == HIGH)
  {
    question4();
  }

  if (button2State == HIGH)
  {
    question5();
  }
}

Это полностью решает проблему.

,