Проблемы с кнопками

Я использовал https://wokwi.com/ для изучения Arduino, и у меня возникла проблема, которая, похоже, происходит независимо от того, что я делаю. Я пытаюсь настроить кнопку и светодиод. Конечная цель здесь — настроить его так, чтобы, когда я нажимаю кнопку и отпускаю ее, светодиод мигал, как указатель поворота в автомобиле. Когда я нажимаю его вниз и снова отпускаю, светодиод должен перестать мигать. Я пробовал массу разного кода, даже используя код, скопированный и вставленный непосредственно с сайта Arduino. В конечном итоге происходит то, что кнопка ненадежна. Иногда кнопка нажимается, иногда не регистрируется. Это очень странное поведение. Я читал об эффекте подпрыгивания, но любой код, который я ввел для игнорирования подпрыгивания, похоже, не оказал никакого влияния на систему. Почему кнопки такие ненадежные? Я знаю, что в реальной жизни это не так, потому что я могу печатать это, предположительно, с помощью кнопок на клавиатуре. Что я делаю не так??

Вот пример. Кнопка совершенно непредсказуема. Почему он так себя ведет?

int state = 0;

void setup()
{
  pinMode(9, OUTPUT);
  pinMode(6, INPUT);
}

void loop()
{
  if (digitalRead(6)) {
    state = !state;
  }
  digitalWrite(9, state);
}

, 👍2

Обсуждение

проблема в строке 20, @jsotola

Я насчитал 15 строк, @wgm

никакое другое предположение было невозможно, не видя кода, @jsotola

у вас логическая ошибка в вашем коде... код похож на "если на улице темно, то щелкните выключателем"... вы будете включать и выключать свет всю ночь напролет, а свет горит шанс остаться включенным на весь день, @jsotola

`if (!digitalRead(6)) { состояние = !состояние; }` Это правильно?, @wgm

подумайте об этом... если кнопка нажата, то state изменится... это происходит 50 000 раз в секунду, один раз на каждой итерации loop()... state будет переключаться взад и вперед, пока вы не отпустить кнопку, @jsotola

вам нужно "запомнить" состояние кнопки между итерациями loop()... только если состояние кнопки изменится, то обновить состояние светодиода, @jsotola


2 ответа


5

У вас неправильно подключена кнопка. Ваш резистор подключен к сигналу, идущему на вывод. С контакта должно поступать напряжение 5В. Кнопка должна быть подключена непосредственно к контакту и заземлению. Или вы можете использовать INPUT_PULLUP в pinMode вместо INPUT и полностью исключить резистор.

Ваш код должен проверять, что вывод кнопки находится в состоянии НИЗКИЙ, а не ВЫСОКИЙ. Когда вы нажмете кнопку, на ней будет написано LOW. В ненажатом состоянии будет отображаться ВЫСОКИЙ. Это обычный способ подключения кнопок.

Также обратите внимание, что ваша функция цикла() будет повторяться тысячи раз в секунду. Пока вы все еще держите палец на кнопке, она будет переключаться между состояниями. Это означает, что каждый раз, когда вы нажимаете кнопку, состояние меняется несколько десятков тысяч раз, и нет реального способа узнать, в каком состоянии оно будет, когда вы наконец уберете палец с кнопки.

Вам следует посмотреть «Пример изменения состояния»; в среде разработки Arduino. Он показывает, как отслеживать предыдущее состояние кнопки, чтобы можно было реагировать один раз на каждое нажатие.

,

Знаете ли вы, что я могу Google, чтобы найти этот пример изменения состояния? Возникли проблемы с поиском. Спасибо за объяснение, @wgm

Я думаю, что Delta_G означает это: https://docs.arduino.cc/built-in-examples/digital/StateChangeDetection, @chrisl

@wgm, откройте Arduino IDE. Перейдите в меню «Файл». Файл->Примеры->Цифровой. Обнаружение изменения состояния будет ближе к середине. Если вы погуглите «Пример изменения состояния Arduino», вы будете завалены информацией и учебными пособиями. Наверняка одним из них является ваша скорость., @Delta_G

*Знаете, что я могу найти в Google, чтобы найти этот пример изменения состояния* - см. мой сайт: http://gammon.com.au/switches - там также говорится о переходах, @Nick Gammon


1

Это мой первый ответ на этой платформе, так что простите за ошибки :P

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

Схема подключения кнопок

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

Код для кнопок -

#define btnPinYellow 6
#define btnPinGreen 7
#define btnPinBlue 8
#define btnPinRed 9
#define btnPinBlack 10

void setup() {
 pinMode(btnPinYellow, INPUT_PULLUP);
 pinMode(btnPinGreen, INPUT_PULLUP);
 pinMode(btnPinBlue, INPUT_PULLUP);
 pinMode(btnPinRed, INPUT_PULLUP);
 pinMode(btnPinBlack, INPUT_PULLUP);
 Serial.begin(9600);
}

Определив входной контакт кнопки как INPUT_PULLUP, контакт теперь находится в активном состоянии HIGH. Когда мы нажимаем кнопку, кнопка переходит в состояние LOW. Это также должно устранить неустойчивое поведение кнопки, с которым вы сталкивались. Вы можете проверить это с помощью последовательного монитора.

Надеюсь, это решит вашу проблему ^_^

,