crash - wdt_feed - Arduino ''se estrelló?'' después de 12 horas
watchdog esp8266 arduino (2)
Soy nuevo en el mundo Arduino. Escribió el siguiente código: utilizando el sensor DHT22. Después de 12 horas, el calentador de mi invernadero no estaba encendido cuando estaba por debajo de la temperatura deseada.
Después de apagar y volver a encender todo, todo vuelve a funcionar bien. Sé que este código es muy complicado, pero ¿tiene alguna pérdida de memoria? ¿O algo más que podría estar causando que deje de funcionar?
Editar - Encontré un contador abierto que aumentó en 1 cada 2 segundos. No puedo imaginar que fuera eso, pero lo cambié aquí: http://pastebin.com/nuRjHJkR
Consejo de Old Army:
Si no puedes arreglarlo, píntalo.
El temporizador de vigilancia está presente en estos microcontroladores solo con el fin de mantener sus plantas vivas independientemente de su código. Cada pasada (), alimentas al perro con un simple
wdt_reset();
Si su programa se cuelga y deja de alimentar al perro, la MCU se reiniciará.
Configura el tiempo de espera para el perro guardián en la configuración (). Para sus propósitos, podría usar un gran tiempo de espera de 8 segundos que debería proporcionar un margen enorme en el tiempo de ejecución del bucle más largo (). ¿Cuánto tiempo toman esas lecturas de sensor?
Vea el enlace de las páginas de Arduino para una descripción simple: watchdog
El único peligro evidente en su código es el sprintf (). El mundo sería un lugar mejor si nadie lo usara de nuevo. Reemplace esto
void loop() {
...
char buf[128];
sprintf(buf, "Integer-only reading: Temperature %hi.%01hi C, Humidity %i.%01i %% RH",
myDHT22.getTemperatureCInt()/10, abs(myDHT22.getTemperatureCInt()%10),
myDHT22.getHumidityInt()/10, myDHT22.getHumidityInt()%10);
//Serial.println(buf);
con
void loop() {
...
const size_t sizeBuf = 128;
char szBuf[128+1];
snprintf(szBuf, sizeBuf, "Integer......", ... );
szBuf[sizeBuf] = ''/0'';
Las versiones "n" existen para todas las funciones de cadena, y todas proporcionan la especificación del tamaño del búfer de destino para que pueda estar seguro de que nunca rebasarán el búfer. Tenga en cuenta que las funciones no aseguran la terminación cero, por lo que la línea adicional para garantizar.
Por lo tanto, con snprintf, puede estar seguro de que si se produce un error en un millón de errores de datos que causaría una conversión inesperada de cadenas, su código seguirá en ejecución.
En esta línea, no hay mucho beneficio para asignar el char buf [] dentro del bucle. Como todo lo que hace un programa es ejecutar loop () infinitamente, no está guardando recursos de memoria al hacer esto una variable local en la pila. Solo hay una ventana microscópica donde no se usa la memoria de la pila. Pero al estar en la pila, si desborda buf, un desbordamiento puede borrar la dirección de retorno que seguramente haría que un programa falle. Todo es peligro sin retorno.
Piensa así
const size_t sizeBuf = 128;
char szBuf[128+1];
void loop() {
...
snprintf(szBuf, sizeBuf, "Integer......", ... );
szBuf[sizeBuf] = ''/0'';
En este método, la memoria se asigna estáticamente, y usted sabe en tiempo de compilación cuánta memoria requiere su programa.