Состояние ввода остается HIGH, когда функция, вызываемая с помощью ввода, также использует тот же ввод для вызова другой функции
Я пишу проект в стиле "выбери свое собственное приключение" для классного проекта. Мой 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();
}
}
@Snyper, 👍2
Обсуждение1 ответ
Лучший ответ:
После считывания состояния кнопки должна быть задержка (), чтобы дать ей время вернуться
к НИЗКОМУ
значению, 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();
}
}
Это полностью решает проблему.
- Как повторить другое действие внутри цикла?
- Кнопка выхода из текущего цикла
- Обнаружение нажатия кнопки в цикле
- Как сделать так, чтобы мой пьезо-зуммер гудел только один раз без повторения?
- Непрерывно запускайте функцию световой последовательности в операторе if
- Как мне подключить 5 кнопок к ардуино, чтобы я мог использовать наименьшее количество входов, все кнопки подключены к земле
- Выполнить функцию цикла из основного цикла()
- Rasberry Pi, управляющий Arduino - считывает "призрачный" вход - не завершает логический цикл
Вы считываете (физические) состояния кнопок в одном месте, внутри
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