Программный reset для Arduino Mega
Увы.. Работа Arduino Mega с сетевой картой оказалась не очень стабильной. Время от времени карта «зависает» и спасает только ресет всего устройства. Для того чтобы сделать «reset» есть два пути: 1) Подать на pin reset напряжение 2) Воспользоваться библиотекой /avr/wdt.h
Мы пойдем вторым путем..
#include <avr/wdt.h>
1 2 3 4 5 6 7 8 |
void loop() { //если давно не было подключения к интернету, думаем что контроллер завис и ресетим.. if (millis() > fail_timer) { ConsPrint("RESTART ARDUINO..."); wdt_enable(WDTO_15MS); delay(1500); }; ... |
Значения могут быть следующие:
WDTO_15MS
WDTO_30MS
WDTO_60MS
WDTO_120MS
WDTO_250MS
WDTO_500MS
WDTO_1S
WDTO_2S
WDTO_4S
WDTO_8S
,т.е. «назначаем рестарт через столько то времени». Но! Есть еще и возможность успеть сбросить таймер перезапуска : wdt_reset(); или вовсе отменить: wdt_disable();
Используя этот функционал мы например можем сделать следующую логику приложения:
запускаем таймер «ресет через 5 секунд»
запускаем «опасный для зависания код»
если код выполнился — сбрасываем таймер, перезагрузки не будет
если код не выполнился — произойдет автоматическая перезагрузка arduino