ESP32 таймеры: Многозадачность с аппаратными таймерами

ESP32 — это мощный микроконтроллер с двухъядерным процессором, поддержкой FreeRTOS и аппаратными таймерами. Одна из сильных сторон ESP32 — возможность использовать несколько таймеров одновременно. Это открывает путь к многозадачности без использования блокирующих функций, таких как delay().

Особенности многозадачности с таймерами

  • ESP32 имеет четыре аппаратных таймера (по два на каждый таймерный блок).
  • Каждый таймер может работать независимо и вызывать свой обработчик прерывания.
  • Можно выполнять параллельные задачи — например, подсчёт импульсов и мигание светодиодом.

Сравнение с обычными методами

В 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);

  // Таймер для мигания светодиодом: каждые 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 — мигает светодиодом.
  • Таймер 1 — считает импульсы.
  • Таймер 2 — измеряет интервал времени и отправляет данные в Serial.

Это позволяет строить реактивные системы без блокировок, где каждая задача обрабатывается отдельно.

Заключение

Многозадачность с аппаратными таймерами ESP32 позволяет запускать несколько независимых функций параллельно. Это удобно для проектов, где нужно одновременно работать с датчиками, светодиодами, моторами и коммуникационными протоколами. Используя таймеры, вы разгружаете основной цикл и повышаете стабильность работы устройства.

<< Проекты << Все товары >> Статьи, уроки >>

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Датчик влажности и температуры DHT21

Датчик влажности и температуры DHT21

Датчик влажности и температуры DHT21 (AM2301) – точный цифровой сенсор для Arduino и других микрокон..

261.32грн.

Модуль расширения входов-выходов 4 реле и 4 DI  I2C

Модуль расширения входов-выходов 4 реле и 4 DI I2C

Интересный модуль расширения 4-х входов и 4 релейных выходов с коммуникацией I2C на основе микросхем..

475.88грн.

Watchdog и таймеры ESP32

Watchdog и таймеры ESP32

Watchdog и таймеры ESP32 ESP32 оснащён встроенным Watchdog Timer (WDT), который используется для ..

Arduino UNO R3

Arduino UNO R3

Плата контроллера, полюбившаяся всем почитателям этой марки Arduino на базе микропроцессора ATmega3..

484.06грн.

Датчик звука

Датчик звука

Датчик звука (дискретный, с регулировкой чувствительности)Интеллектуальный дискретный датчик звука д..

49.61грн.

Рекомендуемые товары

Прерывания таймера ESP32: hw_timer_t, настройка обработчика и ограничения ISR

Прерывания таймера ESP32: hw_timer_t, настройка обработчика и ограничения ISR

Прерывания таймера ESP32: hw_timer_t, настройка обработчика и ограничения ISR ESP32 имеет а..

0.00грн.

Таймеры и FreeRTOS на ESP32

Таймеры и FreeRTOS на ESP32

Таймеры и FreeRTOS на ESP32 ESP32 работает под управлением FreeRTOS, и в дополнение к аппаратным ..

0.00грн.