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 размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Цифровий вольтметр + амперметр 100В 10А

Цифровий вольтметр + амперметр 100В 10А

Цифровий вольтметр та амперметр постійного струмуДіапазон вимірювання напруги 0 ...100 ВДіапазон вим..

127.39грн.

Набір перетинок (мама-мама) 40шт 10см

Набір перетинок (мама-мама) 40шт 10см

Набір з'єднувальних дротів для поєднання плат контролера з периферією без пайки. Підходять під станд..

50.09грн.

Обмін інформацією між контролерами Arduino Nano по Ethernet

Обмін інформацією між контролерами Arduino Nano по Ethernet

Двохсторонній зв'язок модулями ENC28J60 між контролерами ArduinoЯ покажу тут рішення, здавалось би, ..

Raspberry PI управление servo-мотором при помощи ползунка на экране

Raspberry PI управление servo-мотором при помощи ползунка на экране

Отже ставимо перед собою задачу: керувати серво-мотором від Raspberry PI, використовуючи візуальний ..

Модуль 4 — Аналогові сигнали: ADC, PWM і регулятор яскравості

Модуль 4 — Аналогові сигнали: ADC, PWM і регулятор яскравості

Модуль 4 — Аналогові сигнали (курс для початківців) Мета модуля: вивчити роботу з аналогови..

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

Переривання таймера 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грн.