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

MINI ESP32

Плата контроллера ESP32. Интересный миниатюрный формат WiFi Bluetooth контроллера.Напряжение питания..

300.26грн.

Микрофон ёмкостный электретный 6х5мм

Микрофон ёмкостный электретный 6х5мм

Миниатюрный монофонический микрофон с двумя ножкамиДиаметр 6 ммДлина 5 ммТип электретныйЧувствительн..

7.60грн.

АЦП ADS1115 обзор микросхемы

АЦП ADS1115 обзор микросхемы

Привет, друзья! У нас на обзоре очень полезная микросхема – ADS1115. Это 16-битный аналогово-цифрово..

Arduino SPI: Полное руководство по последовательной шине Serial Peripheral Interface

Arduino SPI: Полное руководство по последовательной шине Serial Peripheral Interface

Arduino SPI: Полное руководство по последовательной шине Serial Peripheral Interface SPI ..

Датчик вращения енкодер KY-040

Датчик вращения енкодер KY-040

Енкодер вращения KY-040 - это поворотный датчик, который индицирует степень поворота оси и в каком н..

37.93грн.