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

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

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

303.95грн.

Розробка електроніки та друкованих плат в Україні

Розробка електроніки та друкованих плат в Україні

Потрібен інженер для розробки електроніки, IoT-пристроїв або друкованих плат в Україні? Ми викон..

Трансформатор струму 0-30А

Трансформатор струму 0-30А

Аналоговий датчик змінного струму силою до 30А. Це роз'ємний трансформатор струму з діаметром отвору..

261.79грн.

AT24C02 EEPROM I2C

AT24C02 EEPROM I2C

Мікросхема постійної пам'яті EEPROMНапруга живлення 2,7 ... 5,5 ВОб'єм 256 БайтКоммунікація I2C..

4.54грн.

Модуль SHT30 для Wemos D1 mini

Модуль SHT30 для Wemos D1 mini

Шилд датчика температури та вологості на основі SHT30Комунікаційний інтерфейс I2CДіапазон вимірюванн..

102.48грн.

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

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