You could also use the System.reset() function for a more managed approach
here are some code snippets I use (with SYSTEM_THREAD(ENABLED) to get a handle on resets etc. You could enable the system watchdog early and have a cloud connection test in setup() or loop() that calls the reset function below - or the watchdog resets it if the cloud function hangs up.
enum enum_rebootReasons
{
RESET_UNKNOWN,
RESET_NETWORK_FAILED,
RESET_TVIEW_FAILED,
RESET_CLOUD_FAILED,
RESET_COMMAND,
RESET_GRACEFULL,
RESET_REQUEST, //reset requested manual or app/formware update
RESET_ATTRIBUTE, // reset after attribute updates for brk or udp
numOfResetReasons
};
const char resetReasonsText[numOfResetReasons][sizeOfResetReasonText] = {
"Unknown",
"Network failure",
"tView failure",
"Cloud failure",
"Remote command",
"Gracefull request",
"Reset request", // from button or cloud
"Attribute reset" // reset after attribute updates for brk or udp
};
// ------------------------------------------------------------------------------
void resetDevice(int resetReason) // minimal reset called from system event or reset button
// ------------------------------------------------------------------------------
{
Serial.print("Reset reason %s", resetReasonsText[resetReason]);
delay(200); // allow serial buffer to flush
System.enableReset();
System.reset(resetReason);
}
and then call this on startup so you know what broke …
// ------------------------------------------------------------------------------
void prevResetReason() //
// ------------------------------------------------------------------------------
{
const int maxSizeOfResetText = 59;
const int maxSizeOfResetMsg = 60;
char systemResetMsg[maxSizeOfResetMsg] = "Reset:Non defined reason"; // reset reason not defined in DeviceOS
uint32_t data = System.resetReasonData();
switch (System.resetReason())
{
case RESET_REASON_PIN_RESET: // Reset button or reset pin
snprintf(systemResetMsg, maxSizeOfResetText, "Reset:Button or reset pin");
break;
case RESET_REASON_POWER_MANAGEMENT: // Low-power management reset
snprintf(systemResetMsg, maxSizeOfResetText, "Reset:Low-power management");
break;
case RESET_REASON_POWER_DOWN: // Power-down reset
snprintf(systemResetMsg, maxSizeOfResetText, "Reset:Power-down");
break;
case RESET_REASON_POWER_BROWNOUT: // Brownout reset
snprintf(systemResetMsg, maxSizeOfResetText, "Reset:Brownout");
break;
case RESET_REASON_WATCHDOG: // Hardware watchdog reset
snprintf(systemResetMsg, maxSizeOfResetText, "Reset:Hardware watchdog");
break;
case RESET_REASON_UPDATE: // Successful firmware update
snprintf(systemResetMsg, maxSizeOfResetText, "Reset:Successful firmware update");
break;
case RESET_REASON_UPDATE_TIMEOUT: // Firmware update timeout
snprintf(systemResetMsg, maxSizeOfResetText, "Reset:Firmware update timeout");
break;
case RESET_REASON_FACTORY_RESET: // Factory reset requested
snprintf(systemResetMsg, maxSizeOfResetText, "Reset:Factory reset requested");
break;
case RESET_REASON_SAFE_MODE: // Safe mode requested
snprintf(systemResetMsg, maxSizeOfResetText, "Reset:Safe mode requested");
break;
case RESET_REASON_DFU_MODE: // DFU mode requested
snprintf(systemResetMsg, maxSizeOfResetText, "Reset:DFU mode requested");
break;
case RESET_REASON_PANIC: // System panic
snprintf(systemResetMsg, maxSizeOfResetText, "Reset:System panic %lu", data);
break;
case RESET_REASON_USER: // User-requested reset
snprintf(systemResetMsg, maxSizeOfResetText, "Reset:User %s", resetReasonsText[data]);
break;
case RESET_REASON_UNKNOWN: // Unspecified reset reason
snprintf(systemResetMsg, maxSizeOfResetText, "Reset:Unspecified reason");
break;
case RESET_REASON_NONE: // Information is not available
snprintf(systemResetMsg, maxSizeOfResetText, "Reset:Reason not available");
break;
default: // reset reason not defined in DeviceOS
break;
}
Serial.println(systemResetMsg);
}