EEPROM
マイコンのプログラムは不揮発性のROMに書き込まれるため電源を切っても記憶されています。一方,プログラム中で数値が書き変わる変数は揮発性のRAM上に記憶されるため,電源を切ると毎回変数の値が初期化されます。ESP32には,EEPROM領域があり,ここに変数を書き込んでおくと,電源を切っても変数の値が記憶され,プログラム実行時に変数の値を読み出すことができます。とくに,センサの校正値やいくつかのパラメタ,電源を切る前の状態などを覚えておきたい場合に効果を発揮します。
EEPROMのテストプログラム
EEPROM領域に対して,ESP32では1バイト毎の読み込みEEPROM.read(),書き込みEEPROM.write()ができます。ただし,変数の型が何バイトであるかを確認してから書き込む・読み込む必要があります。変数によく使われるint型は,ESP32では32ビット(4バイト)になります。このとき,次のプログラムのように,読み込みEEPROM.get(),書き込みEEPROM.put()を使うと便利です。
#include <EEPROM.h> // int: 32bit (4byte) int a0 = 11, a1 = 22, a2 = 33, a3 = 44; // テストデータ const int N = 4; // 4つの変数(a0,a1,2,a3) int data[N]; void eeprom_write() { data[0] = a0; data[1] = a1; data[2] = a2; data[3] = a3; int n = 0; for (int i = 0; i < N; i++) { EEPROM.put(n, data[i]); n += 4; // 4バイト毎 } EEPROM.commit(); // EEPROMに書き込み確定 } void eeprom_read() { int n = 0; for (int i = 0; i < N; i++) { EEPROM.get(n, data[i]); // EEPROMより読み込み n += 4; // 4バイト毎 } Serial.println(data[0]); Serial.println(data[1]); Serial.println(data[2]); Serial.println(data[3]); } void setup() { Serial.begin(115200); delay(1000); EEPROM.begin(16); // 16byte = 4変数 x 4バイト(int=32bit) eeprom_write(); // 実行後 eeprom_read(); } void loop() { }
プログラムの実行結果
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1100
load:0x40078000,len:10312
load:0x40080400,len:6460
entry 0x400806a4
11
22
33
44
プログラムの動作
- テストプログラムを書き込み実行します。
- シリアルモニタを起動します。
- リセットボタンを押します。
- シリアルモニタに実行結果が表示されます。
- テストプログラムのsetup()内のeeprom_write()をコメントアウトして,再度,プログラムを書き込みます。
- ESP32の電源を切ります。
- ESP32の電源を入れます。
- 2~4を実行します。
- 電源を切っても,変数の値が記憶されているか確認しましょう。
プログラムのポイントは,int型の変数を4バイト毎にEEPROMに書き込んでいるところです。
画像は,ESP32でリングLEDライトを点灯させたときの様子です。LEDの状態(RGB)を変数に記憶しておいて,電源を入れたときに前の状態で点灯させられます。
コメント