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 позволяет запускать несколько независимых функций параллельно. Это удобно для проектов, где нужно одновременно работать с датчиками, светодиодами, моторами и коммуникационными протоколами. Используя таймеры, вы разгружаете основной цикл и повышаете стабильность работы устройства.
Умный дом #3: ESP32 + датчик температуры и влажности (DHT22/SHT21)
Умный дом #3: ESP32 + датчик температуры и влажности (DHT22/SHT21) Контроль температуры и в..
Адаптер для радио модуля NRF24L01
Модуль, облегчающий подключение радио приемо-передатчика NRF24L01 к любительским контроллерамНа..
26.73грн.
Циклы 3 — Цикл while
Циклы 3 — Цикл while Введение Цикл while — это конструкция, которая выполняет код до тех..
Потенциометр Robotale
Двухканальный переменный резистор прямолинейной конструкцииСопротивление 10 кОмРазмеры 90 х 20 мм..
111.67грн.
ESP32 LED PWM: управление яркостью светодиодов LEDC
ESP32 LED PWM Controller: управление яркостью светодиодов ESP32 имеет встроенный модуль LED..







