Вступ до таймерів 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 і в задачах реального часу.
Тестуємо WEB-інструмент програмування Arduino на офіційному сайті
Подивимось ближче на веб-редакторНа офіційному сайті Arduino в розділі скачування засобів прог..
Модуль реле одноканальний 5В 10А
Одноканальный модуль реле для підключення напряму до дискретного виходу контролера. Світлодіодна інд..
43.11грн.
Розумний дім #11: Комунікаційні мережі
Розумний дім #11: Комунікаційні мережі Жодна система розумного дому неможлива без надій..
SIM800L як припаяти гребінку
Привіт друзі! Це коротка стаття під назвою SIM800L як припаяти гребінку. Модулі GSM зв'язку SIM8..
Модуль блока живлення 5В 700мА
Мініатюрний безкорпусний трансформаторний блок живлення для любительських проектів.Вхідна напруга 85..
70.15грн.






