Работая с WiFi модулем ESP8266 встретился с его периодическим подвисанием. Причем программная перезагрузка и даже ресет через пин перезагрузки не всегда спасали ситуацию. На форуме esp8266.ru данная проблема неоднократно обсуждалась. Виной был признан «сырой» SDK от производителя, который никак не «допилят».
Не дожидаясь, когда проблема стабильности ESP8266 будет решена производителем, решил оснастить свои изделия сторожевым таймером.
Сторожевой таймер (Watchdog timer, WDT) — аппаратно реализованная схема контроля над зависанием системы. Представляет собой таймер, который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение некоторого интервала времени, происходит принудительная перезагрузка системы. В некоторых случаях сторожевой таймер может посылать системе сигнал на перезагрузку («мягкая» перезагрузка), в других же — перезагрузка происходит аппаратно (замыканием сигнального провода RST или сброса питания).
Перебрав разные схемы от применения внешнего микроконтроллера или специализированной WDT микросхемы до простейшей RC-цепочки, остановился на интегральном таймере NE555.
555 — аналоговая интегральная схема, универсальный таймер — устройство для формирования (генерации) одиночных и повторяющихся импульсов со стабильными временными характеристиками. Применяется для построения различных генераторов, модуляторов, реле времени, пороговых устройств и прочих узлов электронной аппаратуры.
Под разными названиями ее производят самые различные компании, в том числе существует и наш отечественный аналог — КР1006ВИ1. Мне он и попался за 20 рублей в радиомагазине.
Стоимость 20 микросхем на АЛИ в корпусе DIP-8 — $0.8
Итак собираю схему NE555 в режиме генератора импульсов
R4, R5 и C1 подобраны таким образом, что время длинного импульса с логическим «1» на выходе таймера составляет около 12с, затем короткий импульс 0.2с с логическим «0», перезагружающий микроконтроллер, и опять длинный цикл. Подача короткого сигнала «0» на вход устройства сбрасывает время таймера. При подтянутом к «0» таймер имеет постоянное низкое напряжение на конденсаторе и «1» на выходе. Диод на входе нужен, чтобы конденсатор С1, задающий время таймера, не заряжался от высокого уровня на входе, что приводит к уменьшению периода срабатывания.
Сперва подумал, что удачным решением было подключить вход таймера к GPIO0 ESP-шки. GPIO0 при загрузке прошивки в ESP, подтягивается к земле. Поэтому в режиме прошивки таймер отключается. Но вовремя работы GPIO0 на выход, если оставить его подтянутым к земле, то при подачи на порт «1» он просто сгорает. Поэтому подключаем таймер на GPIO2 или любой другой порт ESP-шки, а работу таймера отключаем в режиме программирования второй контактной группой выключателя.
Выход таймера подключил к RESET ESP8266. Потом вспомнил обсуждения на форуме, что ресет у ESP-шки не всегда спасает и решил модернизировать схему.
Как говориться, «против лома нет приема» — сброс питания ESP8266 всегда давало 100% результат. Так как выход NE555 рассчитан на ток 200мА (у КР1006ВИ1 100мА), маломощное 5-вольтовое реле подключил к нему напрямую.
Купить такие реле можно по $3 за 10 шт
Собираю схему на макетной плате
Соединяю все проводами
Скетч предельно простой
1 #define PinWDT 2
1234567891011 void setup(){Serial.begin(115200);// Инициализируем выход на WDTWDT_init();// Отключаем таймер, устанавливая логический вывод на 0WDT_disable();// Инициализация рабочих функций ......// Сброс таймера и установка его в рабочий режимWDT_reset();}
123456 void loop(){// Алгоритмы основного цикла программы...// Сброс WDTWDT_reset();}
1234567 /*** Функция инициализации WDT*/void WDT_init(){pinMode(PinWDT , OUTPUT);Serial.printf("WDT init on %d pin ...\n",PinWDT);}
1234567 /*** Функция выключения WDT*/void WDT_disable(){digitalWrite(PinWDT,LOW);Serial.printf("WDT disable ...\n");}
123456789 /*** Функция перезагрузки сторожевого*/void WDT_reset(){digitalWrite(PinWDT,LOW);delay(100);digitalWrite(PinWDT,HIGH);Serial.printf("WDT reset ...\n");}
При программирование или подаче низкого уровня на вход WDT напряжение на конденсаторе С1 низкое и таймер не срабатывает
Если не сбрасывать таймер, то напряжение на конденсаторе начинает расти и при достижении 2/3 напряжения питания происходит срабатывание таймера и сброс питания контроллера.
Таймер работает, свои функции выполняет, повышая жизнеспособность решения на ESP-модуле. К недостатку такого решения я бы отнес двойное питание — 3.3В для ESP и 5В для реле. Было бы хорошо обойтись 3.3В, но для этого нужно либо искать более низковольтное реле, либо заменять его на низковольтный MOSFET транзистор с низким сопротивлением открытого перехода сток-исток.
- Статья на en.wikipedia.org
- Статья на ru.wikipedia.org
- Даташит на NE555 от NXP на английском
- Даташит на КР1006ВИ1 на русском
- Различные схемы с NE555
Кот считает, что допускать каких то там собак в общем то нет надобности. И назвать все это лучше WATCHCAT
Ниче себе маломощное реле, как по мне это обыкновенное, …
Не замерял но интересно , что у вас все работает.
Ток срабатывание реле 10мА. Там обмотка на 500Ом.
По даташиту максимальный ток выхода таймера 200мА (100 у советского)
Почему не должно работать?
по даташиту у этого реле 70 Ом и 71 mA, но все равно это меньше 200 mA )
https://www.ghielectronics.com/downloads/man/20084141716341001RelayX1.pdf
и кажется питание заводить надо на нижний контакт кнопки …
как-то многовато обвязки получается. Может, использовать ватч дог у тиньки самой дешевой? Получается оверкилл конечно, зато тинька может просыпаться по гибкому графику и вообще работать от батарейки-таблетки.
Я тоже следующую версию WDT хочу сделать на тиньке.
подскажите, в 2х словах, как wdt на тиньке организовать? причем треба следить за уной)
В двух словах.
На тиньке любым способом формируем задержку на нужное время (таймер)
После срабатывание таймера на одном из выходов высокое состояние сменяется на низкое
Это выход цепляем к RESET уны.
Вход тиньки обнуляет таймер.
А что у esp своей собаки нет разве?
1. Функции WiFi WDT успешно мониторит, а вот запустить его работать по моей логике мне не удалось.
2. Были зависания, когда после срабатывания WDT перезагрузка не происходила. Несколько раз были ситуация, подвисало WiFi-соединение, dyenhtyybq WDT не срабатывал, а программная перезагрузка не спасала, только передергивание пмтания.
Поэтома для критических приложений был разработан это сторожевой таймер
Интересно, а теоретически может же зависнуть процессор, когда пин сторожевого таймера установлен в «ноль» и сбросится тогда контроллер?
Да, зависнет. Потому эта схема не состоятельна. Сторожевой таймер должен отслеживать наличие импульсов. Этот не сбросит, если на входе будет 0.
Вместо реле поставил транзистор 2N4401. NE555 и сам транзистор запитал от 5В, далее ESP8266 запитал через LM1117. ВСе работает. НО! есть нюанс, если плата ESP8266 «повиснет» в состоянии, когда WDR-Pin находится в состоянии LOW, то вотч-кэт не сработает никогда…
Совершенно верно
Сейчас собираю таймеры на ATTINY13 и сбрасываю постоянной заменой LOW на HIGH
Да и обвязки на тиньке меньше
Вот нашел и реализовал схемку на «Исключающем ИЛИ». Использовал 2 n-p-n транзистора (2N4401) в качестве R выбрал 75кОм, C — 47мкф.
Вход слева, выход — справа — подал на ваш вход вотч-кота.
Данная схема сбрасывает только при поступлении перехода HIGH-LOW. Если будет длинный HIGH или LOW, то вотч-кот сработает и произойдет сброс питания.
Фото схемы:
http://pixs.ru/showimage/IMG2018060_6763131_30339008.jpg
Павел, а не могли бы Вы свою схему перезалить? А то ссылка уже старая и изображения нет. Сам схему искал на исключающем ИЛИ, но что-то так и не вкурил как реализовать, а готового варианта не нашел.
Перезалейте пожалуйста вашу схему, ссылки устарели обе. В проекте каком-то использовали, сбоев нет?
Фото: https://yadi.sk/i/zL5afT3g3XGJe3
Диод можно убрать. Правый светодиод тоже, его ставил для тестов. Просто правый выход на ваш вход. Происходит сброс до 1В на конденсаторе вотч-кота. При 3.2В на конденсаторе у меня срабатывает вотч-кат и выключается питание. Повторюсь, что я питаю ESP8266 через транзистор 2N4401, ей хватает и не так громоздко, как реле.
По поводу вотчдога на attiny 13. Как боритесь, если завис произошел при присоединенным входом reset на attiny 13 к земле? Собственно, с чего все и началось? Выложенная мною схема это лечит. И не нужен гимор с изучением attiny 13.
Ресет к земле — это аппаратная проблема. Вачдог призван решать программные.
С тиньками что удобно, можно настроить на любой период — от миллисекунд, до часов.
Сейчас стараюсь вообще без таких костылей обходиться. Ошибки исправлять.
Да, я уже реализовал на тиньке. Также считаю переходы high/low одновременно другими выводами отслеживаю напряжение питания аккумулятора, в случае отключения энергии и многое что еще. Спасибо за наводку.