Внешний сторожевой таймер для ESP8266 на NE555

WDT ESP8266Работая с WiFi модулем ESP8266 встретился с его периодическим подвисанием. Причем программная перезагрузка и даже ресет через пин перезагрузки не всегда спасали ситуацию. На форуме esp8266.ru данная проблема неоднократно обсуждалась.  Виной был признан «сырой» SDK от производителя, который никак не «допилят».

Не дожидаясь, когда проблема стабильности ESP8266 будет решена производителем, решил оснастить свои изделия сторожевым таймером.

 

 

 

Материал из Википедии

Сторожевой таймер (Watchdog timer, WDT) — аппаратно реализованная схема контроля над зависанием системы. Представляет собой таймер, который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение некоторого интервала времени, происходит принудительная перезагрузка системы. В некоторых случаях сторожевой таймер может посылать системе сигнал на перезагрузку («мягкая» перезагрузка), в других же — перезагрузка происходит аппаратно (замыканием сигнального провода RST или сброса питания).

Перебрав разные схемы от применения внешнего микроконтроллера или специализированной WDT микросхемы до простейшей RC-цепочки, остановился на  интегральном таймере NE555.

555 — аналоговая интегральная схема, универсальный таймер — устройство для формирования (генерации) одиночных и повторяющихся импульсов со стабильными временными характеристиками. Применяется для построения различных генераторов, модуляторов, реле времени, пороговых устройств и прочих узлов электронной аппаратуры.

Под разными названиями ее производят самые различные компании, в том числе существует и наш отечественный аналог — КР1006ВИ1. Мне он и попался за 20 рублей в радиомагазине.

ЛР1006ВИ1

Стоимость 20 микросхем  на АЛИ в корпусе DIP-8 — $0.8

Итак собираю схему NE555 в режиме генератора импульсов

Схема WDT

R4, R5 и C1 подобраны таким образом, что время длинного импульса с логическим «1» на выходе таймера составляет около 12с, затем короткий импульс 0.2с с логическим «0», перезагружающий микроконтроллер, и опять длинный цикл. Подача короткого сигнала «0» на вход устройства сбрасывает время таймера. При подтянутом к «0» таймер имеет постоянное низкое напряжение на конденсаторе и «1» на выходе. Диод на входе нужен, чтобы конденсатор С1, задающий время таймера, не заряжался от высокого уровня на входе, что приводит к уменьшению периода срабатывания.

Сперва подумал, что удачным решением было подключить вход таймера к GPIO0 ESP-шки. GPIO0 при загрузке прошивки в ESP, подтягивается к земле. Поэтому в режиме прошивки таймер отключается. Но вовремя работы GPIO0 на выход, если оставить его подтянутым к земле, то при подачи на порт «1» он просто сгорает. Поэтому подключаем таймер на GPIO2 или любой другой порт ESP-шки, а работу таймера отключаем в режиме программирования второй контактной группой выключателя.

Выход таймера подключил к RESET ESP8266. Потом вспомнил обсуждения на форуме, что ресет у ESP-шки не всегда спасает и решил модернизировать схему.

Схема WDT

Как говориться, «против лома нет приема» — сброс питания ESP8266 всегда давало 100% результат. Так как выход NE555 рассчитан на ток 200мА (у КР1006ВИ1 100мА), маломощное 5-вольтовое реле подключил к нему напрямую.

Купить такие реле можно по $3 за 10 шт

Собираю схему на макетной плате

WDT на макетке

Соединяю все проводами

WDT в работе

Скетч предельно простой

При программирование или подаче низкого уровня на вход WDT напряжение на конденсаторе С1 низкое и таймер не срабатывает

WDT

Если не сбрасывать таймер, то напряжение на конденсаторе начинает расти и при достижении 2/3 напряжения питания происходит срабатывание таймера и сброс питания контроллера.

WDT высокий уровень кондесатора

 

Таймер работает, свои функции выполняет, повышая жизнеспособность решения на ESP-модуле. К недостатку такого решения я бы отнес двойное питание — 3.3В для ESP и 5В для реле. Было бы хорошо обойтись 3.3В, но для этого нужно либо искать более низковольтное реле, либо заменять его на низковольтный MOSFET транзистор с низким сопротивлением открытого перехода сток-исток.

 

Кот считает, что допускать каких то там собак в общем то нет надобности. И назвать все это лучше WATCHCAT

WDT и кот

Вы можете оставить отзыв или трекбек со своего сайта.

12 комментариев на «Внешний сторожевой таймер для ESP8266 на NE555»

  1. Сергей:

    Ниче себе маломощное реле, как по мне это обыкновенное, …
    Не замерял но интересно , что у вас все работает.

  2. Zeddy:

    как-то многовато обвязки получается. Может, использовать ватч дог у тиньки самой дешевой? Получается оверкилл конечно, зато тинька может просыпаться по гибкому графику и вообще работать от батарейки-таблетки.

    • Alexey Alexey:

      Я тоже следующую версию WDT хочу сделать на тиньке.

      • Александр:

        подскажите, в 2х словах, как wdt на тиньке организовать? причем треба следить за уной)

        • Alexey Alexey:

          В двух словах.
          На тиньке любым способом формируем задержку на нужное время (таймер)
          После срабатывание таймера на одном из выходов высокое состояние сменяется на низкое
          Это выход цепляем к RESET уны.
          Вход тиньки обнуляет таймер.

  3. Алексей:

    А что у esp своей собаки нет разве?

    • Alexey Alexey:

      1. Функции WiFi WDT успешно мониторит, а вот запустить его работать по моей логике мне не удалось.
      2. Были зависания, когда после срабатывания WDT перезагрузка не происходила. Несколько раз были ситуация, подвисало WiFi-соединение, dyenhtyybq WDT не срабатывал, а программная перезагрузка не спасала, только передергивание пмтания.

      Поэтома для критических приложений был разработан это сторожевой таймер

  4. Serafim:

    Интересно, а теоретически может же зависнуть процессор, когда пин сторожевого таймера установлен в «ноль» и сбросится тогда контроллер?

    • Сергей:

      Да, зависнет. Потому эта схема не состоятельна. Сторожевой таймер должен отслеживать наличие импульсов. Этот не сбросит, если на входе будет 0.

Ваш отзыв