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 дозволяє запускати кілька незалежних функцій паралельно. Це зручно для проєктів, де потрібно одночасно працювати з датчиками, світлодіодами, моторами та комунікаційними протоколами. Використовуючи таймери, ви розвантажуєте основний цикл і підвищуєте стабільність роботи пристрою.
Джойстик двохосьовий з кнопкою
Двохосьовий джойстик з кнопкою — це зручний модуль керування для проєктів на Arduino, ESP32 та інших..
44.72грн.
DC-DC підвищуючий модуль 10А 12-50В
Імпульсний перетворювач стабілізованої постійної напруги, що підвищує на основі мікросхеми TL494. Пл..
247.71грн.
Цикли 5 — Вкладені цикли
Цикли 5 — Вкладені цикли Вступ Вкладені цикли — це конструкція, в якій один цикл розташо..
Інфрачервоний датчик руху HC-SR505
Мініатюрний економічний датчик руху.Напруга живлення 4,5 ... 20 ВСтрум спокою < 60 мкАВихідні лог..
76.78грн.
ESP32 WiFi модуль PLC 10DI 2AI 5REL
Популярний зручний для монтажу модуль WiFi ESP32 з програматором на борту.Програмувати та діагностув..
873.07грн.







