Arduino bloqueado por watchdog

  • Iniciador del tema Iniciador del tema nito_dj
  • Fecha de inicio Fecha de inicio
Registrado
28 Sep 2008
Mensajes
2.256
Ubicación
España
Provincia
Rivas Vaciamadrid (Madrid)
Tengo un problema con mi arduino, cuando se ejecuta el codigo, pasadas unas horas no se bien porque motivo, se quedaba parado y no seguía con la ejecución programada en el void loop, a veces era a las 4 horas, otras a las 9 horas, otras a las 10 horas...nunca un tiempo definido.
Para evitar esto le puse un wachdog pero ahora se ha quedado bloqueado y no puedo compilarlo de nuevo...me podeis ayudar por favor??? que puedo hacer para desbloquearlo??
 
Despues de 20 veces darle al boton del reset, he conseguido que vuelva a despertar la placa.

Ahora espero alguien me pueda ayudar porque ando desesperado!!! No se el motivo de que pasadas ciertas horas, deja de ejecutarse el programa,se queda parado completamente con lo que si la luz esta encendida, llegada la hora de anochecer y apagarse, no lo hace y se queda encendida. Me pasa varias veces al dia y no se que hacer...

Aqui os dejo mi codigo:

PHP:
#include <Wire.h>   // Incluye la librería Wire 

#include "RTClib.h" // Incluye la librería RTClib 

#include <OneWire.h> 

#include <pitches.h> //Libreria para buzzer 

RTC_DS1307 RTC; // Crea el objeto RTC 
  


int LED1=5; //AMARILLO 

int LED2=6; //VERDE 

int LED3=7; //ROJO  


void setup () { 

Serial.begin(9600); // Establece la velocidad de datos del puerto serie 

Wire.begin(); // Establece la velocidad de datos del bus I2C 

RTC.begin();// Establece la velocidad de datos del RTC 

//RTC.adjust(DateTime(__DATE__, __TIME__));  

//pinMode(buz, OUTPUT); 

//pinMode (boya, INPUT); 

pinMode(9, OUTPUT); 

pinMode(LED1, OUTPUT); 

pinMode(LED2, OUTPUT); 

pinMode(LED3, OUTPUT);  

} 

void loop () { 

  int minute; 

  int hour; 

  int tiempo; 

  int segundo; 

DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC 

Serial.print(now.year(), DEC); 

Serial.print('/'); 

Serial.print(now.month(), DEC); 

Serial.print('/'); 

Serial.print(now.day(), DEC); 

Serial.print(' '); 

Serial.print(now.hour(), DEC); 

Serial.print(':'); 

Serial.print(now.minute(), DEC); 

Serial.print(':'); 

Serial.print(now.second(), DEC); 

Serial.println(); 

Serial.print("Dia de la semana: "); 

Serial.println(now.dayOfWeek(), DEC); 

tiempo=(now.hour()*60)+now.minute(); 

/*if (tiempo < 60) 

  { 

   tiempo=tiempo+1440;*/ 

   
Serial.println(); 

Serial.print("Tiempo: "); 

Serial.println(tiempo); 

Luces (tiempo); 

}  

void Luces(int tiempo) 

{ 

 ///////////tiempos de progamacion////////// 

 int PotLED; 

 int InicioAmanecerLED=720; //12:00 

 int FinAmanecerLED=780; //13:00 // 

 int InicioAnochecerLED=1320; //22:00// 

 int FinAnochecerLED=1380; //23:00// 

 int MaxLED=125; //Maximo que vamos a encender los LED sobre 255  

//Noche 

 if (tiempo >FinAnochecerLED || tiempo < InicioAmanecerLED )  

  { 

   PotLED=0; 

   Serial.println(); 

   Serial.print("NOCHE: "); 

   Serial.println(PotLED); 

   Serial.println(); 
    
   analogWrite(9, PotLED); 

  digitalWrite(LED3, HIGH);   // encendemos LED Rojo 

  delay(1000); 

 } 

//Amanecer 

 if (tiempo >= InicioAmanecerLED && tiempo <= FinAmanecerLED)  

  { 

   PotLED=map(tiempo,InicioAmanecerLED,FinAmanecerLED,0,MaxLED); 

   Serial.println(); 

   Serial.print("AMANECIENDO: "); 

   Serial.println(PotLED); 

   Serial.println(); 
    
   analogWrite(9, PotLED); 

  digitalWrite(LED2, LOW);    //  apagamos LED Verde 

  digitalWrite(LED3, LOW);    //  apagamos LED Rojo 

  digitalWrite(LED1, HIGH);   // encendemos LED Amarillo 

  delay(500); 

  digitalWrite(LED1, LOW);    //  apagamos LED Amarillo 

  delay(500);  

  }  

//Dia 

 if (tiempo > FinAmanecerLED && tiempo < InicioAnochecerLED)  

  { 

   PotLED=MaxLED; 

   Serial.println(); 

   Serial.print("DIA: "); 

   Serial.println(PotLED); 

   Serial.println(); 
    
   analogWrite(9, PotLED); 

  digitalWrite(LED2, HIGH);   // encendemos LED Verde 

  delay(1000); 

  }  

//Anochecer 

 if (tiempo >= InicioAnochecerLED && tiempo <= FinAnochecerLED) 

  { 

   PotLED=map(tiempo,InicioAnochecerLED,FinAnochecerLED,MaxLED,0); 

   Serial.println(); 

   Serial.print("ANOCHECIENDO: "); 

   Serial.println(PotLED); 

   Serial.println(); 
    
   analogWrite(9, PotLED); 

  digitalWrite(LED2, LOW);    //  apagamos LED Verde 

  digitalWrite(LED3, LOW);    //  apagamos LED Rojo 

  digitalWrite(LED1, HIGH);   // encendemos LED Amarillo 

  delay(500);               // 

  digitalWrite(LED1, LOW);    //  apagamos LED Amarillo 

  delay(500);  

  } 

 //Control 

 if(PotLED < 0)  

  { 

   PotLED=0; 

  }  

if(PotLED >MaxLED)  

  { 

   PotLED=MaxLED; 

  } 

}

