/*
ESP.reset()/ESP.resart()でRTC User
Memoryがクリアされるかどうかのテスト
*/
#include <ESP8266WiFi.h>
//RTC memory(512Byte)の定義
struct {
uint8_t data[512]; // User Data
} rtcData;
void setup() {
delay(1000);
Serial.begin(115200);
Serial.println();
Serial.print("ESP.getResetReason()=");
Serial.println(ESP.getResetReason());
String resetReason = ESP.getResetReason();
/*
enum rst_reason {
REANSON_DEFAULT_RST = 0, // ノーマルスタート。電源オンなど。
REANSON_WDT_RST = 1, // ハードウェアウォッチドッグによるリセット
REANSON_EXCEPTION_RST = 2, //
例外によるリセット。GPIO状態は変化しない
REANSON_SOFT_WDT_RST = 3, //
ソフトウェアウォッチドッグによるリセット。GPIO状態は変化しない
REANSON_SOFT_RESTART = 4, //
ソフトウェアによるリセット。GPIO状態は変化しない
REANSON_DEEP_SLEEP_AWAKE= 5, // ディープスリープ復帰
REANSON_EXT_SYS_RST = 6, // 外部要因(RSTピン)によるリセット。
};
*/
rst_info *prst = ESP.getResetInfoPtr();
/*
struct rst_info{
uint32 reason;
uint32 exccause;
uint32 epc1;
uint32 epc2;
uint32 epc3;
uint32 excvaddr;
uint32 depc;
};
*/
Serial.print("reset reason=");
Serial.println(prst->reason);
// RTC memoryからデータを読み込む
if (ESP.rtcUserMemoryRead(0, (uint32_t*)
&rtcData, sizeof(rtcData))) {
Serial.println("rtcUserMemoryRead
Success");
if (prst->reason != 4) { // Not
Software/System restart
for (int i = 0; i <
sizeof(rtcData.data); i++) {
rtcData.data[i]
= 0;
}
}
else {
rtcData.data[0]++;
}
} else {
Serial.println("rtcUserMemoryRead
Fail");
}
// RTC memoryにデータを書き込む
if (ESP.rtcUserMemoryWrite(0, (uint32_t*)
&rtcData, sizeof(rtcData))) {
Serial.println("rtcUserMemoryWrite
Success");
} else {
Serial.println("rtcUserMemoryWrite
Fail");
}
Serial.print("rtcData.data[0]=");
Serial.print(rtcData.data[0]);
Serial.print(" millis=");
Serial.println(millis());
if ((rtcData.data[0] % 2) == 0) {
Serial.println("Do ESP.reset");
for (int i=20;i>0;i--) delay(1000);
ESP.reset();
} else {
Serial.println("Do ESP.restart");
for (int i=20;i>0;i--) delay(1000);
ESP.restart();
}
}
void loop() {
}
|