Arduino watchdog или автоматический RESET в случае зависания

05.05.2019

Добавление WiFi модуля и внешнего WatchDog таймера

Хочу вам сообщить, что контроллер, который вы собрали сами, по моим инструкциям, можно подружить с интернетом!

Преимущества работы контроллера с интернетом:

  • Синхронизация часов с сервером времени
  • Автоматический переход на зимнее/летнее время
  • Вы узнаете о выходе новой версии прошивки
  • Просмотр данных вашего контроллера с мобильного устройства
  • Подключение к сайту log2.com.ua

Небольшая ложка дегтя – это все привилегии платной версии прошивки MEGA CtrlM, которая стоит, не так уж и дорого – всего $4.95! Кроме того, данная прошивка поддерживает 8 датчиков температуры, 8 управляемых выходов и программирование, т.е задание собственных условий.

Для покупки прошивки обращайтесь ко мне, на info@сайт Платная прошивка сделает ваше устройство более гибким, и в тоже время, вы вносите ваш вклад в дальнейшее развитие проекта.

Немного подробнее про каждый пункт.

Синхронизация времени и переход на летнее/зимнее время

Тут в общем то все ясно. Модуль часов DS1307 не может похвастаться своей точностью. К примеру, у меня за пол года, часы «отстали» более чем на 2 часа. Да и батарейка может не вовремя разрядиться. Разумеется, обрадует вас и автоматический перевод часов на зимнее или летнее время – два раза в год одной проблемой меньше. А часы ведь нам нужны – для правильного ведения лога, для отправки данных на сервер, для выполнения нагрева по расписанию! Для тех стран, где нет перевода часов, эту опцию можно отключить, оставив только синхронизацию.

Выход новой прошивки

Что может быть радостнее, чем весть об исправлении старых ошибок и добавлении новых возможностей в ваше устройство. Можно сказать, что ваше устройство начинает вторую жизнь!

Просмотр данных с мобильного устройства.

Здесь вообще можно расслабиться:) Лежа на диване, заходите на web-страничку вашего контроллера, и смотрим текущие значения датчиков. Справедливости ради надо сказать, что страничка, бывает, загружается не с первого раза и ничего тут не поделаешь. В будущем, эту проблему решу написанием отдельного приложения для Android. Для того, чтобы ваш контроллер не менял ip адрес, в настройках роутера привяжите ему статический ip по MAC адресу. К слову, если ip вашего контроллера 192.168.0.106 то для просмотра показаний датчиков в строке браузера вашего телефона, планшета или компьютера надо ввести http://192.168.0.106/d459 Как правило, http:// можно не вводить, достаточно лишь 192.168.0.106/d459

Локальный web-монитор. Так же можно включать или выключать выходы.

Подключение к сайту log2.com.ua

Если вы хотите наблюдать за вашей системой, лежа на диване, к примеру, в Турции или еще где-нибудь, за пределами вашей страны, то можно подключить ее к глобальному online монитору на сайте log2.com.ua Сайт этот мой. Он имеет очень простой интерфейс но выполняет свои функции.


Глобальный online монитор, следит за гелиосистемой.

Надо понимать, что после этого, не обязательно использовать контроллер именно для солнечных систем! Он, как контроллер и как наблюдатель справится с вашей системой отопления, теплицей, дачей и т.д… Т.е его область применения значительно расширяется.


Глобальный online монитор, следит за системой отопления.

Для подключения контроллера к сети я использую WiFi модуль ESP8266-01. Для его подсоединения понадобится пару резисторов и конвертор логических сигналов. Лучше его заказать сразу с модулем ESP8266. Все вместе обойдется вам примерно в 150 грн.

Можно подключить ESP8266 и без конвертора логических сигналов, но так делать настоятельно не рекомендуется!


Схема подключения ESP8266-01. Нам понадобится еще 2 резистора 4.7К и один 470R


Использование пинов на плате Arduino MEGA для подключения модуля WiFi и внешнего WatchDog таймера

И еще, для теста можно брать питание 3.3V для модуля ESP8266 напрямую от платы Arduino. Он находится возле пина RESET. Но, для более стабильной работы, рекомендуется вывести отдельное питание от 5В, и понизить его до 3.3В с помощью понижающей микросхемы AMS1117.


Схема понижения 5В до 3.3В для питания WiFi модуля ESP8266


Подключение внешнего WatchDog таймера