Espero me ayudeis porque llevo varios dias sin saber que hacer

Saludos
 
Así a primera vista no veo nada que pueda hacer que se quede colgado el arduino. Lo que si haría seria quitar los int que tienes para la fecha y hora definidos en el loop si no los utilizas, y si los vas a utilizar los definiría como globales.

En cuanto a que se te quede colgado puede ser mas por culpa de un arduino clonico que de otra cosa, a mi alguna vez me ha pasado con el mega chino que tengo, mientras que con el original esto no suele pasar, (no obstante en el clonico es raro que se quede pillado, pero a veces lo hace).

Otra opción también recomendable es usar un freeMemory para eliminar los residuos que vas generando en cada iteración del loop, y los delay, yo los pondria al final del loop y no dentro de la función, aunque esto es más por forma de hacer las cosas que por hacerlas mejor.... Para la función que te digo de freeMemory(), ponla al final del loop y para poder usarla tendras que bajarte la libreria MemoryFree.h (si no la encuentras intento buscartela y ponerla)
 
Quiza sea fallo de la placa arduino porque el codigo ya no se que puede estar mal...

El que yo he comprado es este:

¿Me recomiendas comprar otro? y si es asi, tienes algun link?

Saludos
 
Prueba con lo que te comente del freeMemory(), en principio la placa es del mismo fabricante a las que tengo yo compradas de aliexpress. Si te recomendara que compraras otra sería el Arduino Original, te podria pasar enlaces por privado, pero son unas 3 veces mas caras que esa, quiza algo más incluso.

Saludos.
 
A veces el arduino se puede resetear debido a ruido electronico producido al activar un rele que arrancaba una bomba, por ejemplo. A mi me pasaba cuando se arrancaba el skimmer. Modifica el código de manera que puedas ver cual fue la ultima instrucción ejecutada.
Si sigue igual, pon un código sencillo y mira si se cuelga de nuevo. También deberías probar el código que te falla sin conectar el arduino a nada mas.
 
A veces el arduino se puede resetear debido a ruido electronico producido al activar un rele que arrancaba una bomba, por ejemplo. A mi me pasaba cuando se arrancaba el skimmer. Modifica el código de manera que puedas ver cual fue la ultima instrucción ejecutada.
Si sigue igual, pon un código sencillo y mira si se cuelga de nuevo. También deberías probar el código que te falla sin conectar el arduino a nada mas.

Lo cierto es que cuando probaba el programa aun sin conectarlo a los led, aparentemente no se me bloqueaba nada, ha sido a raiz de conectarlo todo y meter en una caja electrica la placa arduino junto con la fuente de alimentacion de los LED, ¿Cress que quizá tener la fuente pegada haga que se pare el arduino?
 
Prueba con lo que te comente del freeMemory(), en principio la placa es del mismo fabricante a las que tengo yo compradas de aliexpress. Si te recomendara que compraras otra sería el Arduino Original, te podria pasar enlaces por privado, pero son unas 3 veces mas caras que esa, quiza algo más incluso.

Saludos.

