Тайминг на Arduino

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

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

Мы будем рады и вашему мнению

Оставить ответ

Журнал светодиод
Logo