Цифровой ввод: читаем кнопку и подтягивающий резистор
Учим плату реагировать на физический мир — нажатие кнопки.
Подтягивающий резистор (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_UP | 1 (3.3 В) | 0 (кнопка на землю) |
PULL_DOWN | 0 (земля) | 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 только для входа и без подтяжки.