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.02грн.

Arduino Nano 3.0

Arduino Nano 3.0

Мініатюрна плата контролера з лінійки Aduino на базі мікропроцесора ATMEGA328P-AU Arduino Nano V 3...

179.44грн.

SMD світлодіод 0805

SMD світлодіод 0805

SMD світлодіоди видимого діапазону для поверхневого монтажу на плату Типорозмір 0805 Черво..

2.39грн.

Шестерня для зубчатого ременю на 30 зубців під вісь 5 мм

Шестерня для зубчатого ременю на 30 зубців під вісь 5 мм

Використовується для передачі та редукції обертаючого моменту від двигуна до вісі 5 ммКількість зубц..

79.88грн.

Обмін даними між двома Arduino за допомогою програмного UART

Обмін даними між двома Arduino за допомогою програмного UART

Обмен данными между двумя Arduino при помощи программного UARTКоммуникация по последовательному порт..

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

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