ESP32 таймери: Багатозадачність з апаратними таймерами

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

Особливості багатозадачності з таймерами

  • ESP32 має чотири апаратні таймери (по два на кожен таймерний блок).
  • Кожен таймер може працювати незалежно й викликати свій обробник переривань.
  • Можна виконувати паралельні завдання — наприклад, підрахунок імпульсів та керування LED.

Порівняння зі звичайними методами

В Arduino Uno/Nano багатозадачність досягається через хитре використання millis() та логіки в основному циклі. В ESP32 можна розвантажити головний цикл, передавши частину завдань апаратним таймерам.

Приклад 1. Два таймери: світлодіод і лічильник імпульсів

У цьому прикладі перший таймер керує миготінням світлодіода на GPIO 2, а другий підраховує імпульси на GPIO 4.


hw_timer_t *timerLED = NULL;
hw_timer_t *timerCounter = NULL;

volatile int pulseCount = 0;
const int ledPin = 2;
const int pulsePin = 4;

void IRAM_ATTR onTimerLED() {
  digitalWrite(ledPin, !digitalRead(ledPin)); // інвертуємо стан
}

void IRAM_ATTR onTimerCounter() {
  if (digitalRead(pulsePin) == HIGH) {
    pulseCount++;
  }
}

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(pulsePin, INPUT);

  // Таймер для миготіння LED: кожні 500 мс
  timerLED = timerBegin(0, 80, true); 
  timerAttachInterrupt(timerLED, &onTimerLED, true);
  timerAlarmWrite(timerLED, 500000, true);
  timerAlarmEnable(timerLED);

  // Таймер для лічильника імпульсів: перевірка кожну 1 мс
  timerCounter = timerBegin(1, 80, true);
  timerAttachInterrupt(timerCounter, &onTimerCounter, true);
  timerAlarmWrite(timerCounter, 1000, true);
  timerAlarmEnable(timerCounter);

  Serial.begin(115200);
}

void loop() {
  // Виводимо значення лічильника кожні 2 секунди
  static unsigned long lastPrint = 0;
  if (millis() - lastPrint > 2000) {
    Serial.print("Імпульсів: ");
    Serial.println(pulseCount);
    lastPrint = millis();
  }
}

Що відбувається

  • Таймер 0 кожні 500 мс перемикає стан піна зі світлодіодом.
  • Таймер 1 кожну 1 мс перевіряє рівень на pulsePin і збільшує лічильник при HIGH.
  • Основний цикл лишається вільним — він тільки виводить результат на екран раз на 2 секунди.

Приклад 2. Три завдання паралельно

У ESP32 можна задіяти більше таймерів. Наприклад:

  • Таймер 0 — керує миготінням LED.
  • Таймер 1 — підраховує імпульси.
  • Таймер 2 — вимірює інтервал часу і передає дані в Serial.

Це дозволяє будувати реактивні системи без блокувань, де кожне завдання обробляється окремо.

Висновок

Багатозадачність з апаратними таймерами ESP32 дозволяє запускати кілька незалежних функцій паралельно. Це зручно для проєктів, де потрібно одночасно працювати з датчиками, світлодіодами, моторами та комунікаційними протоколами. Використовуючи таймери, ви розвантажуєте основний цикл і підвищуєте стабільність роботи пристрою.

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

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

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

Джойстик двохосьовий з кнопкою

Двохосьовий джойстик з кнопкою — це зручний модуль керування для проєктів на Arduino, ESP32 та інших..

44.72грн.

DC-DC підвищуючий модуль 10А 12-50В

DC-DC підвищуючий модуль 10А 12-50В

Імпульсний перетворювач стабілізованої постійної напруги, що підвищує на основі мікросхеми TL494. Пл..

247.71грн.

Цикли 5 — Вкладені цикли

Цикли 5 — Вкладені цикли

Цикли 5 — Вкладені цикли Вступ Вкладені цикли — це конструкція, в якій один цикл розташо..

Інфрачервоний датчик руху HC-SR505

Інфрачервоний датчик руху HC-SR505

Мініатюрний економічний датчик руху.Напруга живлення 4,5 ... 20 ВСтрум спокою < 60 мкАВихідні лог..

76.78грн.

ESP32 WiFi модуль PLC 10DI 2AI 5REL

ESP32 WiFi модуль PLC 10DI 2AI 5REL

Популярний зручний для монтажу модуль WiFi ESP32 з програматором на борту.Програмувати та діагностув..

873.07грн.

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

Переривання таймера ESP32: hw_timer_t, налаштування обробника та обмеження ISR

Переривання таймера ESP32: hw_timer_t, налаштування обробника та обмеження ISR

Переривання таймера ESP32: hw_timer_t, налаштування обробника та обмеження ISR ESP32 має ап..

0.00грн.

Таймери та FreeRTOS на ESP32

Таймери та FreeRTOS на ESP32

Таймери та FreeRTOS на ESP32 ESP32 працює під керуванням FreeRTOS, і окрім апаратних таймерів (hw..

0.00грн.