概要
ESP8266 (以下 WROOM02) のプログラムにあたり、標準ライブラリの使い方まとめ。EEPROM編。
はじめに
WROOM02 (Arduino) でコーディングしていると、値を保存しておいて、次回の起動時にもその値を使いたいことがありますよね。うん、あるある。
不揮発なメモリ処理をいい感じにやってくれる EEPROM というクラスが標準であるので、その使い方まとめです。
リアルな外付けの EEPROM に対するドライバではなくて、WROOM02 搭載の不揮発メモリを、仮想的な EEPROM として扱うライブラリになります。
WROOM02 は 4MB の不揮発(フラッシュ)メモリを積んでいるので、それを操作することになります。
なお、リアルな外付けの EEPROM を使う場合は、以下がとても参考になります。
http://playground.arduino.cc/Code/I2CEEPROM
使い方
インクルード
#include <EEPROM.h>
Mac では、上記の実態は以下にあります。
~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.0.0/libraries/EEPROM/EEPROM.h
~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.0.0/libraries/EEPROM/EEPROM.cpp
簡単な例
初期化
// 使用するサイズを宣言する
EEPROM.begin(100);
書き込み
uint8_t val = 32; // 保存したい値
// 0 : EEPROM の先頭アドレス
EEPROM.write(0, val);
// コミット
// (コミットで内蔵フラッシュメモリに、実際に書き込みます)
EEPROM.commit();
読み込み
// 0 : EEPROM の先頭アドレス
uint8_t val = EEPROM.read(0);
実用的な例
- uint8_t 型ではなくて、任意の型を保存・読み込みできると便利です。
- その場合、template 版の関数を使えばOKです。
例えば、WiFi 接続のための、SSID と Password を保存する場合
( * 初回は何も表示されず、2回目は初回に保存されたSSID/Passwordを表示するだけのサンプルです。)
( * なので、このスケッチ自体には意味は無いです。)
#include <EEPROM.h>
struct CONFIG {
char ssid[32];
char pass[32];
};
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("");
EEPROM.begin(100);
CONFIG buf;
EEPROM.get<CONFIG>(0, buf);
Serial.println(buf.ssid);
Serial.println(buf.pass);
strcpy(buf.ssid, "Your SSID");
strcpy(buf.pass, "Your Password");
EEPROM.put<CONFIG>(0, buf);
EEPROM.commit();
}
void loop() {
}
まとめ
-
ESP8266 (ESP-WROOM-02) でWi-Fi使用時のSSID/パスワードをブラウザで設定できるように では、ファイルシステム (SPIFFS) を使って SSID/Password を保存しましたが、この EEPROM を使ってもいいですね。
-
リアルな外付けの EEPROM を使う場合、Wire(I2C)ライブラリの制限から、一度にやり取りできるデータサイズが制限されます。そういった場合に、内蔵の EEPROM をキャッシュとして使うことが考えられます。
参考
全関数を載せておきます。
基本操作
void begin(size_t size);
uint8_t read(int address);
void write(int address, uint8_t val);
bool commit();
void end();
uint8_t * getDataPtr();
テンプレート版
template<typename T> T &get(int address, T &t);
template<typename T> const T &put(int address, const T &t);