Обратимся к
первому уроку, где мы управляли 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() и процессор может выполнять другие операции.
Источник:
http://www.hobbytronics.co.uk/