delay - Блинк без Задержек. Правильное мигание светодиода на ардуино.

delay - Блинк без Задержек. Мигание светодиода на ардуино. 

Мигание светодиода без использования функции delay() является важным навыком, когда вам нужно выполнять несколько задач одновременно.
Например, вы можете захотеть мигать светодиодом и в то же время отслеживать нажатие кнопки.
Проблема при использовании delay() заключается в том, что она останавливает выполнение всей программы на время задержки.
Следовательно, если кнопка нажимается во время задержки Arduino, это нажатие будет пропущено и не сработает.

Этот скетч демонстрирует, как ПРАВИЛЬНО мигать светодиодом без использования delay().
Он работает по следующему принципу:
включает светодиод и записывает текущее время срабатывания.
Затем, на каждой итерации внутри loop(), он проверяет, прошло ли нужное время для мигания.
Если да, то состояние светодиода переключается (включается или выключается), и записывается новое, текущее время.
Таким образом светодиод мигает непрерывно, и выполнение программы никогда не задерживается на одной инструкции.

Для лучшего понимания этой концепции рассмотрим аналогию.
Представьте, что вы разогреваете пиццу в микроволновой печи и одновременно ожидаете важное письмо. Эквивалентом использования delay() было бы сидеть перед микроволновой печью, наблюдая, как таймер уменьшается с 10 минут до нуля. Во время этого ожидания, если приходит важное письмо, вы его не получите, или получите с 10 минутным опозданием.

На практике вы бы включили пиццу, проверили бы свою почту и, возможно, занялись чем-то еще (пока это не заняло бы слишком много времени). Периодически вы бы возвращались к микроволновой печи, чтобы убедиться, что таймер достиг нуля, что указывает на то, что ваша пицца готова.

В этом уроке вы узнаете, как создать аналогичный таймер для ваших Arduino скетчей.

Нам понадобятся:

  • Плата Arduino
  • Светодиод (LED)
  • Резистор 220 Ом
  • Схема подключения
  • Схема подключения

Для создания схемы подключения подсоедините один конец резистора к выводу 13 на Arduino плате. Подсоедините длинную ножку светодиода (положительный вывод, так называемый анод) к другому концу резистора. Наконец, подключите короткую ножку светодиода (катод, отрицательный вывод) к выводу GND платы, как показано на схеме выше и на схеме ниже.

Большинство Arduino плат уже поставляются с встроенным светодиодом, подключенным к выводу 13. Если вы запустите этот пример без дополнительного оборудования, вы увидите, как мигает встроенный светодиод.

После создания схемы подключения подключите плату к компьютеру, запустите программу Arduino Software (IDE) и вставьте следующий код.

Код
Следующий код использует функцию millis(), которая возвращает количество миллисекунд с момента запуска текущего скетча на плате, для мигания светодиодом без задержек.

/*
  Мигание без Задержек

  Включение и выключение светодиода, подключенного к цифровому пину 13,
  без использования функции delay(). Это означает, что другой код может выполняться
  одновременно, не прерывая выполнение кода светодиода.

  Схема подключения:
  - Используем встроенный или внешний светодиод.
  - Примечание: У большинства Arduino есть встроенный светодиод, который можно управлять.
    На платах UNO, MEGA и ZERO он подключен к цифровому пину 13, на MKR1000 к пину 6.
    LED_BUILTIN устанавливается на правильный пин светодиода независимо от используемой платы.
*/

// Константы не будут меняться. Используются для установки номера пина:
const int ledPin = LED_BUILTIN;  // номер пина для светодиода

// Переменные будут меняться:
int ledState = LOW;  // ledState используется для установки состояния светодиода

// Как правило, для переменных, хранящих время, следует использовать "unsigned long".
// Значение быстро становится слишком большим для хранения в переменной типа int.
unsigned long previousMillis = 0;  // будет хранить время последнего обновления светодиода

// Константы не будут меняться:
const long interval = 1000;  // интервал мигания светодиода (миллисекунды)

void setup() {
  // устанавливаем цифровой пин как выход:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // здесь вы можете размещать код, который должен выполняться все время.

  // проверяем, пришло ли время мигания светодиода; то есть, если разница
  // между текущим временем и временем последнего мигания светодиода больше,
  // чем интервал, в течение которого вы хотите мигать светодиодом.
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // сохраняем время последнего мигания светодиода
    previousMillis = currentMillis;

    // если светодиод выключен, включаем его и наоборот:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // устанавливаем состояние светодиода в соответствии с переменной ledState:
    digitalWrite(ledPin, ledState);
  }
}

5 примеров использования

Система мониторинга: Вы можете использовать мигание без задержек для создания индикатора состояния в системе мониторинга.
Например, когда система работает нормально, светодиод мигает с определенной частотой, но если возникает какая-то проблема, частота мигания может увеличиваться, чтобы привлечь внимание оператора.

Умный дом: В вашей системе умного дома, вы можете использовать мигание без задержек для уведомления о различных событиях.
Например, мигание светодиода может указывать на активацию безопасности, получение нового сообщения или изменение температуры в доме.

Таймер: Вы можете создать простой таймер с использованием мигания без задержек. Светодиод будет мигать чередующимися интервалами, что поможет вам контролировать время, не блокируя выполнение другого кода.

Игры: В играх на Arduino, таких как "змейка" или "тетрис", мигание без задержек может использоваться для создания анимаций и индикации событий, не прерывая основной игровой процесс.

Системы управления: В автоматизированных системах управления, где нужно мониторить и управлять разными процессами, мигание без задержек может помочь в создании индикаторов и предупреждений, не влияя на работу основных устройств.


Дополнительные материалы по теме.
millis примеры. Видео урок
Пишем свой первый скетч - Урок № 1
Примеры.
Мигание 1 светодиодом
Мигание 3 светодиодами
Мигание светодиодом без delay
Светофор из 3-х светодиодов
Светодиодный модуль RGB. Случайное смешение цветов
Светодиодный модуль RGB. Поочерёдное включение цветов
Светодиодный модуль "Светофор". Имитация работы светофора
Плавное включение светодиодов.
Случайное значение яркости светодиодов.
Передаём сигнал SOS.
Бегущая волна из 5 светодиодов.

Подключение фоторезистора к плате Ардуино - Урок № 2
Мигающий светодиод. Пример Ардуино Blink.
Плавное включение светодиода на Ардуино. analogWrite

Вместо Ардуино используется ESP
Как управлять RGB светодиодом с телефона
esp8266 подключение и управление светодиодом. Примеры esp8266