Підключити кнопку до ESP32 можна чотирма основними способами: за допомогою внутрішніх резисторів (підтягування до живлення або до землі програмно) або зовнішніх резисторів (фізичних радіодеталей). Вибір схеми визначає стабільність сигналу та захист від перешкод. [1, 2]
1. Внутрішній Pull-Up (Підтягування до 3.3В) — Найспрощеніший метод
Кнопка підключається одним контактом до обраного GPIO пін, а другим — безпосередньо до землі (GND). У коді задається режим INPUT_PULLUP. У не натиснутому стані на піні буде HIGH (3.3В), при натисканні — LOW (0В). [1, 2, 3, 4]
Плюси:
Мінуси:
2. Внутрішній Pull-Down (Підтягування до землі)
Кнопка підключається одним контактом до піну ESP32, іншим — до живлення 3.3В (VCC). У коді активується режим INPUT_PULLDOWN. У спокої пін має LOW, при натисканні — HIGH. [1]
Плюси:
Логіка сприймається інтуїтивно: натиснув = HIGH (є сигнал), відпустив = LOW.
Не потрібні зовнішні компоненти. [1]
Мінуси:
Як і попередній варіант, чутливий до перешкод на довгих кабелях через слабкий опір (~45 кОм).
Підтримується не на всіх пінах старого ESP32 (підходить переважно для стандартних цифрових пінів). [1]
3. Зовнішній Pull-Up резистор (Апаратний)
Пін через зовнішній резистор (номіналом 10 кОм) жорстко підтягнутий до лінії 3.3В (VCC). Кнопка замикає пін на землю (GND) при натисканні. У коді використовується звичайний режим INPUT. [1, 2]
Плюси:
Висока стійкість до перешкод та наведень порівняно з внутрішніми аналогами (номінал 10 кОм потужніший за 45 кОм).
Можна використовувати на будь-яких робочих цифрових пінах. [1]
Мінуси:
4. Зовнішній Pull-Down резистор (Апаратний)
Пін через зовнішній резистор (10 кОм) підтягнутий до GND. Кнопка подає на пін напругу 3.3В (VCC) при замиканні. У коді — режим INPUT. [1]
Плюси:
Максимальна стабільність рівня LOW у стані спокою, надійний захист від випадкових наведень статичної електрики. [1]
Мінуси:
Склаדніша розводка схеми, наявність зайвих елементів (резистор 10 кОм).
Споживає мікроскопічний струм через резистор постійно в момент натискання кнопки.
gpio_config_t io_conf = {
.pin_bit_mask = (1ULL << S0_PIN) | (1ULL << S1_PIN) | (1ULL << S2_PIN) | (1ULL << S3_PIN),
.mode = GPIO_MODE_OUTPUT,
.pull_down_en = 0,
.pull_up_en = 0,
.intr_type = GPIO_INTR_DISABLE
};
1. Поле .mode (Режим роботи піна)
Визначає, як саме працюватиме фізичний вивід мікроконтролера.
Значення параметра Опис режиму Типовий приклад використання
GPIO_MODE_DISABLE Пін повністю вимкнено (вхід і вихід деактивовані) Енергозбереження, невикористовувані піни
GPIO_MODE_INPUT Тільки вхід Читання стану кнопок, датчиків, RX UART
GPIO_MODE_OUTPUT Тільки вихід (стандартний push-pull) Керування світлодіодами, реле, лініями вибору
GPIO_MODE_OUTPUT_OD Вихід типу "відкритий колектор" (Open Drain) Шина I2C (лінії SDA, SCL), шина 1-Wire
GPIO_MODE_INPUT_OUTPUT І вхід, і вихід одночасно Двонаправлені шини даних, тестування ліній
GPIO_MODE_INPUT_OUTPUT_OD І вхід, і вихід типу "відкритий колектор" Робота з шиною I2C у режимі Master/Slave
2. Поля .pull_up_en та .pull_down_en (Підтягуючі резистори)
Керують внутрішніми резисторами для уникнення "зависання" рівня напруги в повітрі.
Значення параметра Опис дії Типовий приклад використання
GPIO_PULLUP_DISABLE (або 0) Вимкнути підтяжку до живлення (3.3V) Для виходів або коли є зовнішній резистор
GPIO_PULLUP_ENABLE (або 1) Увімкнути внутрішню підтяжку до 3.3V Кнопка, яка замикається на "землю" (GND)
GPIO_PULLDOWN_DISABLE (або 0) Вимкнути підтяжку до землі (GND) Стандартне значення для більшості завдань
GPIO_PULLDOWN_ENABLE (або 1) Увімкнути внутрішню підтяжку до GND Кнопка, яка замикається на живлення (3.3V)
3. Поле .intr_type (Тип переривання)
Налаштовує реакцію процесора на зміну сигналу на піні (працює лише у режимі входу INPUT).
Значення параметра Опис тригера переривання Типовий приклад використання
GPIO_INTR_DISABLE Переривання повністю вимкнено Для пінів, які працюють на вихід (OUTPUT)
GPIO_INTR_POSEDGE По зростаючому фронту (перехід з 0 в 1) Фіксація моменту натискання кнопки (High-активна)
GPIO_INTR_NEGEDGE По спадаючому фронту (перехід з 1 в 0) Фіксація натискання кнопки (Low-активна)
GPIO_INTR_ANYEDGE По будь-якій зміні стану (0 \(\leftrightarrow \) 1) Енкодери, підрахунок імпульсів, отримання даних
GPIO_INTR_LOW_LEVEL Поки на піні утримується низький рівень (0) Сигнали готовності периферії (наприклад, лінії INT)
GPIO_INTR_HIGH_LEVEL Поки на піні утримується високий рівень (1) Аварійні сигнали від зовнішніх мікросхем
4. Поле .pin_bit_mask (Бітова маска пінів)
Показує, які саме піни конфігуруються. Обмежень за номерами немає (у межах доступних GPIO вашої моделі ESP32 від 0 до 39 або 48).
Варіант запису маски Які піни конфігуруються Сценарій використання
(1ULL << 4) Лише один пін GPIO 4 Підключення одного світлодіода чи датчика
(1ULL << 18) | (1ULL << 19) Одразу два піни: GPIO 18 та GPIO 19 Швидке налаштування пари ліній (наприклад, SPI)
((1ULL << 21) | (1ULL << 22)) Одразу два піни: GPIO 21 та GPIO 22 Налаштування ліній I2C з однаковими параметрами