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 разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Умный дом #3: ESP32 + датчик температуры и влажности (DHT22/SHT21)

Умный дом #3: ESP32 + датчик температуры и влажности (DHT22/SHT21)

Умный дом #3: ESP32 + датчик температуры и влажности (DHT22/SHT21) Контроль температуры и в..

Адаптер для радио модуля NRF24L01

Адаптер для радио модуля NRF24L01

Модуль, облегчающий подключение радио приемо-передатчика NRF24L01 к любительским контроллерамНа..

26.73грн.

Циклы 3 — Цикл while

Циклы 3 — Цикл while

Циклы 3 — Цикл while Введение Цикл while — это конструкция, которая выполняет код до тех..

Потенциометр Robotale

Потенциометр Robotale

Двухканальный переменный резистор прямолинейной конструкцииСопротивление 10 кОмРазмеры 90 х 20 мм..

111.67грн.

ESP32 LED PWM: управление яркостью светодиодов LEDC

ESP32 LED PWM: управление яркостью светодиодов LEDC

ESP32 LED PWM Controller: управление яркостью светодиодов ESP32 имеет встроенный модуль LED..

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

Прерывания таймера 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грн.