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 разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Термопара K-типа -100...800°C 5х100мм

Термопара K-типа -100...800°C 5х100мм

Термопара типа К ТХА хромель-алюмель используется для измерения экстремально высоких температур до&n..

204.73грн.

Watchdog и Arduino Uno

Watchdog и Arduino Uno

Зачем нужен watchdog (сторожевой таймер)? Сторожевые таймеры используются, чтобы исключить пзавис..

Усилитель PAM8610 10x2Вт с регулировкой громкости и разъемами

Усилитель PAM8610 10x2Вт с регулировкой громкости и разъемами

Стерео усилитель звуковой частоты класса D с переменным резистором регулирования громкости, разъемам..

131.91грн.

Модуль блока питания 12В 250мА

Модуль блока питания 12В 250мА

Удобный модуль питания из 220В AC в 12В постоянного тока. Разработан для установки на печатную плату..

155.85грн.

Светодиод ультраяркий 5мм

Светодиод ультраяркий 5мм

Сверхяркий светодиод диаметром 5 мм Корпус прозрачный у светодиодов разного цвета свечения. То есть..

5.75грн.