Вступ до таймерів ESP32

Мікроконтролер ESP32 оснащений потужними апаратними таймерами, які дозволяють виконувати завдання з високою точністю та без блокування роботи програми. Ці таймери називаються General Purpose Timers і входять до складу двох Timer Groups — кожна група містить по 2 таймери, всього доступно 4 таймери для користувача.

Апаратні таймери ESP32

  • Доступно 4 таймери (по 2 в кожній групі Timer Group0 та Timer Group1).
  • Точність до 80 МГц (залежно від джерела тактування).
  • Можуть працювати в режимі одноразового або періодичного запуску.
  • Підтримка переривань: можна викликати функцію при кожному спрацюванні таймера.

Відмінність від millis() і delay()

Функції millis() та delay() зручні для простих проєктів, але мають обмеження:

  • millis() і micros() надають доступ лише до поточного часу, але не можуть безпосередньо запускати дії.
  • delay() повністю блокує виконання коду, що заважає багатозадачності.
  • Апаратні таймери дозволяють запускати функції у фоновому режимі, без зупинки основної програми.

Переваги апаратних таймерів ESP32

  • Висока точність: мікросекундні інтервали.
  • Можливість паралельного запуску кількох таймерів.
  • Робота у фоновому режимі — головний цикл loop() залишається вільним.
  • Можна реалізувати завдання «реального часу» — наприклад, вимірювання частоти, генерацію сигналів або циклічне опитування датчиків.

Приклад 1. Простий таймер із перериванням

Цей код викликає функцію кожну 1 секунду.


hw_timer_t *timer = NULL;

void IRAM_ATTR onTimer() {
  Serial.println("Таймер спрацював!");
}

void setup() {
  Serial.begin(115200);

  // Створюємо таймер: (номер, преддільник, рахувати вгору)
  timer = timerBegin(0, 80, true); 
  // Преддільник 80 => частота 1 МГц (1 мкс на такт)

  // Прив’язуємо обробник переривання
  timerAttachInterrupt(timer, &onTimer, true);

  // Налаштовуємо таймер: кожні 1 000 000 мкс = 1 секунда
  timerAlarmWrite(timer, 1000000, true);

  // Запускаємо
  timerAlarmEnable(timer);
}

void loop() {
  // Основний цикл вільний
}

Приклад 2. Кілька таймерів

Можна запустити кілька таймерів для різних завдань.


hw_timer_t *timer1 = NULL;
hw_timer_t *timer2 = NULL;

void IRAM_ATTR onTimer1() {
  Serial.println("Таймер 1: миготіння світлодіода");
  digitalWrite(2, !digitalRead(2));
}

void IRAM_ATTR onTimer2() {
  Serial.println("Таймер 2: опитування датчика");
}

void setup() {
  pinMode(2, OUTPUT);
  Serial.begin(115200);

  // Таймер 1: кожні 500 мс
  timer1 = timerBegin(0, 80, true);
  timerAttachInterrupt(timer1, &onTimer1, true);
  timerAlarmWrite(timer1, 500000, true);
  timerAlarmEnable(timer1);

  // Таймер 2: кожні 2 секунди
  timer2 = timerBegin(1, 80, true);
  timerAttachInterrupt(timer2, &onTimer2, true);
  timerAlarmWrite(timer2, 2000000, true);
  timerAlarmEnable(timer2);
}

void loop() {
  // Все працює у перериваннях
}

Приклад 3. Одноразовий таймер

Іноді потрібно виконати дію лише один раз із затримкою.


hw_timer_t *timer = NULL;

void IRAM_ATTR onTimer() {
  Serial.println("Одноразовий таймер спрацював!");
}

void setup() {
  Serial.begin(115200);
  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, &onTimer, true);
  timerAlarmWrite(timer, 3000000, false); // 3 секунди, без автоповтору
  timerAlarmEnable(timer);
}

void loop() {
  // Одноразовий запуск, після чого таймер вимикається
}

Висновок

Апаратні таймери ESP32 дозволяють реалізовувати більш надійні та гнучкі проєкти у порівнянні з використанням delay() чи millis(). Вони забезпечують високу точність, паралельне виконання завдань та відсутність блокувань — це особливо важливо у проєктах IoT і в задачах реального часу.

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

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

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Тестуємо WEB-інструмент програмування Arduino на офіційному сайті

Тестуємо WEB-інструмент програмування Arduino на офіційному сайті

Подивимось ближче на веб-редакторНа офіційному сайті  Arduino в розділі скачування засобів прог..

Модуль реле одноканальний 5В 10А

Модуль реле одноканальний 5В 10А

Одноканальный модуль реле для підключення напряму до дискретного виходу контролера. Світлодіодна інд..

43.11грн.

Розумний дім #11: Комунікаційні мережі

Розумний дім #11: Комунікаційні мережі

Розумний дім #11: Комунікаційні мережі Жодна система розумного дому неможлива без надій..

SIM800L як припаяти гребінку

SIM800L як припаяти гребінку

Привіт друзі! Це коротка стаття під назвою SIM800L як припаяти гребінку. Модулі GSM зв'язку SIM8..

Модуль блока живлення 5В 700мА

Модуль блока живлення 5В 700мА

Мініатюрний безкорпусний трансформаторний блок живлення для любительських проектів.Вхідна напруга 85..

70.15грн.

Рекомендовані товари

Створення простого таймера на ESP32: приклад періодичного виклику функції

Створення простого таймера на ESP32: приклад періодичного виклику функції

Створення простого таймера на ESP32: приклад періодичного виклику функції Під час розробки проєкт..

0.00грн.