Состояние кнопки меняется случайным образом

У меня есть кнопка, подключенная к Arduino, но она срабатывает случайным образом.

У меня есть один контакт кнопки, подключенный к контакту 2 на Arduino, а другой подключен к земле.

void setup() {
    Serial.begin(9600);

    pinMode(2, INPUT);
}

void loop() {
    Serial.println(digitalRead(2));
}

Я ожидаю, что он будет постоянно печатать 1 и переходить к 0, когда я нажимаю кнопку, но иногда он показывает 0, даже если я не прикасаюсь к нему.

, 👍15


2 ответа


19

Когда кнопка подключена в этой конфигурации, вход является так называемым плавающим, то есть это не 0 или 1. Когда кнопка нажата, она подключается к земле, так что это определенно 0, но когда он не нажат, мы не знаем значение вывода.

Подтягивающий резистор

Нам нужно включить так называемый "подтягивающий" резистор, чтобы поднять сигнал до логической 1, когда кнопка не нажата.

подтягивающий резистор

Изображение из Sparkfun

Это означает, что когда кнопка не нажата, Arduino считывает логическую 1. Когда кнопка нажата, ток течет через резистор на землю, а Arduino считывает логическую 0.

Внутренний подтягивающий резистор

У Arduino также есть внутренние подтягивающие резисторы, поэтому вам не обязательно добавлять в схему дополнительный компонент. Есть несколько способов использовать это.

Раньше это приходилось делать так:

pinMode(pin, INPUT);           // устанавливаем пин на вход
digitalWrite(pin, HIGH);       // включаем подтягивающие резисторы

Теперь мы можем сделать это просто одной строкой:

pinMode(pin, INPUT_PULLUP);

Это включает подтягивающий резистор 20k на этом контакте. Ввод больше не будет плавающим, когда кнопка не нажата.

Примечание. Это работает, только если другой конец подключен к земле.

,

Стоит отметить, что та же идея работает и для подтягивающих резисторов; т.е. резистор обычно вытягивает штифт в низкий уровень, но нажатие на кнопку переводит его в высокий уровень. Очевидно, что он должен быть внешним, поскольку на стандартных Arduinos нет внутреннего вытягивания вниз., @Peter Bloomfield

Я не знаю, можете ли вы сейчас проверить обмен стеками Arduino, но я не могу понять схему выводов. У меня есть кнопка, на одном конце которой 5 В, а на другом конце мой провод подключен к Arduino и резистору 20 кОм, который подключен к земле. Тем не менее я получаю случайное значение, когда кнопка не нажата. Когда он нажат, я всегда получаю 1, @Siddharth Agrawal


1

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

  1. При использовании однополюсного переключателя отсутствует подтягивающий или понижающий резистор.

Входы микроконтроллера не должны быть плавающими. Это может привести к неожиданным состояниям ввода. Вместо этого входы должны быть подключены к земле или к источнику положительного напряжения микроконтроллера, обычно напрямую или через резистор. При использовании однополюсного переключателя, подключенного к земле, обычно используется подтягивающий резистор. Или понижающий резистор при использовании переключателя SPST, подключенного к источнику положительного напряжения микроконтроллера. Не все микроконтроллеры имеют встроенные повышающие или понижающие резисторы. У некоторых есть только одно или другое. В этих случаях может потребоваться внешний резистор. Следует подумать об использовании микроконтроллеров, которые имеют встроенные подтягивающие или понижающие резисторы. Фактическое значение сопротивления этих встроенных резисторов варьируется (не может тщательно контролироваться). Это нормально для большинства случаев. Однако, если требуется определенное значение, лучше всего использовать вместо него внешние резисторы.

  1. Длинные провода между микроконтроллером и переключателем.

В более длинных проводах с большей вероятностью возникнут неожиданные токи из-за внешних электрических помех. Возможно, провода достаточно длинные, а окружающая среда, в которой они находятся, достаточно электрически шумна, чтобы создавать токи, которые изменят напряжение на повышающем или понижающем резисторе. И, в свою очередь, изменить значение входа микроконтроллера. Чем выше значение резистора, тем более вероятно, что это произойдет. Однако чем меньшее значение резистора выбрано, тем больше мощности требуется, когда SPST-переключатель замкнут. Обычно это проблема при работе от батарей. Существует множество аспектов смягчения воздействия электрического шума. И отвлечет нас от темы. Вместо этого, если необходимы длинные провода, рассмотрите возможность использования схемы «тормозить перед соединением». Переключатель SPDT, который подключает входной контакт микроконтроллера непосредственно к земле или положительному напряжению питания микроконтроллера. Для этого к переключателю потребуется проложить 3, а не 2 провода.

Последние слова: будьте осторожны, не подключайте подтягивающие резисторы или переключатели к напряжениям, превышающим положительное напряжение питания микроконтроллера! Некоторые платы Arduino регулируют более высокое напряжение до более низкого перед подачей питания на микроконтроллер. Например, плата Arduino, работающая от источника питания USB с напряжением 5 В, может иметь микроконтроллер, который фактически работает от напряжения 3,3 В. В таком случае используйте напряжение 3,3 В, подаваемое на микроконтроллер, при подключении подтягивающего резистора или переключателя.

,

Добавлен этот ответ, поскольку существующий ответ не распространяется на длинные провода/электрический шум, приводящий к неожиданным результатам, и использование переключателей SPDT вместо переключателя SPST с подтягивающим резистором., @st2000