Никто не застрахован от ошибок, в том числе и я. Иногда, с выходом новой прошивки и добавлением новых возможностей вы можете получить и новые проблемы в виде зависания контроллера. Не стоит так сильно пугаться. Я тестирую прошивки перед их выпуском, но все равно могу что-то недосмотреть или не учесть. Человеческий фактор никто не отменял. Внутренний сторожевой таймер, который должен стоять на страже нашего контроллера, и перезагружать его в случае зависания, работает далеко не всегда! Тут проблема не в самом watchdog"e, а в моем коде. Контроллер может зависнуть на участке, который будет исправно сбрасывать watchdog и мы никогда не перезагрузимся. По этой причине я решил добавить еще один, внешний watchdog, который имеет довольно большой интервал перезагрузки от 140 до 300 секунд, и сброс этого таймера происходит только в главной программе. Поэтому, если мы зависнем, выполняя какую-либо функцию – наш внешний watchdog сработает!


Схема внешнего WatchDog таймера на микросхеме 555. Взято

Если возиться с платой нет времени, то можно купить у меня почти готовый набор для сборки – печатную плату и набор радиокомпонентов. Собрав его, вы получите WatchDog таймер и плату для подключения WiFi модлуя. Цена набора 150грн.


Плата WathcDog + WiFi. Модуль WiFi не входит в комплект!


Плата WathcDog + WiFi, другой ракурс

Предлагаю вариант устройства автоматически перезагружающее компьютер при зависании.

В основе лежит известная плата Arduino с минимальным количеством внешних электронных компонентов. Транзистор подключаем к плате согласно рисунку ниже. Коллектор транзистора подключаем вместо кнопки «Reset» компьютера на материнскую плату, на тот контакт который НЕ соединен с GND.

Вот и вся схема:

Функционирует устройство следующим образом: на компьютере запускается скрипт, который периодически шлет в порт компьютера данные. Ардуино подключается к USB и слушает этот порт. Если в течении 30 секунд данных нет Ардуино открывает транзистор, который соединяет Reset c землей, тем самым имитируя нажатия кнопки сброса.
После сброса ардуино делает паузу в 2 минуты дожидаясь загрузки всех программ и вновь начинает слушать порт.

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

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

Так же можно использовать любой Н канальный транзистор с похожими характеристиками. Но смотрите что бы совпадала цоколевка. Например я использовал 9013 , там перевернутое подключение

Компонентты для сборки я покупал на Алиэкспресс:

Провода для макетной сборки http://ali.pub/22k78b

Ардуино УНО (точно подходит) http://ali.pub/22k7dd

Arduino uno с кабелем http://ali.pub/22k7go

Скетч Ардуино

int LedPin = 13;
int ResetPin = 12;
int val = 0;
int count = 0;
void setup()
{
Serial.begin(9600);
pinMode(LedPin,OUTPUT);

//пауза на запуск 2 мин
delay (120000);
}

void loop()
{
count++ ;

if (Serial.available() > 0)
{
val = Serial.read();
if (val == ‘H’)
{
digitalWrite(LedPin,LOW);
digitalWrite(ResetPin,LOW);
count = 0;
}
else
{ count++ ;
}
}

delay (1000);

if (count > 10)
{
digitalWrite(LedPin,HIGH);
digitalWrite(ResetPin,HIGH);
}
}

Скрипт отправляющий в порт данные:

(Get-Date).ToString(‘dd.MM.yyyy HH:mm’) | Out-File c:UsersminerDesktopreboot.txt -append

while($TRUE){
Start-Sleep -s 3
$port= new-Object System.IO.Ports.SerialPort COM3,9600,None,8,one
$port.open()
$port.WriteLine(«H»)
$port.Close()
}

Сразу после запуска скрипт записывает в файл reboot.txt текущую дату и время. По этому файлу можно судить о количество и времени перезагрузок. Путь к файлу и номер порта необходимо отредактриовать в соответствии с вашими данными системы. Код пишется в обычном блокноте и сохраняется с расширением *ps1.

Т.к. в Windows политикой безопасности отключено выполнение скриптов по двойному клику и из автозагрузки делаем финт ушами и запускаем шелл из батника следущего содержания:

start PowerShell.exe -ExecutionPolicy ByPass -File «c:путь к вашему файлуваш файл.ps1»

Файл сохраняем с расширением *.bat и ставим его в автозагрузку.

Радуемся, теперь у нас все автоматизированно. Устройство испытано на своем ПК и польностью работает.

Подписывайтесь на Bitnovosti в telegram!

Делитесь вашим мнением об этой новости в комментариях под статьёй.

Предлагаю вариант устройства автоматически перезагружающее компьютер при зависании.

В основе лежит известная плата Arduino с минимальным количеством внешних электронных компонентов. Транзистор подключаем к плате согласно рисунку ниже. Коллектор транзистора подключаем вместо кнопки «Reset» компьютера на материнскую плату, на тот контакт который НЕ соединен с GND.

Вот и вся схема:

Функционирует устройство следующим образом: на компьютере запускается скрипт, который периодически шлет в порт компьютера данные. Ардуино подключается к USB и слушает этот порт. Если в течении 30 секунд данных нет Ардуино открывает транзистор, который соединяет Reset c землей, тем самым имитируя нажатия кнопки сброса.
После сброса ардуино делает паузу в 2 минуты дожидаясь загрузки всех программ и вновь начинает слушать порт.

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

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

