Arduino UNO урок 3 — Тайминг

Обратимся к первому уроку, где мы управляли LED. Между включением и выключением которого была секундная задержка.

В используемой там программе (см. код ниже) был один очень большой недостаток. Для выдержки паузы между вкл/выкл LED в 1 сек. нами была использована функция delay(). В это время контроллер не может выполнять другие команды в главной функции loop()

 /* Мигание 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 секунда } 

Первое, что мы сделаем, это внесем небольшие корректировки в функцию loop(). Чтобы сделать код более компактным и изящным, заменим 2 пары строчек на одну пару. Вместо установки значения в HIGH, а затем обратно в LOW, мы получим текущее значение ledPin и проинвертируем его. Т.е. если оно было HIGH, то станет LOW и наоборот.

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

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

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

В нашем уроке мы будем использовать функцию millis():

 /* Мигание 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. В функции setup() обе переменные имеют одно и тоже значение. В функции loop(), переменная currentTime каждый раз обновляется в цикле. Когда currentTime больше чем loopTime на 1 секунду (loopTime + 1000), то LED меняет свое состояние, а переменной loopTime присваивается текущее значение currentTime.

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

Оригинал статьи на английском языке (перевод Колтыков А.В. для сайта cxem.net)