Введение в таймеры 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 и в реальном времени.
Arduino SIM800 CBC уровень заряда
Привет друзья! У полюбившегося нам SIM800L есть аналого-цифровой преобразователь, который предназнач..
Инфракрасный датчик движения HC-SR505
Миниатюрный экономичный датчик движения.Напряжение питания 4,5 ... 20 ВТок покоя < 60 мкАВыходные..
76.78грн.
Ремень зубчатый 6 мм для 3D-принтера
Отрезок зубчатого ремня шириной 6 мм.Применяется для перемещения каретки 3D-принтера или CNC по разн..
49.26грн.
DC DC преобразователь понижающий с 4...35В до 1,25...32В 5А
Модуль питания на основе специализированной микросхемы XL4005Диапазон входных напряжений 4..
95.02грн.
Микро концевой выключатель KW-1
Микро переключатель с максимальным током коммутации 2 А. Такие ставят в компьютерные мышки в качеств..
7.18грн.






