Отключаемые счетчики электроэнергии на пульте. Все с документами пломбами, гарантией и без посредников!

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

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)


Категория: Arduino
Метки:

Написать коментарий

*
= 3 + 0

Добавить изображение

Последние статьи