Таймери Arduino UNO — Частина 1. Вступ
Теорія
Що таке таймер у мікроконтролері ATmega328P
Таймер — це вбудований апаратний модуль мікроконтролера, який рахує такти від внутрішнього або зовнішнього джерела тактових імпульсів. Таймери використовуються для вимірювання часу, створення точних затримок, генерації сигналів ШІМ (PWM) та роботи з перериваннями.
Апаратні та програмні таймери
- Апаратні таймери — реалізовані на рівні мікросхеми. Працюють незалежно від основного коду та можуть виконувати завдання у фоні. Забезпечують високу точність.
- Програмні таймери — реалізовані у вигляді функцій та бібліотек (наприклад, на основі
millis()). Менш точні, залежать від виконання іншого коду.
Відмінність delay() / millis() від апаратних таймерів
Функція delay() блокує виконання програми, зупиняючи її на заданий час. Це просто «пауза» в коді.
millis() і micros() використовують апаратний таймер (Timer0) для підрахунку часу, але не блокують виконання коду. З їх допомогою можна вимірювати інтервали часу та створювати неблокуючу логіку.
Огляд трьох таймерів Arduino UNO
- Timer0 — 8-бітний, використовується для роботи функцій
millis(),micros(),delay(), а також ШІМ на пінах D5 і D6. - Timer1 — 16-бітний, підходить для точних вимірювань часу, роботи сервоприводів, генерації повільних ШІМ-сигналів.
- Timer2 — 8-бітний, може працювати від окремого тактового джерела, використовується для генерації звуку та керування ШІМ на пінах D3 і D11.
Практика
Вимірювання часу за допомогою millis() і micros()
// Приклад вимірювання інтервалу в мілісекундах
unsigned long startTime;
void setup() {
Serial.begin(9600);
startTime = millis();
}
void loop() {
if (millis() - startTime >= 1000) { // Пройшла 1 секунда
Serial.println("Пройшла секунда");
startTime = millis(); // Скидання таймера
}
}
Простий приклад блимання світлодіода без delay()
const int ledPin = 13;
unsigned long previousMillis = 0;
const long interval = 500; // Інтервал блимання (мс)
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
digitalWrite(ledPin, !digitalRead(ledPin)); // Перемикаємо стан LED
}
}
Проєкт: Блимання LED з різними інтервалами без затримок
У цьому проєкті ми зробимо блимання світлодіода, де кожне наступне блимання відбуватиметься швидше або повільніше залежно від заданого алгоритму.
const int ledPin = 13;
unsigned long previousMillis = 0;
long interval = 1000; // Початковий інтервал (мс)
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
digitalWrite(ledPin, !digitalRead(ledPin));
// Змінюємо інтервал
interval -= 100;
if (interval < 100) interval = 1000; // Скидання до початкового значення
}
}
Таким чином, ми використали millis() замість delay(), щоб уникнути блокування програми та отримати гнучке керування часом.





