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 дозволяє запускати кілька незалежних функцій паралельно. Це зручно для проєктів, де потрібно одночасно працювати з датчиками, світлодіодами, моторами та комунікаційними протоколами. Використовуючи таймери, ви розвантажуєте основний цикл і підвищуєте стабільність роботи пристрою.
Вимірювання часу та точні затримки на ESP32
Вимірювання часу та точні затримки на ESP32 ESP32 має потужну систему апаратних таймерів, які доз..
Модуль 5 — Датчики та модулі: DHT11, LDR і проєкт «Розумна лампа»
Модуль 5 — Датчики та модулі (курс для початківців) Мета модуля: ознайомитися з популярними..
Набір датчиків ваги 200кг
4 тензодатчика для вимірювання ваги до 200 кг при мостовому з'єданніКожний окремий датчик розрахован..
194.71грн.
Перетворювач RS232 у TTL
Перетворювач RS232 в TTL – модуль для підключення пристроїв із роз’ємом DB9 до аматорських контролер..
59.56грн.
Діммер регулятор потужності симісторний 220В 8А
Регулятор потужності на основі симістора BTA16-600Принцип регулювання побудований на тому, що через ..
111.67грн.







