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 UNO — Частина 1. Вступ
Таймери Arduino UNO — Частина 1. Вступ Теорія Що таке таймер у мікроконтролері ATmega3..
Електро насос прозорий 12 В 100°С
Насос працює на основі діафрагми та може застосовуватися для перекачування харчових продуктівВитрата..
269.59грн.
Радіатор для транзистора 34х25х12мм
Радіатор алюмінієвий для пасивного охолодження різноманітних напівпровідникових силових компонентів:..
29.78грн.
Універсальна монтажна плата на 400 отворів
Макетна плата на 400 отворів для макетування любительських схемотехнічних проектів. Містить 4 лінії ..
85.85грн.







