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 дозволяє запускати кілька незалежних функцій паралельно. Це зручно для проєктів, де потрібно одночасно працювати з датчиками, світлодіодами, моторами та комунікаційними протоколами. Використовуючи таймери, ви розвантажуєте основний цикл і підвищуєте стабільність роботи пристрою.
Модуль реле 8-канальний 12В 10А
8-канальний модуль реле для підключення напряму до дискретного виходу контролера. Світлодіодна індик..
303.95грн.
Розробка електроніки та друкованих плат в Україні
Потрібен інженер для розробки електроніки, IoT-пристроїв або друкованих плат в Україні? Ми викон..
Трансформатор струму 0-30А
Аналоговий датчик змінного струму силою до 30А. Це роз'ємний трансформатор струму з діаметром отвору..
261.79грн.
AT24C02 EEPROM I2C
Мікросхема постійної пам'яті EEPROMНапруга живлення 2,7 ... 5,5 ВОб'єм 256 БайтКоммунікація I2C..
4.54грн.
Модуль SHT30 для Wemos D1 mini
Шилд датчика температури та вологості на основі SHT30Комунікаційний інтерфейс I2CДіапазон вимірюванн..
102.48грн.







