Цифровой ввод: читаем кнопку и подтягивающий резистор

Учим плату реагировать на физический мир — нажатие кнопки.

Подтягивающий резистор (pull-up/pull-down) задаёт выводу определённый уровень, когда кнопка не нажата, и спасает вход от «плавающего» неопределённого состояния.

Проблема плавающего входа

Если просто настроить пин на вход и подключить к нему кнопку, то при отпущенной кнопке вывод ни к чему не подключён. Его уровень «плавает» — чип будет читать случайные 0 и 1 из-за наводок. Решение — подтяжка.

Схема с внутренней подтяжкой

   3.3V (внутренний pull-up)
      |
   [резистор внутри чипа]
      |
 GPIO15 ---+--- кнопка --- GND
      |
   читаем здесь

При отпущенной кнопке подтяжка тянет вход к 3.3 В — читаем 1. При нажатой кнопке вход замыкается на землю — читаем 0. Логика инвертирована: нажатие = 0.

Код чтения кнопки

from machine import Pin
import time

button = Pin(15, Pin.IN, Pin.PULL_UP)
led = Pin(2, Pin.OUT)

while True:
    if button.value() == 0:   # 0 = нажата (из-за pull-up)
        led.on()
    else:
        led.off()
    time.sleep(0.05)

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

Таблица режимов подтяжки

РежимУровень при отпущенной кнопкеНажатие даёт
PULL_UP1 (3.3 В)0 (кнопка на землю)
PULL_DOWN0 (земля)1 (кнопка на 3.3 В)

Как работает под капотом

Внутри ESP32 у каждого входного вывода есть встроенные резисторы (порядка десятков килоом), которые можно программно подключить к питанию или земле. Когда вы пишете Pin.PULL_UP, MicroPython устанавливает бит в конфигурационном регистре пина, и резистор «мягко» тянет вход к 3.3 В. Этого тока достаточно, чтобы задать уровень, но мало, чтобы что-то нагрузить. Нажатие кнопки создаёт прямое соединение с землёй — оно «пересиливает» слабую подтяжку, и вход падает в 0.

Частые ошибки

  • Забыть подтяжку. Вход будет ловить случайные значения — кнопка «срабатывает сама».
  • Перепутать логику. С PULL_UP нажатие даёт 0, а не 1 — частый источник путаницы.
  • Использовать вывод только для входа. Некоторые пины ESP32 (GPIO34–39) работают лишь на вход и не имеют внутренней подтяжки.

Итог

  • Без подтяжки вход «плавает» и читает мусор.
  • PULL_UP: отпущено = 1, нажато = 0; PULL_DOWN — наоборот.
  • Внутренняя подтяжка избавляет от внешнего резистора.
  • Пины GPIO34–39 только для входа и без подтяжки.
Проверьте себя
1. Что такое «плавающий» вход?
AВход, залитый водой
BВход, не подключённый ни к чему, читающий случайные значения
CВход с подтяжкой
DАналоговый вход
2. С внутренней подтяжкой PULL_UP какое значение даёт нажатие кнопки на землю?
A1
B0
CСлучайное
D3.3
3. Особенность пинов GPIO34–39 на ESP32 в том, что они…
AСамые быстрые
BРаботают только на вход и не имеют внутренней подтяжки
CНе работают вообще
DВыдают 5 В