Watchdog и таймеры ESP32

ESP32 оснащён встроенным Watchdog Timer (WDT), который используется для защиты программы от зависаний. Он работает в связке с системными таймерами и позволяет автоматически перезапускать контроллер, если код перестал корректно выполняться. Это особенно важно в проектах «Интернет вещей» и автоматизации, где устройство должно работать надёжно без постоянного вмешательства человека.

Как связаны таймеры и WDT

  • WDT (Watchdog Timer) основан на аппаратном таймере ESP32.
  • Каждый WDT имеет свой «таймаут» (время ожидания).
  • Если в течение заданного интервала программа не «покормит» (reset/refresh) WDT, он перезапустит систему.
  • Таким образом WDT использует таймеры для отсчёта времени бездействия программы.

Защита программы от зависаний

Программа может зависнуть из-за ошибок в коде, бесконечных циклов или аппаратных проблем. Watchdog следит, чтобы этого не произошло:

  • Если код работает правильно, в нём регулярно вызывается функция «кормления» WDT.
  • Если код застрял и WDT не сброшен вовремя, контроллер автоматически перезагружается.
  • Это гарантирует, что устройство не останется «мертвым», а вернётся в рабочее состояние.

Пример: использование Task Watchdog


#include "esp_task_wdt.h"

void setup() {
  Serial.begin(115200);
  // Инициализация WDT: 5 секунд таймаут
  esp_task_wdt_init(5, true);
  // Добавляем текущий поток (loop) под контроль
  esp_task_wdt_add(NULL);
}

void loop() {
  Serial.println("Работаем нормально...");
  delay(1000);
  // "Кормим" watchdog
  esp_task_wdt_reset();

  // Если закомментировать строку выше — WDT перезапустит контроллер через 5 секунд
}

Пример: защита от зависания в бесконечном цикле


void loop() {
  for (long i = 0; i < 1000000000; i++) {
    // длинные вычисления...
    if (i % 1000000 == 0) {
      // сброс WDT внутри тяжёлого цикла
      esp_task_wdt_reset();
    }
  }
}

Особенности и рекомендации

  • WDT есть как у CPU, так и у таймеров FreeRTOS.
  • Системный WDT по умолчанию включён — он перезапускает ESP32 при блокировке.
  • Для критически важных задач используйте Task Watchdog и «кормите» его в рабочих потоках.
  • Не стоит отключать WDT без необходимости — это снижает надёжность системы.

Заключение

Watchdog в ESP32 — это механизм на основе таймеров, который обеспечивает устойчивость работы микроконтроллера. Он автоматически перезапускает устройство при зависаниях, защищая вашу систему от сбоев. Использование WDT особенно актуально в автономных IoT-устройствах, работающих 24/7.

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

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

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

Циклы 4 — Цикл do...while

Циклы 4 — Цикл do...while Введение Цикл do...while — это разновидность цикла while, но с..

Датчик вращения енкодер KY-040

Датчик вращения енкодер KY-040

Енкодер вращения KY-040 - это поворотный датчик, который индицирует степень поворота оси и в каком н..

37.93грн.

Отправка данных в Google Sheets по таймеру (ESP32 раз в 5 минут пишет данные)

Отправка данных в Google Sheets по таймеру (ESP32 раз в 5 минут пишет данные)

ESP32 → Google Sheets: отправка данных в таблицу раз в 5 минут В этом примере ESP32 автоматичес..

Кодовый замок из набора резисторов

Кодовый замок из набора резисторов

Используя несколько сдвоенных компараторов можно сделать кодовый замок, ключ для которого будет сост..

Усилитель PAM8610 10x2Вт с регулировкой громкости и разъемами

Усилитель PAM8610 10x2Вт с регулировкой громкости и разъемами

Стерео усилитель звуковой частоты класса D с переменным резистором регулирования громкости, разъемам..

131.91грн.

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

Измерение времени и точные задержки на ESP32

Измерение времени и точные задержки на ESP32

Измерение времени и точные задержки на ESP32 ESP32 обладает мощной системой аппаратных таймеров, ..

0.00грн.

ESP32 Timer Groups: архитектура и использование

ESP32 Timer Groups: архитектура и использование

ESP32 Timer Groups: архитектура и использование Микроконтроллер ESP32 имеет мощную систему аппара..

0.00грн.