概要
同様のページは多くあるものの、データの保存について図で説明したものが見つからなかったので投稿した。
(一度理解してもしばらくすると忘れてしまうので。。。)
ESP32のEEPROMの仕組みについては詳しく調べていないので省略。
Flashに疑似EEPROMとして使えるような領域を確保してデータを保存しているらしい。
実行環境
MCU:LOLIN D32
IDE:Arduino IDE 1.8.19
よく使われているESP32-DevkitCの在庫がなかったため、LOLIN D32で代用。
回路はほぼ同じなので、同じ設定とプログラムで動作するはず。
参考サイト
サンプルコード
リセットするたびにシリアルで出力される数値が1ずつ増えるプログラム。
EEPROMの初期化を行わずに読み出しをしているので0以外の値からスタートする可能性があるが、
見た目的にわかりやすいのでこのように書いた。
char変数はシリアル通信で送るとASCIIコードとして認識されるので、わかりやすいよう明示的に10進数で出力している。
#include <EEPROM.h>
int a;
float b;
char c;
void setup() {
/* 初期設定 */
Serial.begin(115200);
EEPROM.begin(9); //(4+4+1)バイト
/* EEPROM読み出し */
EEPROM.get(0, a);
EEPROM.get(4, b);
EEPROM.get(8, c);
/* 読み出した内容を出力 */
Serial.println(a);
Serial.println(b);
Serial.println(c, DEC);
/* 値を変更 */
a += 1;
b += 1.0;
c += 1;
/* EEPROM書き込み */
EEPROM.put(0, a); //書き込み内容を設定
EEPROM.put(4, b); //書き込み内容を設定
EEPROM.put(8, c); //書き込み内容を設定
EEPROM.commit(); //EEPROMに書き込み
}
void loop() {
}
解説
データ保存のイメージ図
今回はArduinoでよく使うint型、float型、char型を保存した。
データを保存したときのイメージは下のようになる。
例えば、下の文はEEPROMのアドレス0からint型(=4バイト)のデータを保存する、という意味になる。(aはint型で定義されているため)
EEPROM.put(0, a);
別データの保存場所と被ってしまうとデータの一部が壊れてしまうため、私はエクセル等で表にして視覚的に管理している。
また変数型のデータサイズはマイコンの型式によって異なるため、ほかのArduinoからプログラムをコピペする際は注意する。
Flash容量に余裕があるのであれば、絶対に被らないようにアドレスを8バイト以上離して保存するのも有効。
その場合は間の空白部分も含めてEEPROM.begin
で領域確保が必要。
配列からEEPROMに書き込む
詳細は参考サイトを参照。
配列の数だけ領域を確保する必要がある。