Модуль 3 — Работа с цифровыми сигналами (курс для начинающих)

Цель модуля: понять, как работают цифровые входы и выходы Arduino, узнать о подтягивающих резисторах (pull-up и pull-down), научиться устранять дребезг кнопки и создать проект «Кнопка-переключатель».


Порты ввода/вывода (digital)

Цифровые порты Arduino могут работать в двух режимах:

  • Вход (INPUT) — порт считывает логический уровень: HIGH (1) или LOW (0).
  • Выход (OUTPUT) — порт устанавливает логический уровень: HIGH подаёт напряжение (обычно 5 В или 3,3 В), LOW соединяет с землёй (GND).

Цифровые входы используются для подключения кнопок, датчиков и других устройств, которые передают сигнал в виде двух состояний. Выходы управляют светодиодами, реле, моторами и т. д.

Pull-up и pull-down резисторы

Чтобы цифровой вход корректно считывал состояние, его нужно «привязать» к логическому уровню в неактивном состоянии. Для этого используют подтягивающие резисторы:

  • Pull-up — подтягивает вход к HIGH (Vcc) через резистор. Когда кнопка замыкается на землю, уровень становится LOW.
  • Pull-down — подтягивает вход к LOW (GND). Когда кнопка замыкается на питание, уровень становится HIGH.

В Arduino есть встроенные подтягивающие резисторы (около 20–50 кОм), которые можно включить с помощью INPUT_PULLUP в pinMode().

Обработка дребезга кнопки

При нажатии механической кнопки контакты замыкаются не мгновенно — они подскакивают и несколько миллисекунд «дребезжат». Это может вызвать ложные срабатывания.

Методы борьбы с дребезгом:

  • Программная задержка (игнорирование изменений в течение 20–50 мс).
  • Аппаратная фильтрация — RC-цепочка (резистор + конденсатор).
  • Использование готовых библиотек (например, Bounce2).

Практика

Использование внутреннего pull-up Arduino

Подключение кнопки:

  • Один контакт кнопки → пин 2.
  • Другой контакт кнопки → GND.

В коде используем INPUT_PULLUP. Нажатая кнопка даст LOW.

Программа: включение/выключение светодиода по кнопке

const int buttonPin = 2;
const int ledPin = 13;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP); // Внутренний pull-up
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (digitalRead(buttonPin) == LOW) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}

Проект: «Кнопка-переключатель»

Задача: при каждом нажатии кнопки переключать состояние светодиода: одно нажатие — включить, другое — выключить.

Реализуем с защитой от дребезга программным методом.

const int buttonPin = 2;
const int ledPin = 13;

bool ledState = false;
bool lastButtonState = HIGH;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  int reading = digitalRead(buttonPin);

  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading == LOW && lastButtonState == HIGH) {
      ledState = !ledState;
      digitalWrite(ledPin, ledState);
    }
  }

  lastButtonState = reading;
}

Типичные ошибки

  • Подключение кнопки без резистора подтяжки — вход «плавает» и даёт случайные срабатывания.
  • Неправильная логика: забыли, что при INPUT_PULLUP нажатие даёт LOW.
  • Отсутствие защиты от дребезга — светодиод мигает или переключается несколько раз за одно нажатие.

Что дальше

В следующем модуле мы изучим Модуль 4 — Аналоговые сигналы: ADC, PWM и регулятор яркости


Контрольные вопросы

  1. В чём разница между цифровыми входами и выходами?
  2. Чем отличаются pull-up и pull-down резисторы?
  3. Что такое дребезг кнопки и как с ним бороться?
  4. Как сделать кнопку-переключатель в Arduino?

Авторский курс по Arduino для начинающих. Использование материалов на коммерческих сайтах допускается с указанием источника.

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

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

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

Генератор импульсов на NE555

Генератор импульсов на NE555 Генератор прямоугольных импульсов на основе популярной микросхемы NE..

42.30грн.

Модуль блока питания 5В 1А

Модуль блока питания 5В 1А

Плата модуля импульсного блока питания 5В 1АВходное переменное напряжение 85 ... 265 В 50/60 ГцРазме..

128.59грн.

Arduino Nano I2C двухсторонняя связь между контроллерами

Arduino Nano I2C двухсторонняя связь между контроллерами

Продолжаем разбор технологии обмена данными по коммуникации I2C В предыдущей статье рассматривался ..

Концевик оптический безконтактный

Концевик оптический безконтактный

Датчик работает на основе открытой оптопары. Срабатывает при появлении непрозрачного предмета в разр..

31.94грн.

Режим сна SIM800L с Arduino Nano: энергосбережение и пробуждение по SMS

Режим сна SIM800L с Arduino Nano: энергосбережение и пробуждение по SMS

Режим сна SIM800L и пробуждение Arduino Привет, друзья! Тему этой статьи предложили подписчики. И..