Blink Without Delay — мигание светодиода без delay()
Учимся мигать светодиодом без использования функции delay(), чтобы Arduino могла одновременно выполнять другие задачи.
Иногда нужно делать несколько вещей одновременно. Например, мигать светодиодом и при этом отслеживать нажатие кнопки. В такой ситуации delay() становится настоящей проблемой: пока Arduino «висит» внутри delay(), программа полностью заморожена. Если кнопка будет нажата именно в этот момент — вы её пропустите, потому что delay() ещё не истёк.
Этот скетч показывает, как мигать светодиодом без delay(). Логика простая: включаем светодиод и запоминаем время. Затем в каждой итерации loop() проверяем, прошло ли нужное количество миллисекунд. Если прошло — переключаем состояние светодиода и снова запоминаем время. Так светодиод мигает непрерывно, а программа ни на мгновение не останавливается.
Хорошая аналогия: представьте, что вы разогреваете пиццу в микроволновке и ждёте важное письмо. Использование delay() — это как сидеть перед микроволновкой и смотреть на таймер, отсчитывающий 10 минут. Письмо придёт — вы его не заметите. В реальной жизни вы бы включили микроволновку, пошли проверить почту, занялись чем-то ещё и периодически заглядывали бы на таймер. Именно так и работает подход, описанный в этом уроке.
Необходимое оборудование
- Светодиод (LED)
- Резистор 220 Ом
Схема подключения

Схема подключения: светодиод с резистором подключён к пину 13 платы Arduino UNO через макетную плату.
Соедините один конец резистора с пином 13 платы. Длинную ногу светодиода (анод, «плюс») подключите к другому концу резистора. Короткую ногу (катод, «минус») подключите к GND платы, как показано на схеме выше.
На большинстве плат Arduino уже есть встроенный светодиод, подключённый к пину 13. Если запустить этот пример без внешних компонентов, встроенный светодиод будет мигать — это удобно для быстрой проверки кода.
Принципиальная схема

Принципиальная схема: светодиод с резистором 220 Ом подключён между пином 13 и GND платы Arduino UNO.
После сборки схемы подключите плату к компьютеру, откройте Arduino IDE и введите код ниже.
Код
В основе скетча лежит функция millis() — она возвращает количество миллисекунд, прошедших с момента запуска текущего скетча на плате. Именно с её помощью мы отслеживаем время без блокировки программы.
Как это работает
Ключевая идея — сравнивать текущее время с моментом последнего переключения светодиода:
- В переменной
previousMillisхранится время последнего переключения. - В каждом цикле
loop()вычисляем разницу:currentMillis - previousMillis. - Если разница больше или равна заданному интервалу
interval— переключаем светодиод и обновляемpreviousMillis.
Таким образом, loop() выполняется тысячи раз в секунду, и программа всегда готова реагировать на другие события.
Типичные ошибки
- Переполнение
millis()— функция возвращаетunsigned long, поэтому переменныеcurrentMillisиpreviousMillisтоже должны бытьunsigned long. Если использоватьint, через ~32 секунды значение переполнится и таймер сломается. - Слишком длинный код внутри
loop()— если какой-то участок кода выполняется долго (например, медленное чтение датчика), точность таймера снизится. Старайтесь не блокироватьloop()нигде. - Неправильное подключение светодиода — не забывайте про резистор: без него светодиод может сгореть или перегрузить пин.
Где пригодится
Подход «таймер без delay()» — один из базовых паттернов Arduino-программирования. Он нужен везде, где программа должна делать несколько вещей «одновременно»:
- мигать индикатором и опрашивать кнопки;
- отправлять данные по Serial и управлять сервоприводом;
- обновлять дисплей и читать показания датчиков по расписанию.
Как проверить результат
Загрузите скетч и наблюдайте за светодиодом на пине 13. Он должен мигать с заданным интервалом. Попробуйте изменить значение переменной interval (в миллисекундах) и перезагрузить скетч — частота мигания изменится. Если светодиод не мигает, проверьте полярность подключения и наличие резистора.
Дополнительные материалы
Больше базовых примеров вы найдёте в разделе built-in examples.
Также рекомендуем изучить language reference — подробный справочник по языку программирования Arduino.
Последнее обновление: 28.07.2015, SM