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 позволяет запускать несколько независимых функций параллельно. Это удобно для проектов, где нужно одновременно работать с датчиками, светодиодами, моторами и коммуникационными протоколами. Используя таймеры, вы разгружаете основной цикл и повышаете стабильность работы устройства.
Модуль твердотельного реле 4-канальный
Модуль предназначен для коммутации нагрузок с переменным напряжением питания 75 ... 264 ВМаксимальны..
258.23грн.
Умный дом #10: Датчик CO2
Умный дом #10: Датчик CO₂ Контроль качества воздуха в помещении — один из ключевых элем..
Как правильно составить техническое задание для разработки электроники
Как правильно составить техническое задание для разработки электроники Если вы планируете разрабо..
Автоматическое открытие окна по температуре — проект на Arduino
Сколько раз вы просыпались от холода летом или осенью, забыв закрыть окно перед сном? Слишком жарк..
Подключение шагового двигателя
Привет, друзья! Предлагаю вам практический алгоритм, как правильно подключить обмотки шагового дви..







