wdtdisable wdt_feed wdt esp disable crash arduino

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?

http://pastebin.com/CcdUN3jb

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.