Таймери 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(), щоб уникнути блокування програми та отримати гнучке керування часом.

<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Розумний дім #10: Датчик CO2

Розумний дім #10: Датчик CO2

Розумний дім #10: Датчик CO₂ Контроль якості повітря в приміщенні — один із ключових ел..

Радіо модуль NRF24L01

Радіо модуль NRF24L01

Радіомодуль nRF24L01 (2,4 ГГц, SPI) nRF24L01 — компактний радіопередавач-приймач для бездротового..

54.65грн.

ATTINY85

ATTINY85

Плата контролера ATTINY85Живлення від USB 5ВЗовнішнє живлення 7-16В..

179.35грн.

Ремінь зубчастий 6 мм 200 мм

Ремінь зубчастий 6 мм 200 мм

Зубчастий вкритий гумою ремінь для передачі механічної енергії обертання від одного зубчастого колес..

43.74грн.

Кінцевий вимикач або кінцевик

Кінцевий вимикач або кінцевик

Має одну групу перемикаючих контактів. На кінчику ричага встановлений рухомий ролік.Максимальний стр..

23.58грн.