Watchdog en Arduino Uno R3

Buenas, quería hacer una consulta, tengo cargado en software bastante complejo con strings y punteros en un Arduino Uno R3 que tiene montado un Shield GSM Sim900, lo que hace es cada 5 minutos reportarme a través de php a la Web datos recolectados por el arduino, el problema que tengo es que funciona bien durante un determinado tiempo que siempre es variante 10hs, 5hs, 19hs etc, pero en un momento determinado se cuelga y deja de reportar, si apago y prendo la alimentación de 12v, inicia nuevamente el sistema y funciona bien hasta que se vuelve a colgar.

Le estoy buscando una solución a este problema y pensé un timer reset electronico con la entrada de 12v para que cada cierto tiempo me haga un reset automático.

Pero lei el tema del watchdog y quisa pueda servirme en este caso, el problema que tengo es que no se bien como funciona, por ejemplo mi loop tiene 4min en dar toda la vuelta y lei que el wachdog tiene 8seg maximo de control para el reset.

Alguien podría darme una mano con este problema y ver que es lo que puedo llegar a probar para solucionarlo??

Gracias.-

Por la falta de código podría mentirte, pero se me ocurre que podrías llamar la función que reinicia el temporizador del watchdog, cada una, dos o tres líneas de código (incluidas las funciones adicionales al setup y loop)

Ok, pruebo asi, cada 2 o 3 segundos de codigo del loop le pongo la funcion del reset y vemos si funciona.

En Arduino Uno R3, anda el watchdog??? o tengo que modificarle algo del boot???

El tema del bootloader no lo tengo del todo claro, pero por si las dudas, prueba este código:

#include <avr/wdt.h> // Incluir la librería que contiene el watchdog (wdt.h)

byte segundos = 0;

void setup()
{
  wdt_disable(); // Desactivar el watchdog mientras se configura
  Serial.begin(9600);
  wdt_enable(WDTO_8S); // Configurar a ocho segundos
  wdt_reset(); // Actualizar el watchdog para que no produzca un reinicio
}
 
void loop()
{
  Serial.println(segundos);
  segundos++;
  delay(1000);
}

En teoría debería contar desde cero hasta 7 u 8. Si sobrepasa el 9 o el programa se paralizó, entonces sí es cosa de bootloader.

PD: código tomado de este ejemplo.

En tu código usas punteros o Strings? Has vigilado la freeRAM?

http://www.arguino.com.ar/site/index.php/ardu/10-uso-del-watchdog-problema-que-tienen-los-arduinos-y-como-solucionarlo

Buenas tardes, revivo este hilo para no generar uno nuevo, ya que trata del mismo tema.

Tengo un Arduino UNO R3 con un W5500 conectado por SPI que funciona perfecto, hasta que deja de hacerlo a intervalos no regulares, 5 horas, 10, horas o mas...

Lei muy atentamente el tema del watchdog y me gustaria saber si es correcto lo que pienso... el watchdog mira si no hay un cuelgue por 8 segundos si llega a 9 segundos sin una nueva instraccion reinicia el programa y arranca desde cero ???

Es eso correcto ???


#include <wdt.h>

void setup()
{
wdt_disable();
wdt_enable(WDTO_8S);
wdt_reset();
}


creo que al final seria asi; estas lineas en el SETUP:

** wdt_disable();**
** wdt_enable(WDTO_8S);**

y esta en el LOOP para resetear el timer de los 8 segundos antes del reinicio:

** wdt_reset();**