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 дозволяє запускати кілька незалежних функцій паралельно. Це зручно для проєктів, де потрібно одночасно працювати з датчиками, світлодіодами, моторами та комунікаційними протоколами. Використовуючи таймери, ви розвантажуєте основний цикл і підвищуєте стабільність роботи пристрою.
Цифровий вольтметр + амперметр 100В 10А
Цифровий вольтметр та амперметр постійного струмуДіапазон вимірювання напруги 0 ...100 ВДіапазон вим..
127.39грн.
Набір перетинок (мама-мама) 40шт 10см
Набір з'єднувальних дротів для поєднання плат контролера з периферією без пайки. Підходять під станд..
50.09грн.
Обмін інформацією між контролерами Arduino Nano по Ethernet
Двохсторонній зв'язок модулями ENC28J60 між контролерами ArduinoЯ покажу тут рішення, здавалось би, ..
Raspberry PI управление servo-мотором при помощи ползунка на экране
Отже ставимо перед собою задачу: керувати серво-мотором від Raspberry PI, використовуючи візуальний ..
Модуль 4 — Аналогові сигнали: ADC, PWM і регулятор яскравості
Модуль 4 — Аналогові сигнали (курс для початківців) Мета модуля: вивчити роботу з аналогови..







