Сброс 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();
}
@Felix Pursian, 👍1
Обсуждение2 ответа
Вы можете выполнить почти немедленный полный сброс с помощью watchdog, активировав его "на месте".
wdt_enable(WDTO_15MS); // resets the MCU after 15 milliseconds
while (true);
Вы можете использовать функцию millis() для синхронизации сброса, как и любую другую функцию синхронизации.
Вы можете использовать сторожевой таймер, но вам придется изменить способ измерения прошедшего времени. Попробуйте этот код:
#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() только один раз в начале цикла.
- Использовать timer0, не влияя на millis() и micros().
- Нельзя использовать millis() вместо задержки
- Сброс Arduino Uno в коде
- Как сбросить или отформатировать Arduino?
- Использование millis() и micros() внутри процедуры прерывания
- Как сделать очень долгую функцию delay(), несколько часов
- Разница между «time_t» и «DateTime»
- Получение BPM из данного кода
Вы действительно не можете использовать нестабильное программное обеспечение для сброса самого себя - если оно зависает, как оно может выполнить код сброса? Вам нужно будет либо: 1) отладить программное обеспечение (вы все равно должны это сделать); 2) использовать встроенный сторожевой таймер для сброса arduino, если ваше программное обеспечение не сбрасывает сторожевой таймер; или 3) использовать внешний аппаратный таймер для сброса Arduino с интервалами. Решение 3) должно быть ненужным, если вы делаете 1) и 2)., @JRobert
'wdt_reset()` сбрасывает таймер сторожевого пса, чтобы избежать сброса микроконтроллера. прочтите мой ответ еще раз, @Juraj