Тайминг на Arduino

Контроллер Arduino UNO
Контроллер Arduino UNO

Чтобы разобраться с этой схемой, нам стоит обратиться к ранее опубликованной схеме мигающего светодиода на Arduino.

Контроллер Arduino UNO
Контроллер Arduino UNO

Для управления светодиодом мы использовали код:

/* Мигание LED
 * ------------
 *
 * Включает и выключает светодиод (LED) подсоединенный  
 * к выходу 13, с интервалом в 2 секунды
 *
 */

int ledPin = 13;                // LED подсоединен к выводу 13

void setup()
{
  pinMode(ledPin, OUTPUT);      // устанавливаем вывод 13 как выход
}

void loop()
{
  digitalWrite(ledPin, HIGH);   // включаем LED
  delay(1000);                  // пауза 1 секунда
  digitalWrite(ledPin, LOW);    // выключаем LED
  delay(1000);                  // пауза 1 секунда
}

В этом коде есть один недостаток: для выдержки между циклами включения LED использовалась команда: delay(). Но...При использовании этой команды, контроллер не в состоянии использовать другие команды в главной функции loop():

Внесем некоторые изменения в исходный код. Заменим две строки исходного кода на один. Вместо установки значения вHIGH, а затем обратно в LOW, мы получим текущее значение ledPin и проинвертируем его. Т.е. если оно было HIGH, то станет LOW и наоборот.

void loop()
{
  digitalWrite(ledPin, !digitalRead(ledPin));   // включаем/выключаем LED
  delay(1000);                  // задержка 1 сек.
}

Теперь модернизируем функцию delay(). Вместо нее стоит вставить millis(). Она возвращает миллисекунды,прошедшие с момента запуска программы. Функция переполнится (вернется в нуль) приблизительно через 50 суток работы программы.

Как за альтернативу можно взять команду micros(), она возвращает количество микросекунд, прошедшее с момента запуска текущей программы. Функция переполнится (вернется в нуль) приблизительно через 70 минут работы программы.

/* Мигание LED Версия 2
 * ------------------------
 * Включает и выключает светодиод (LED) подсоединенный   
 * к выходу 13, с интервалом в 2 секунды используя функцию millis()
 *
 */
int ledPin = 13;                 // LED подсоединен к выводу 13
unsigned long currentTime;
unsigned long loopTime;

void setup()
{
  pinMode(ledPin, OUTPUT);      // устанавливаем вывод 13 как выход
  currentTime = millis();		// считываем время, прошедшее с момента запуска программы
  loopTime = currentTime;  
}

void loop()
{
  currentTime = millis();					// считываем время, прошедшее с момента запуска программы
  if(currentTime >= (loopTime + 1000)){				// сравниваем текущий таймер с переменной loopTime + 1 секунда
    digitalWrite(ledPin, !digitalRead(ledPin));   	// включаем/выключаем LED
    loopTime = currentTime;  						// в loopTime записываем новое значение
  }
  // Здесь могут быть другие команды
}

 

Мы ввели в пример две новые переменные currentTime и loopTime. Обе функции имеют одинаковое значение. В функции loop(), переменная currentTime каждый раз обновляется в цикле. Когда currentTime больше чем loopTime на 1 секунду (loopTime + 1000), то LED меняет свое состояние, а переменной loopTime присваивается текущее значениеcurrentTime. Обратите внимание, что в данном примере мы не использовали функцию delay() и процессор может выполнять другие операции.[szapisi]

НЕТ КОММЕНТАРИЕВ

ОСТАВЬТЕ ОТВЕТ