4-1.EEPROMによるデータ利用
プログラム内の変数でデータを定義せずに、プログラム上でSSIDやパスワードなどを設定し、電源OFF・ON後も設定データを利用したい場合があります。
このような場合にEEPROM(Electrically Erasable Programmable Read-Only Memory)が利用できます。EEPROMは不揮発性メモリの一種でByte単位にデータを書き込んだり読み込んだりでき設定情報などの保存に利用します。一般的なフラッシュメモリはEEPROMを新しく拡張したもので、ブロック単位で読み書きできるためデータ量が多くなるとコスト的に安くなります。
ESP32-DevKitC(ESP-WROOM-32)は4MByteのフラッシュメモリを実装しており、このフラッシュメモリの一部を仮想的にEEPROMとして利用できます。また、EEPROMを利用できるライブラリが標準で提供されており、サイズは4Kbyteまで利用可能となります。4Kbyteなので大きなデータには適しませんので設定データなど小さなデータに利用します。
EEPROMを利用してデータを読み書きするスケッチを以下に説明します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// IoT電子工作キット // 4-1.EEPROMによるデータ利用 #include <EEPROM.h> // ①ライブラリを読み込み struct st_wifi { // ②EEPROMで利用する型(構造体)を宣言 char ssid[64]; char pass[64]; }; void setup() { Serial.begin(115200); // ③Serial設定 Serial.println (""); EEPROM.begin(128); // ④EEPROM開始(サイズ指定) st_wifi buf; // ⑤メモリ上に実体を作成 EEPROM.get<st_wifi>(0, buf); // ⑥実態変数にEEPROMの値を代入 Serial.print("ssid:"); // ⑦シリアルモニターにEEPROM内容表示 Serial.println(buf.ssid); Serial.print("pass:"); Serial.println(buf.pass); strcpy(buf.ssid, "Test SSID");// ⑧変数に値を書き込み strcpy(buf.pass, "Test Password"); EEPROM.put<st_wifi>(0, buf); // ⑨EEPROMに書き込み EEPROM.commit(); } void loop() { } |
EEPROMを利用する場合はライブラリを宣言(①)します。次にEEPROMで利用するデータの型を宣言(②)しています。関連する変数(今回は”ssid”,”pass”)をまとめて扱える構造体として宣言しています。
EEPROMの開始には利用するByte数を設定し④の「EEPROM.begin(128);」のように宣言します。128はByteサイズになり、今回は64Byteを2個定義していますので、128を設定しています。最大は4KByteなので4096まで利用可能です。
⑤は②で定義した型をメモリ上に実体「buf」として作成します。⑥はEEPROM上の設定値を⑤で宣言した変数に読み込みます。⑦は⑥で読み込んだ内容をシリアルモニタに表示しています。したがって最初に起動した時は何も値がないため値には何も表示されません。
次に書き込み処理を行います。⑧で⑤の変数に値を設定し⑨でEEPROMに書き込み処理を行います。このため、ESP32-DevKitCのENボタンを押して再起動(リセット)後はEEPROMに書き込まれた情報が読み出されてシリアルモニタに表示されるようになります。
EEPROMの開始(④)、読み込み(⑥)と書き込み(⑨)処理について学習しましたので、データ保存時には利用してください。