3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ESP8266 RTC memoryを使う

Posted at

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);
}
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?