Так же можно использовать любой Н канальный транзистор с похожими характеристиками. Но смотрите что бы совпадала цоколевка. Например я использовал 9013 , там перевернутое подключение

Компонентты для сборки я покупал на Алиэкспресс:

Провода для макетной сборки http://ali.pub/22k78b

Ардуино УНО (точно подходит) http://ali.pub/22k7dd

Скетч Ардуино

int LedPin = 13;
int ResetPin = 12;
int val = 0;
int count = 0;
void setup()
{
Serial.begin(9600);
pinMode(LedPin,OUTPUT);

//пауза на запуск 2 мин
delay (120000);
}

void loop()
{
count++ ;

if (Serial.available() > 0)
{
val = Serial.read();
if (val == ‘H’)
{
digitalWrite(LedPin,LOW);
digitalWrite(ResetPin,LOW);
count = 0;
}
else
{ count++ ;
}
}

delay (1000);

if (count > 10)
{
digitalWrite(LedPin,HIGH);
digitalWrite(ResetPin,HIGH);
}
}

Скрипт отправляющий в порт данные:

(Get-Date).ToString(‘dd.MM.yyyy HH:mm’) | Out-File c:\Users\miner\Desktop\reboot.txt -append

while($TRUE){
Start-Sleep -s 3
$port= new-Object System.IO.Ports.SerialPort COM3,9600,None,8,one
$port.open()
$port.WriteLine(«H»)
$port.Close()
}

Сразу после запуска скрипт записывает в файл reboot.txt текущую дату и время. По этому файлу можно судить о количество и времени перезагрузок. Путь к файлу и номер порта необходимо отредактриовать в соответствии с вашими данными системы. Код пишется в обычном блокноте и сохраняется с расширением *ps1.

Т.к. в Windows политикой безопасности отключено выполнение скриптов по двойному клику и из автозагрузки делаем финт ушами и запускаем шелл из батника следущего содержания.

Что же такое Watchdog или сторожевой таймер?

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

Предлагаю вариант устройства автоматически перезагружающее компьютер при зависании.

В основе лежит известная плата Arduino с минимальным количеством внешних электронных компонентов. Транзистор подключаем к плате согласно рисунку ниже. Коллектор транзистора подключаем вместо кнопки "Reset" компьютера на материнскую плату, на тот контакт который НЕ соединен с GND.




Вот и вся схема:

Функционирует устройство следующим образом: на компьютере запускается скрипт, который периодически шлет в порт компьютера данные. Ардуино подключается к USB и слушает этот порт. Если в течении 30 секунд данных нет Ардуино открывает транзистор, который соединяет Reset c землей, тем самым имитируя нажатия кнопки сброса.
После сброса ардуино делает паузу в 2 минуты дожидаясь загрузки всех программ и вновь начинает слушать порт.

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





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

Так же можно использовать любой Н канальный транзистор с похожими характеристиками. Но смотрите что бы совпадала цоколевка. Например я использовал 9013 , там перевернутое подключение



Компонентты для сборки я покупал на Алиэкспресс:

Провода для макетной сборки http://ali.pub/22k78b

Ардуино УНО (точно подходит) http://ali.pub/22k7dd

Скетч Ардуино

int LedPin = 13;
int ResetPin = 12;
int val = 0;
int count = 0;
void setup()
{
Serial.begin(9600);
pinMode(LedPin,OUTPUT);

//пауза на запуск 2 мин
delay (120000);
}

void loop()
{
count++ ;

If (Serial.available() > 0)
{
val = Serial.read();
if (val == "H")
{
digitalWrite(LedPin,LOW);
digitalWrite(ResetPin,LOW);
count = 0;
}
else
{ count++ ;
}
}

If (count > 10)
{
digitalWrite(LedPin,HIGH);
digitalWrite(ResetPin,HIGH);
}
}

Скрипт отправляющий в порт данные:

(Get-Date).ToString("dd.MM.yyyy HH:mm") | Out-File c:\Users\miner\Desktop\reboot.txt -append

while($TRUE){
Start-Sleep -s 3
$port= new-Object System.IO.Ports.SerialPort COM3,9600,None,8,one
$port.open()
$port.WriteLine("H")
$port.Close()
}

Сразу после запуска скрипт записывает в файл reboot.txt текущую дату и время. По этому файлу можно судить о количество и времени перезагрузок. Путь к файлу и номер порта необходимо отредактриовать в соответствии с вашими данными системы. Код пишется в обычном блокноте и сохраняется с расширением *ps1.



Т.к. в Windows политикой безопасности отключено выполнение скриптов по двойному клику и из автозагрузки делаем финт ушами и запускаем шелл из батника следущего содержания:

Похожие статьи