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() и процессор может выполнять другие операции.

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


Добавил:  Павел (Admin)  [email protected] | 

Автор:  Неизвестно  Рейтинг@Mail.ru