Сброс Arduino с помощью ПО (каждый день)

Уважаемые обменники стека,

Я хочу перезагружать свой Arduino и систему каждые 24 часа для предотвращения зависания программного обеспечения, а также других средств подключения.

Я написал программу, которая соединяет цифровой вывод с выводом сброса Arduino, и я хочу сбросить его таким образом.

Например, мой код :

unsigned long myTime; // Millis() function time value 
int timeExpected = 5000; // I want to reset it in every 5 secs for testing.
const int RESET_PIN = 2; // Reset pin's connection

void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN,OUTPUT);
}
void loop() {
  digitalWrite(LED_BUILTIN,HIGH);
    myTime = millis();
    Serial.println(myTime); // prints time since program started
     delay(1000);

   if(myTime % timeExpected == 0) {
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
     Serial.println("RESET");
    //digitalWrite(RESET_PIN, LOW);(I just test with LED_BUILTIN Low function)
    }

  }

Я пробовал использовать сторожевой таймер, но я не могу сделать это в течение 24 часов. Если у вас есть другое решение для сброса в течение 24 часов, пожалуйста, сообщите мне и пришлите мне соответствующую статью/книгу/ссылку и т.д. Я проверю и внедрю в свой код.

ОБНОВЛЕНИЕ: Я сделал это, но он не сбрасывается очень быстро . Код :

#include <avr/wdt.h>
unsigned long myTime;
int timeExpected = 5000; 


void setup() {
  Serial.begin(9600);
Serial.println("Setup started :");
// make a delay before enable WDT
// this delay help to complete all initial tasks
delay(2000);
wdt_enable(WDTO_2S);
}


void loop() {
    myTime = millis();
    delay(1000);
    Serial.println(myTime); // prints time since program started
   if(myTime == timeExpected) {
     Serial.println("RESET");
    wdt_reset();
    }

, 👍1

Обсуждение

Вы действительно не можете использовать нестабильное программное обеспечение для сброса самого себя - если оно зависает, как оно может выполнить код сброса? Вам нужно будет либо: 1) отладить программное обеспечение (вы все равно должны это сделать); 2) использовать встроенный сторожевой таймер для сброса arduino, если ваше программное обеспечение не сбрасывает сторожевой таймер; или 3) использовать внешний аппаратный таймер для сброса Arduino с интервалами. Решение 3) должно быть ненужным, если вы делаете 1) и 2)., @JRobert

'wdt_reset()` сбрасывает таймер сторожевого пса, чтобы избежать сброса микроконтроллера. прочтите мой ответ еще раз, @Juraj


2 ответа


1

Вы можете выполнить почти немедленный полный сброс с помощью watchdog, активировав его "на месте".

wdt_enable(WDTO_15MS); // resets the MCU after 15 milliseconds
while (true);

Вы можете использовать функцию millis() для синхронизации сброса, как и любую другую функцию синхронизации.

,

2

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

#include <avr/wdt.h>

unsigned long myTime; // Millis() function time value
unsigned long elapsedTime;
unsigned long timeExpected = 5000; // I want to reset it in every 5 secs for testing.
const int RESET_PIN = 2; // Reset pin's connection

void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  myTime = millis();
  Serial.println("INIT");
  wdt_enable(WDTO_2S); //Enable wdt every two seconds

}
void loop() {

  //************RESET HANDLER********************//
  elapsedTime = millis() - myTime;
  if (elapsedTime > timeExpected) {
    Serial.print("RESET");
    while (1); //Intentionally halt the program, so the watchdog performs the reset    
  }
  //**********************************************
  //****************REST OF THE PROGRAM***********
  wdt_reset(); //Ensure one call to this function at least one time in two seconds or less
  digitalWrite(LED_BUILTIN, HIGH);
  Serial.println(elapsedTime); // prints time since program started
  delay(1000);           
}

Пожалуйста, обратите внимание, что если у вас есть несколько задержек в вашей программе, вы должны обеспечить вызов функции wdt_reset (), чтобы предотвратить нежелательные сбросы. Лично я стараюсь не использовать задержки и рекомендовал бы избегать задержек как можно больше. Вы можете ознакомиться с этим руководством, если хотите узнать, как избежать задержек. Если вам удастся избежать задержек, вы можете вызвать wdt_reset() только один раз в начале цикла.

,