Внешний сторожевой таймер для 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 и кот

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

20 комментариев на «Внешний сторожевой таймер для 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.

  5. Павел:

    Вместо реле поставил транзистор 2N4401. NE555 и сам транзистор запитал от 5В, далее ESP8266 запитал через LM1117. ВСе работает. НО! есть нюанс, если плата ESP8266 «повиснет» в состоянии, когда WDR-Pin находится в состоянии LOW, то вотч-кэт не сработает никогда…

    • Alexey Alexey:

      Совершенно верно
      Сейчас собираю таймеры на ATTINY13 и сбрасываю постоянной заменой LOW на HIGH
      Да и обвязки на тиньке меньше

      • Павел:

        Вот нашел и реализовал схемку на «Исключающем ИЛИ». Использовал 2 n-p-n транзистора (2N4401) в качестве R выбрал 75кОм, C — 47мкф.
        Вход слева, выход — справа — подал на ваш вход вотч-кота.
        Данная схема сбрасывает только при поступлении перехода HIGH-LOW. Если будет длинный HIGH или LOW, то вотч-кот сработает и произойдет сброс питания.
        Фото схемы:

        http://pixs.ru/showimage/IMG2018060_6763131_30339008.jpg

  6. Павел:

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

  7. Павел:

    По поводу вотчдога на attiny 13. Как боритесь, если завис произошел при присоединенным входом reset на attiny 13 к земле? Собственно, с чего все и началось? Выложенная мною схема это лечит. И не нужен гимор с изучением attiny 13.

    • Alexey Alexey:

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

      • Павел:

        Да, я уже реализовал на тиньке. Также считаю переходы high/low одновременно другими выводами отслеживаю напряжение питания аккумулятора, в случае отключения энергии и многое что еще. Спасибо за наводку.

Ваш отзыв