RTC memory はESP8266 の真骨頂、DeepSleep Mode で値を保持してくれるメモリーです。
以前、[ESP8266 RTCMemory] (https://qiita.com/YumeYakata/items/c8db045c48dc3ebd0b24)を記載しましたが、ここではプログラムを紹介します。
「RTC Memoryは4バイトアライメント。でるあるから 128(=512/4) のアドレスで使うことができる。」とありますので、128 個のunsigned int のバッファーを準備します。
loop で読み書きしてみる
RTC Memory を使うには、user_interface.hをinclude します。
/* ---------------------------------------- */
/* for DEBUG */
/* ---------------------------------------- */
#define USE_SERIAL Serial
#define _DEBUG 1
#if _DEBUG
#define DBG(...) { USE_SERIAL.print(__VA_ARGS__); }
#define DBGLED(...) { digitalWrite(__VA_ARGS__); }
#else
#define DBG(...)
#define DBGLED(...)
#endif /* _DBG */
/* ---------------------------------------- */
/* for RTC Memory */
/* ---------------------------------------- */
extern "C"{
#include "user_interface.h"
}
#define RTCMEMORYSTART 64
#define RTCMEMORYLEN 128
unsigned int rtcBuffer[RTCMEMORYLEN]={0};
// setupでrtcBufferをクリアし、RTC memoryに書き込みます。
void setup() {
USE_SERIAL.begin(9600);
for(int i=0; i<RTCMEMORYLEN; i++) rtcBuffer[i]=0;
system_rtc_mem_write(RTCMEMORYSTART,rtcBuffer,RTCMEMORYLEN*4);
}
// loop でRTC memory を読み出し、先頭rtcBuffer[0]と最後、rtcBuffer[RTCMEMORYLEN-1]を編集し、RTC memoryへ書き込みます。
void loop() {
// put your main code here, to run repeatedly:
system_rtc_mem_read(RTCMEMORYSTART,rtcBuffer,RTCMEMORYLEN*4);
rtcBuffer[0]=rtcBuffer[0]+2;
rtcBuffer[RTCMEMORYLEN-1]=rtcBuffer[RTCMEMORYLEN-1]+3;
USE_SERIAL.println(String(rtcBuffer[0]) + ":" + String(rtcBuffer[RTCMEMORYLEN-1]));
system_rtc_mem_write(RTCMEMORYSTART,rtcBuffer,RTCMEMORYLEN*4);
delay(2000);
}
Deep Sleep Modeで読み書きしてみる
下のプログラムはSetup の最後で、Deep Sleep Mode に入り、2秒後にリセットがかかります。
このプログラムを動作させるときはIO0 をHighにしておく必要があります。リセットがかかった時、IO0 をLowだと書き込みモードになってしまいます。
void setup() {
USE_SERIAL.begin(9600);
delay(100);
system_rtc_mem_read(RTCMEMORYSTART,rtcBuffer,RTCMEMORYLEN*4);
rtcBuffer[0]=rtcBuffer[0]+2;
rtcBuffer[RTCMEMORYLEN-1]=rtcBuffer[RTCMEMORYLEN-1]+3;
USE_SERIAL.println(String(rtcBuffer[0]) + ":" + String(rtcBuffer[RTCMEMORYLEN-1]));
system_rtc_mem_write(RTCMEMORYSTART,rtcBuffer,RTCMEMORYLEN*4);
ESP.deepSleep(2e6); //2 Minitus
delay(100);
}