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");
  }
}
  

Как работает программа (пошагово)

  1. Инициализация: LED_PIN как OUTPUT, BTN_PIN как INPUT_PULLUP. Это значит, что без нажатия на кнопке логическая «1», при нажатии — «0».
  2. Антидребезг: анализируется изменение мгновенного чтения и таймер стабильности (DEBOUNCE_MS). Только если состояние стабильно дольше окна дребезга — оно считается «устойчивым».
  3. Переключение LED: при устойчивом переходе HIGH→LOW (фронт нажатия) флаг ledState инвертируется, и светодиод меняет состояние.
  4. Неблокирующая логика: нет 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 В, применяйте подтяжки и антидребезг. Такой базовый каркас легко масштабируется до сложных проектов — от панелей кнопок до протоколов управления силовой электроникой.

<< Проекты << Все товары >> Статьи, уроки >>

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Фольгированный текстолит двухсторонний 75х100мм

Фольгированный текстолит двухсторонний 75х100мм

Двухсторонний фольгированный медью текстолит для изготовления печатных платТолщина 1,5 мм Размеры 7..

67.60грн.

Корпус пластиковый 85x58x33мм с прозрачной крышкой

Корпус пластиковый 85x58x33мм с прозрачной крышкой

Герметичный корпус для самодельных электронных устройствМатериал - пластикРазмеры 85 x 58 x 33 ..

116.22грн.

Мини кнопка 12 x 12 x 4,3 мм

Мини кнопка 12 x 12 x 4,3 мм

Миниатюрная кнопка для установки на плату через отверстияРазмеры 12 x 12 x 4,3 мм..

4.14грн.

Диммер регулятор мощности симисторный 220В 8А

Диммер регулятор мощности симисторный 220В 8А

Регулятор мощности на основе симистора BTA16-600Принцип регулирования состоит в том, что через нагру..

111.67грн.

Настройка тока драйвера A4988

Настройка тока драйвера A4988

Микросхемы – драйвера шаговых двигателей такие, как A4988, отличаются от обычных H-мостов, или по-др..