ESP32: цифровые входы и выходы (Digital Inputs & Outputs)
Цифровые пины ESP32 позволяют считывать логические состояния (0/1) и управлять внешними устройствами (светодиоды, реле, драйверы и т.д.). В этой статье — краткая теория, безопасные подключения, а также рабочий пример со скетчем и подробным разбором.
Основы цифровых пинов ESP32
- Логические уровни: ESP32 — это 3,3 В микроконтроллер. Логическая «1» ≈ 3,3 В, «0» ≈ 0 В. GPIO не 5V-tolerant — не подавайте 5 В на вход!
- Режимы пинов:
pinMode(pin, INPUT)— «вход», ожидание внешнего уровня.pinMode(pin, INPUT_PULLUP)— «вход с подтяжкой к 3,3 В» (удобно для кнопок к GND).pinMode(pin, INPUT_PULLDOWN)— «вход с подтяжкой к GND» (кнопка к 3,3 В).pinMode(pin, OUTPUT)— «выход», управление нагрузкой (светодиод через резистор, транзистор, реле-модуль).
- Выходной ток: для долговременной работы ориентируйтесь на токи единиц–десятков мА на пин (используйте токоограничивающие резисторы и драйверы для мощных нагрузок).
- Пины только-вход:
GPIO34–GPIO39— входные, без внутренних подтяжек. - Стартовые (strapping) пины:
GPIO0, GPIO2, GPIO4, GPIO5, GPIO12, GPIO15— влияют на режим загрузки; избегайте жёстких внешних уровней на них при старте.
Типовая схема подключения
Для примера возьмём:
- Кнопка на
GPIO18, режимINPUT_PULLUP. Один контакт кнопки к пину, второй — кGND. Внутренняя подтяжка удерживает вход = «1», при нажатии — «0». - Светодиод на
GPIO19через резистор 220–330 Ω к GND (анод к пину, катод через резистор — к земле).
Пример программы (кнопка переключает состояние светодиода, с антидребезгом)
#include <Arduino.h>
const uint8_t LED_PIN = 19; // Светодиод (через резистор на GND)
const uint8_t BTN_PIN = 18; // Кнопка к GND, используем INPUT_PULLUP
// Параметры антидребезга
const unsigned long DEBOUNCE_MS = 40;
bool ledState = false; // Текущее состояние LED
int lastStableBtn = HIGH; // Последнее устойчивое состояние кнопки
int lastReadBtn = HIGH; // Последнее считанное (мгновенное) состояние
unsigned long lastChangeMs = 0; // Время последнего изменения
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
// Внутренняя подтяжка вверх: кнопка не нажата = HIGH, нажата = LOW
pinMode(BTN_PIN, INPUT_PULLUP);
Serial.println("ESP32 DIO demo: кнопка на GPIO18, LED на GPIO19");
}
void loop() {
// 1) Читаем «сырое» состояние кнопки
int reading = digitalRead(BTN_PIN);
// 2) Если состояние изменилось относительно последнего мгновенного чтения —
// запоминаем время. Это «окно» для подавления дребезга.
if (reading != lastReadBtn) {
lastChangeMs = millis();
lastReadBtn = reading;
}
// 3) Если состояние стабильно дольше, чем DEBOUNCE_MS — принимаем как устойчивое
if (millis() - lastChangeMs > DEBOUNCE_MS) {
if (lastStableBtn != reading) {
lastStableBtn = reading;
// Фиксируем фронт нажатия (переход с HIGH -> LOW при INPUT_PULLUP)
if (lastStableBtn == LOW) {
ledState = !ledState; // Переключаем флаг
digitalWrite(LED_PIN, ledState); // Применяем к светодиоду
Serial.printf("Button pressed, LED=%s\n", ledState ? "ON" : "OFF");
}
}
}
// Другие действия программы могут спокойно выполняться здесь —
// логика не блокируется и не использует delay().
// Для примера добавим краткий неблокирующий мониторинг выхода:
static unsigned long lastPrint = 0;
if (millis() - lastPrint > 1000) {
lastPrint = millis();
Serial.printf("LED state: %s\n", digitalRead(LED_PIN) ? "ON" : "OFF");
}
}
Как работает программа (пошагово)
- Инициализация:
LED_PINкакOUTPUT,BTN_PINкакINPUT_PULLUP. Это значит, что без нажатия на кнопке логическая «1», при нажатии — «0». - Антидребезг: анализируется изменение мгновенного чтения и таймер стабильности (
DEBOUNCE_MS). Только если состояние стабильно дольше окна дребезга — оно считается «устойчивым». - Переключение LED: при устойчивом переходе
HIGH→LOW(фронт нажатия) флагledStateинвертируется, и светодиод меняет состояние. - Неблокирующая логика: нет
delay()в основном цикле — скетч остаётся отзывчивым и готов к расширению (датчики, связь и т.д.).
Короткий пример «моргания» (выход)
Если нужно просто проверить выходной пин:
const uint8_t LED_PIN = 19;
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, HIGH);
delay(300);
digitalWrite(LED_PIN, LOW);
delay(300);
}
Частые ошибки и советы
- 5 В на вход: не подавайте 5 В на GPIO — используйте делитель напряжения/уровневой преобразователь.
- Без резистора к светодиоду: всегда ставьте токоограничивающий резистор 220–330 Ω.
- Неподходящие пины: помните про
GPIO34–39(вход-только, без подтяжек) и про strapping-пины — не фиксируйте их при старте. - Дребезг контактов: аппаратная RC-фильтрация или программный антидребезг (как в примере) повышают надёжность.
- Совместимость с переферией: для реле/моторчиков используйте транзисторы/модули, а не ведите нагрузку напрямую с GPIO.
Вывод
Цифровые входы и выходы ESP32 просты в использовании и мощны при грамотной организации: выбирайте подходящие пины, учитывайте уровни 3,3 В, применяйте подтяжки и антидребезг. Такой базовый каркас легко масштабируется до сложных проектов — от панелей кнопок до протоколов управления силовой электроникой.





