Вступ до таймерів 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 структура програми для початківців
Доброго дня, друзі! Вы великі молодці, що зацікавились уроками Arduino! Структура програми в Ardu..
Інфрачервоний датчик руху HC-SR505
Мініатюрний економічний датчик руху.Напруга живлення 4,5 ... 20 ВСтрум спокою < 60 мкАВихідні лог..
76.78грн.
Датчик дотику ємнісний
Датчик видає дискретний сигнал на виході, коли до нього доторкаються пальцем.Його можна використовув..
28.76грн.
Компаратор подвійний LM393DR
LM393DR в корпусі SOP-8 для поверхневого монтажу.Ці мікросхеми розробники усіляких датчиків для люби..
4.04грн.
Кінцевик з коліщатком для 3D принтера або CNC ramps 1.4
Кінцевий вимикач для встановлення на 3D-принтер або CNC-верстат системи ramps 1.4В комплекті кабель ..
52.29грн.






