Стан кнопки змінюється випадковим чином


14

У мене на Arduino є підключена кнопка, але, здається, вона спрацьовує випадково.

У мене один штифт кнопки підключений до штифта 2 на ардуїно, а інший підключений до землі.

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

    pinMode(2, INPUT);
}

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

Я очікую, що він надрукує 1 безперервно і перейде до 0, коли я натискаю кнопку вниз, але іноді вона показує 0, навіть коли я не торкаюся її.

Відповіді:


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-ти кілометровий резистор на цьому штирі. Коли кнопка не натиснута, вхід більше не буде плавати.

Примітка. Це працює лише тоді, коли інший кінець підключений до землі.


1
Варто зазначити, що ця сама ідея працює і для резисторів, що спадають; тобто резистор зазвичай тягне шпильку низько, але натискання кнопки піднімає її високо. Очевидно, що він повинен бути зовнішнім, тому що немає внутрішнього спаду в стандартних Arduinos.
Пітер Блумфілд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.