Мигаем светодиодом без delay()

Мы уже рассматривали пример того, как можно мигать светодиодом, в том примере мы использовали функцию delay(). Главный недостаток такого подхода заключается в том, что во время выполнения delay() программа "замораживается" и не может выполнять других действий. В реальных задачах нам обычно требуется, чтобы программа не только мигала светодиодом, но и выполняла другие полезные действия и не пропустила нажатие кнопки, например.  В этом примере мы обойдемся без delay, программа будет запоминать время когда был включен или выключен светодиод и в каждом цикле loop() будет проверять не прошло ли достаточно времени для переключения светодиода.

Необходимые компоненты

  • Arduino контроллер
  • Светодиод
  • резистор 220 Ом

Подключение

Подключение, точно такое же как и в примере мигания с помощью delay()

Мигание светодиода на Arduino

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

Схема

Схема подключения светодиода к Arduino

Код

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

/* Blink without Delay
 2005
 by David A. Mellis
 modified 8 Feb 2010
 by Paul Stoffregen
 */

const int ledPin =  13;      // номер выхода, подключенного к светодиоду
// Variables will change:
int ledState = LOW;             // этой переменной устанавливаем состояние светодиода 
long previousMillis = 0;        // храним время последнего переключения светодиода

long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда)

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;

    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin, ledState);
  }
}

See Also