Создание простого таймера на ESP32: пример периодического вызова функции

При разработке проектов на ESP32 часто возникает необходимость вызывать функцию через равные промежутки времени. Для этого можно использовать аппаратные таймеры, которые работают независимо от основного цикла loop(). Они позволяют организовать точное выполнение задач без блокировки программы, в отличие от функции delay().

Почему не стоит использовать delay()

  • delay() полностью останавливает выполнение кода на заданное время;
  • в этот момент не обрабатываются другие события (например, датчики, связь по Wi-Fi);
  • таймеры позволяют запускать функцию параллельно, без блокировок.

Простой пример: мигание светодиодом без delay()

В примере ниже используется аппаратный таймер ESP32. Мы настроим его так, чтобы он вызывал функцию onTimer() каждые 500 мс. Внутри функции происходит переключение состояния светодиода.


#define LED_PIN 2  // встроенный светодиод на многих платах ESP32

// Указатель на таймер
hw_timer_t *timer = NULL;

// Флаг для переключения состояния
volatile bool ledState = false;

// Функция, которую будет вызывать таймер
void IRAM_ATTR onTimer() {
  ledState = !ledState;  
  digitalWrite(LED_PIN, ledState);
}

void setup() {
  pinMode(LED_PIN, OUTPUT);

  // Настройка таймера:
  // 0 – номер таймера (всего 4 в ESP32),
  // true – считать вверх,
  // 80 – предделитель (80 МГц / 80 = 1 МГц → 1 тик = 1 мкс).
  timer = timerBegin(0, 80, true);

  // Привязка обработчика прерывания
  timerAttachInterrupt(timer, &onTimer, true);

  // Настройка периода (500000 мкс = 500 мс)
  timerAlarmWrite(timer, 500000, true);

  // Запуск таймера
  timerAlarmEnable(timer);
}

void loop() {
  // Основной цикл свободен для других задач
}

Как работает этот код

  • Таймер считает микросекунды и каждые 500 000 мкс вызывает функцию onTimer().
  • В обработчике прерывания мы меняем состояние переменной ledState и переключаем светодиод.
  • Основной цикл loop() остаётся свободным для других задач (сети, датчиков, логики программы).

Заключение

Использование аппаратных таймеров ESP32 позволяет легко создавать периодические задачи, например: мигание светодиодом, опрос датчиков, управление моторами. Такой подход гораздо эффективнее, чем использование delay(), поскольку он не блокирует выполнение других частей программы.

<< Проекты << Все товары >> Статьи, уроки >>

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Универсальная монтажная плата на 400 отверстий

Универсальная монтажная плата на 400 отверстий

Макетная плата на 400 отверстий для макетирования любительских схемотехнических проектов. Имеет 4 ли..

85.85грн.

Arduino Nano 3.0

Arduino Nano 3.0

Миниатюрная плата контроллера из линейки Aduino на базе микропроцессора ATMEGA328P-AU (это тот же ко..

179.44грн.

Разработка систем мониторинга: температура, вес, расход воды, влажность

Разработка систем мониторинга: температура, вес, расход воды, влажность

Современный бизнес, сельское хозяйство и промышленность всё чаще нуждаются не просто в электронике..

Понижающий преобразователь напряжения с ограничением по току 8...36В в 1,25...32В 5А

Понижающий преобразователь напряжения с ограничением по току 8...36В в 1,25...32В 5А

Импульсный преобразователь напряжения постоянного тока с 8 ... 36В в 1,25 ... 32В на основе мик..

99.70грн.

Стабилизатор напряжения 3,3 В 800 мА LM1117T-3.3

Стабилизатор напряжения 3,3 В 800 мА LM1117T-3.3

Стабилизатор напряжения в виде микросхемы с тремя ногамиИспользуется для стабилизации нестабилизиров..

19.54грн.

Рекомендуемые товары

Введение в таймеры ESP32: примеры использования и настройка

Введение в таймеры ESP32: примеры использования и настройка

Введение в таймеры ESP32 Микроконтроллер ESP32 оснащён мощными аппаратными таймерами, которые поз..

0.00грн.

Прерывания таймера ESP32: hw_timer_t, настройка обработчика и ограничения ISR

Прерывания таймера ESP32: hw_timer_t, настройка обработчика и ограничения ISR

Прерывания таймера ESP32: hw_timer_t, настройка обработчика и ограничения ISR ESP32 имеет а..

0.00грн.