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

14

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

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

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

    pinMode(2, INPUT);
}

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

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

sachleen
источник

Ответы:

17

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

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

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

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

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

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

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

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

Раньше вы делали это так:

pinMode(pin, INPUT);           // set pin to input
digitalWrite(pin, HIGH);       // turn on pullup resistors

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

pinMode(pin, INPUT_PULLUP);

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

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

sachleen
источник
1
Стоит отметить, что та же идея работает и для резисторов с понижением напряжения; то есть резистор обычно тянет штырь на низком уровне, но нажатие кнопки приводит к его повышению. Очевидно, что он должен быть внешним, так как на стандартном Arduinos нет внутреннего снижения.
Питер Блумфилд