Створення простого таймера на ESP32: приклад періодичного виклику функції
Під час розробки проєктів на ESP32 часто виникає потреба викликати функцію через рівні проміжки часу.
Для цього можна використовувати апаратні таймери, які працюють незалежно від основного циклу loop().
Вони дозволяють організувати точне виконання завдань без блокування програми, на відміну від функції delay().
Чому не варто використовувати delay()
delay()повністю зупиняє виконання коду на заданий час;- у цей момент не обробляються інші події (наприклад, датчики, зв’язок по Wi-Fi);
- таймери дозволяють запускати функцію паралельно, без блокувань.
Простий приклад: миготіння світлодіода без delay()
У прикладі нижче використовується апаратний таймер ESP32. Ми налаштуємо його так, щоб він викликав функцію onTimer() кожні 500 мс. Усередині функції відбувається перемикання стану світлодіода.
#define LED_PIN 2 // вбудований світлодіод на багатьох платах ESP32
// Вказівник на таймер
hw_timer_t *timer = NULL;
// Прапорець для перемикання стану
volatile bool ledState = false;
// Функція, яку викликатиме таймер
void IRAM_ATTR onTimer() {
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
}
void setup() {
pinMode(LED_PIN, OUTPUT);
// Налаштування таймера:
// 0 – номер таймера (усього 4 в ESP32),
// true – рахувати вгору,
// 80 – переділювач (80 МГц / 80 = 1 МГц → 1 такт = 1 мкс).
timer = timerBegin(0, 80, true);
// Прив’язка обробника переривання
timerAttachInterrupt(timer, &onTimer, true);
// Налаштування періоду (500000 мкс = 500 мс)
timerAlarmWrite(timer, 500000, true);
// Запуск таймера
timerAlarmEnable(timer);
}
void loop() {
// Основний цикл вільний для інших завдань
}
Як працює цей код
- Таймер рахує мікросекунди й кожні 500 000 мкс викликає функцію
onTimer(). - У перериванні ми змінюємо стан змінної
ledStateі перемикаємо світлодіод. - Основний цикл
loop()залишається вільним для інших завдань (мережі, датчиків, логіки програми).
Висновок
Використання апаратних таймерів ESP32 дозволяє легко створювати періодичні завдання, наприклад:
миготіння світлодіода, опитування датчиків, керування моторами. Такий підхід набагато ефективніший, ніж використання delay(),
оскільки він не блокує виконання інших частин програми.
Мотор безщіточний A2212 1000KV
Мотор трьохфазний безколекторний для мультикоптерів 1000KVKV: 1000 обертів на вольтМаксимальна ..
360.40грн.
Двигун 12В з редуктором 150RPM
Двигун постійного струму з потужним редуктором для використання в різноманітній робототехніці, елект..
575.28грн.
Підключення крокового двигуна
Привіт друзі! Пропоную вам практичний алгоритм, як правильно підключити обмотки крокового двигуна ..
Калькулятори для електронщиків та радіоаматорів
Онлайн-калькулятори для розрахунку напруги, струму, опору, дільника напруги, резистора для світлодіо..
Модуль 4 реле I2C на DIN-рейку без корпусу
Плата продається без коробкиМодуль 4-х релейних виходів I2C для побудови домашньої або промислової с..
766.68грн.