Ya he puesto los del freeMemory donde me indicas y lo he dejado funcionando antes de venir a trabajar, cuando llegue veré si se ha vuelto a parar.
Sería una faena que fuera problema del arduino :(
 
Puede ser. Los trafos de alimentación que usamos no siempre son muy buenos y dan una calidad de onda muy mala. Cualquier pequeña perturbación en la red puede resetearte el arduino. A mi sólo me pasaba al activar un relé. Una cosa que puedes probar para descartar es alimentar el arduino a con una pila de 9 voltios y ver si sigue pasando.
Si es tema es de ruido las soluciones no son triviales y pasan por usar osciloscopio para diagnosticar el problema...así que yo probaría primero con otra alimentación por ejemplo.
 
Puede ser. Los trafos de alimentación que usamos no siempre son muy buenos y dan una calidad de onda muy mala. Cualquier pequeña perturbación en la red puede resetearte el arduino. A mi sólo me pasaba al activar un relé. Una cosa que puedes probar para descartar es alimentar el arduino a con una pila de 9 voltios y ver si sigue pasando.
Si es tema es de ruido las soluciones no son triviales y pasan por usar osciloscopio para diagnosticar el problema...así que yo probaría primero con otra alimentación por ejemplo.

Voy a intentar separarlos de tal manera que se deje distancia de la placa a la fuente de alimentación, así veré si es esto lo que lo provoca ya que unas veces es a las 4 horas otras a las 2 y otras a las 10...nunca es en un momento concreto.
 
Pues nada, al llegar a casa seguia bien todo pero al poco se ha vuelto a bloquear.

He separado el arduino de la fuente que alimenta los led a ver si asi funciona bien o tambien se bloquea y asi ir descartando posibles causas...mucho me temo que el arduino va a estar mal por no ser original :(
 
Yo los que tengo los alimento por el USB, porque si los alimento por la entrada de alimentación no funcionan bien, prueba a ver si eso te ayuda. o simplemente deja ejecutando el arduino conectado al pc (si mostrar por el serial), a ver si se te cuelga.
 
Yo los que tengo los alimento por el USB, porque si los alimento por la entrada de alimentación no funcionan bien, prueba a ver si eso te ayuda. o simplemente deja ejecutando el arduino conectado al pc (si mostrar por el serial), a ver si se te cuelga.

Lo he puesto alimentado solo por USB y se ha bloqueado igual :( ahora la prueba que he hecho ha sido ponerlo conectado a los 9V pero desconectado del PC para ver si asi se bloquea...quizá pueda ser que se bloquee por el hecho de estar conectado al PC no lo se...
De todos modos, he hablado con el venedor de ebay para exponerle el problema, dice que me devuelve 8€ para que no te ponga voto negativo, voy a intentar que me mande un arduino nuevo y lo le mando este de vuelta...
Si aun asi no funciona, tendre que comprar uno original pero creo que se me hace caro para lo que lo necesito y quizá compre el UNO en lugar del MEGA
 
El vendedor de ebay me ha dado dos posibilidades, mandarme otro arduino o devolverme el dinero. Que hariais vosotros? Creeis que si me manda otro arduino pese a ser una replica funcionará correctamente o sería mejor que me devuelva el dinero y compre un arduino UNO original que no es tan caro como el MEGA? Para lo que lo quiero que es solo para la luz con el UNO me valdrá yo creo...
 
Hola!
Yo he tenido varios Arduinos "no originales" y no he tenido ningún problema....

Salu2
 
Hola!
Yo he tenido varios Arduinos "no originales" y no he tenido ningún problema....

Salu2

Voy a pedirle entonces que me mande otro arduino y ver si este funciona...espero sea fallo de la placa porque sino me voy a volver loco!!
 
Hola!
Yo he tenido varios Arduinos "no originales" y no he tenido ningún problema....

Salu2

Crees que el motivo de que se bloquee puede ser otro?? ya no se me ocurre que debe ser...alimento la placa con 9V con lo que no creo que sea por voltaje... el código, hay gente que lo ha probado y tal cual le funciona correctamente.

He probado hasta a poner la EEPROM todos los bytes a cero por si acaso estaba algo mal...ya no se me ocurre que pueda ser otra cosa.
 
Buenas noches.
comprobar que no sea la placa es muy fácil...cargarle un programa de los que hay de ejemplo.
Puedes probar con el BLINK...y ves el led de la placa parpadear....si deja de parpadear esta bloqueada...(es raro)

Un saludo
 
Buenas noches.
comprobar que no sea la placa es muy fácil...cargarle un programa de los que hay de ejemplo.
Puedes probar con el BLINK...y ves el led de la placa parpadear....si deja de parpadear esta bloqueada...(es raro)

Un saludo

Pues despues de todas las pruebas que he hecho, esto no lo habia probado :( y debía haber sido lo primero que hiciera.
Gracias!! esta noche lo dejaré asi
 
Ahora si que estoy descolocado...he dejado toda la noche y toda la mañana el programa BLINK funcionando y no se ha bloqueado, he pensado que quizá era problea del reloj RTC y le he añadido un par de lineas al BLINIK para que cogiera y leyera la hora y tampoco se ha bloqeuado.
La prueba que he dejado lanzada es el programa que yo tenía para dimear el encendido de los led, pero sin que imprima nada por el serial...cuando vuelva del trabajo veré si se ha vuelto a bloquear...ya no se que puede pasar!!!
 
Atrás
Arriba