Вступ до таймерів ESP32

Мікроконтролер ESP32 оснащений потужними апаратними таймерами, які дозволяють виконувати завдання з високою точністю та без блокування роботи програми. Ці таймери називаються General Purpose Timers і входять до складу двох Timer Groups — кожна група містить по 2 таймери, всього доступно 4 таймери для користувача.

Апаратні таймери ESP32

  • Доступно 4 таймери (по 2 в кожній групі Timer Group0 та Timer Group1).
  • Точність до 80 МГц (залежно від джерела тактування).
  • Можуть працювати в режимі одноразового або періодичного запуску.
  • Підтримка переривань: можна викликати функцію при кожному спрацюванні таймера.

Відмінність від millis() і delay()

Функції millis() та delay() зручні для простих проєктів, але мають обмеження:

  • millis() і micros() надають доступ лише до поточного часу, але не можуть безпосередньо запускати дії.
  • delay() повністю блокує виконання коду, що заважає багатозадачності.
  • Апаратні таймери дозволяють запускати функції у фоновому режимі, без зупинки основної програми.

Переваги апаратних таймерів ESP32

  • Висока точність: мікросекундні інтервали.
  • Можливість паралельного запуску кількох таймерів.
  • Робота у фоновому режимі — головний цикл loop() залишається вільним.
  • Можна реалізувати завдання «реального часу» — наприклад, вимірювання частоти, генерацію сигналів або циклічне опитування датчиків.

Приклад 1. Простий таймер із перериванням

Цей код викликає функцію кожну 1 секунду.


hw_timer_t *timer = NULL;

void IRAM_ATTR onTimer() {
  Serial.println("Таймер спрацював!");
}

void setup() {
  Serial.begin(115200);

  // Створюємо таймер: (номер, преддільник, рахувати вгору)
  timer = timerBegin(0, 80, true); 
  // Преддільник 80 => частота 1 МГц (1 мкс на такт)

  // Прив’язуємо обробник переривання
  timerAttachInterrupt(timer, &onTimer, true);

  // Налаштовуємо таймер: кожні 1 000 000 мкс = 1 секунда
  timerAlarmWrite(timer, 1000000, true);

  // Запускаємо
  timerAlarmEnable(timer);
}

void loop() {
  // Основний цикл вільний
}

Приклад 2. Кілька таймерів

Можна запустити кілька таймерів для різних завдань.


hw_timer_t *timer1 = NULL;
hw_timer_t *timer2 = NULL;

void IRAM_ATTR onTimer1() {
  Serial.println("Таймер 1: миготіння світлодіода");
  digitalWrite(2, !digitalRead(2));
}

void IRAM_ATTR onTimer2() {
  Serial.println("Таймер 2: опитування датчика");
}

void setup() {
  pinMode(2, OUTPUT);
  Serial.begin(115200);

  // Таймер 1: кожні 500 мс
  timer1 = timerBegin(0, 80, true);
  timerAttachInterrupt(timer1, &onTimer1, true);
  timerAlarmWrite(timer1, 500000, true);
  timerAlarmEnable(timer1);

  // Таймер 2: кожні 2 секунди
  timer2 = timerBegin(1, 80, true);
  timerAttachInterrupt(timer2, &onTimer2, true);
  timerAlarmWrite(timer2, 2000000, true);
  timerAlarmEnable(timer2);
}

void loop() {
  // Все працює у перериваннях
}

Приклад 3. Одноразовий таймер

Іноді потрібно виконати дію лише один раз із затримкою.


hw_timer_t *timer = NULL;

void IRAM_ATTR onTimer() {
  Serial.println("Одноразовий таймер спрацював!");
}

void setup() {
  Serial.begin(115200);
  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, &onTimer, true);
  timerAlarmWrite(timer, 3000000, false); // 3 секунди, без автоповтору
  timerAlarmEnable(timer);
}

void loop() {
  // Одноразовий запуск, після чого таймер вимикається
}

Висновок

Апаратні таймери ESP32 дозволяють реалізовувати більш надійні та гнучкі проєкти у порівнянні з використанням delay() чи millis(). Вони забезпечують високу точність, паралельне виконання завдань та відсутність блокувань — це особливо важливо у проєктах IoT і в задачах реального часу.

<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Arduino 4-20 мА підключення датчика рівня

Arduino 4-20 мА підключення датчика рівня

Бувають такі часи в житті ардуінщіка, коли йому доводиться з глибин аматорських датчиків підніматися..

Модуль гальванорозв'язки 4-канальний

Модуль гальванорозв'язки 4-канальний

Модуль захисту та гальванічної розв'язки 4-х дискретних входів контролера з гвинтовими клемниками. ..

114.76грн.

SIM800L GSM модуль

SIM800L GSM модуль

SIM800L GSM модуль SIM800L — компактний GSM/GPRS модуль, побудований на спеціалізованій мікросхем..

224.19грн.

WIFI ESP8266 добовий графік температури та вологості

WIFI ESP8266 добовий графік температури та вологості

Постановка задачі Пропонуємо вашій увазі новий цікаво-корисний проект з використанням WiFi-к..

Розробка пристроїв на ESP32 / Arduino / STM32 під замовлення

Розробка пристроїв на ESP32 / Arduino / STM32 під замовлення

Розробка пристроїв на ESP32 / Arduino / STM32 під замовлення Потрібен прототип або го..

Рекомендовані товари

Створення простого таймера на ESP32: приклад періодичного виклику функції

Створення простого таймера на ESP32: приклад періодичного виклику функції

Створення простого таймера на ESP32: приклад періодичного виклику функції Під час розробки проєкт..

0.00грн.