Обратимся к первому уроку, где мы управляли LED. Между включением и выключением которого была секундная задержка.
В используемой там программе (см. код ниже) был один очень большой недостаток. Для выдержки паузы между вкл/выкл LED в 1 сек. нами была использована функция delay(). В это время контроллер не может выполнять другие команды в главной функции loop()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/* Мигание 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 и наоборот.
1
2
3
4
5
|
void loop () { digitalWrite (ledPin, ! digitalRead (ledPin)); // включаем/выключаем LED delay (1000); // задержка 1 сек. } |
Отлично! Теперь мы усовершенствуем функцию delay(). Взамен, мы будем использовать функцию millis(). Данная функция возвращает количество миллисекунд, прошедшее с момента запуска текущей программы. Функция переполнится (вернется в нуль) приблизительно через 50 суток работы программы.
Альтернативной функцией является micros(), которая возвращает количество микросекунд, прошедшее с момента запуска текущей программы. Функция переполнится (вернется в нуль) приблизительно через 70 минут работы программы.
В нашем уроке мы будем использовать функцию millis():
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
/* Мигание 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() и процессор может выполнять другие операции.