Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right Цифровые примеры chevron_right Blink Without Delay — мигание светодиода без delay()

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() — она возвращает количество миллисекунд, прошедших с момента запуска текущего скетча на плате. Именно с её помощью мы отслеживаем время без блокировки программы.

Как это работает

Ключевая идея — сравнивать текущее время с моментом последнего переключения светодиода:

  1. В переменной previousMillis хранится время последнего переключения.
  2. В каждом цикле loop() вычисляем разницу: currentMillis - previousMillis.
  3. Если разница больше или равна заданному интервалу 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