Введение в таймеры 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 и в реальном времени.
Стойка нейлоновая М3 15мм + 6мм
Стойка для крепления различных електронных модулей к корпусу устройстваВысота стойки 15 ммДлина внеш..
3.60грн.
Торцевые держатели линейных направляющих 8мм
Держатель цилиндрической направляющей диаметром 8 ммПодходит для любой оси 3D-принтера или CNCДиамет..
72.01грн.
Электрозамок 12В 2А
Очень функциональный надёжный и удобный в использовании замокТакие замки используются в электронных ..
501.00грн.
Держатель аккумулятора 3,7В типа 18650
Держатель для цилиндрических аккумуляторов типа 18650 на 3,7В..
32.03грн.
Набор транзисторов 10 х 10 шт.TO-92
В наборе следующие биполярные транзисторы по 10 штук каждого типа:BC337 BC327 2N2222 2N2907 2N3904 2..
138.35грн.






