Модуль 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 и регулятор яркости
Контрольные вопросы
- В чём разница между цифровыми входами и выходами?
- Чем отличаются pull-up и pull-down резисторы?
- Что такое дребезг кнопки и как с ним бороться?
- Как сделать кнопку-переключатель в Arduino?
Авторский курс по Arduino для начинающих. Использование материалов на коммерческих сайтах допускается с указанием источника.




