У
нашій першій вправі між вмиканням і
вимиканням світлодіода була секундна
затримка, для цього ми використали
функцію delay(),
яка призупиняє роботу контролера,
отже він не може виконувати інші команди
в головній функції loop
()
Спочатку зробимо код скетчу більш компактним, замінивши 2 пари рядків на одну пару. Замість встановлення значення в HIGH, а потім назад в LOW, ми отримаємо поточне значення ledPin і інвертуємо його. Тобто якщо воно було HIGH, то стане LOW і навпаки :
digitalWrite(ledPin, !digitalRead(ledPin));
Тепер вилучимо функцію delay(), використавши для обрахунку часу функцію millis() - вона повертає кількість мілісекунд, що минула з моменту запуску поточної програми. Функція переповниться (повернеться в нуль) приблизно через 50 діб безперервної роботи програми.
Подібною функцією є micros(), яка повертає кількість мікросекунд, що минула з моменту запуску поточної програми. Функція переповниться (повернеться в нуль) приблизно через 70 хвилин роботи програми.
У нашому скетчі ми будемо використовувати функцію millis(). У даному прикладі ми ввели дві змінні - currentTime і loopTime , змінна currentTime кожен раз оновлюється, коли currentTime більше ніж loopTime на 1 секунду, тобто (loopTime + 1000), то команда
digitalWrite(ledPin,!digitalRead(ledPin))
змінює стан світлодіода, а змінній
loopTime
присвоюється поточне значення currentTime.
/* Моргаємо світлодіодом з функціями таймінгу (керування часом)*/
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 записуємо нове значення часу
}
// А тут можуть бути інші команди
}