アプリケーションを作成する際には、設定値やパラメーターを保存して、起動時に読み込みたいケースが多くあります。C++Builderでは、inifile を扱う場合、TIniFile 、TMemIniFileを使用します。ESP32でそれと同様な機能を提供してくれるのが、Preferencesライブラリです。TIniFile 、TMemIniFileと同じような感覚で使用する事が出来ます。
Preferencesライブラリは、ESP32のnvs領域(不揮発性メモリ)にデータを保存するための便利なライブラリです。EEPROMライブラリよりも高速で効率的にデータを保存できるため、ESP32のアプリケーション開発で広く使用されています。
Preferencesライブラリの使い道
Preferencesライブラリの使い道としては、以下のようなものが挙げられます。
- アプリケーションの設定値やパラメーターを保存する
- ユーザーのログイン情報や設定を保存する
- 履歴や統計情報を保存する
- ゲームのハイスコアや記録を保存する
- センサーのデータを保存する
具体的な例としては、以下のようなものがあります。
- スマートスピーカーの音量や明るさの設定を保存する
- スマートロックのパスワードを保存する
- インターネット接続の設定を保存する
- ゲームのプレイ時間やスコアを保存する
- センサーで測定した温度や湿度を保存する
Preferencesライブラリの使い方
ESP32のPreferencesライブラリは、nvs(ESP32の不揮発性メモリ)にデータを保存するためのライブラリです。EEPROMライブラリの後継として開発されたもので、より高速で効率的にデータを保存することができます。
Preferencesライブラリの基本的な使い方は、以下のとおりです。
- “Preferences.h” をインクルードします。
- Preferencesクラスのインスタンスを作成します。
- begin()関数でPreferencesオブジェクトを初期化します。
- put()関数でデータを保存します。
- get()関数でデータを読み取ります。
- end()関数でPreferencesオブジェクトを終了します。
Preferencesライブラリで保存できるデータの型は、以下のとおりです。
- char
- unsigned char
- short
- unsigned short
- long
- unsigned long
- float
- double
また、Preferencesライブラリでは、複数のPreferencesオブジェクトを同時に使用することができます。
保存・読み出し可能なデータ型
Preferencesライブラリで 保存・読み出しできるデータの型は、以下のとおりです。
- Preferences Types
Preferences Type | Data Type | Size (bytes) |
---|---|---|
Bool | bool | 1 |
Char | int8_t | 1 |
UChar | uint8_t | 1 |
Short | int16_t | 2 |
UShort | uint16_t | 2 |
Int | int32_t | 4 |
UInt | uint32_t | 4 |
Long | int32_t | 4 |
ULong | uint32_t | 4 |
Long64 | int64_t | 8 |
ULong64 | uint64_t | 8 |
Float | float_t | 8 |
Double | double_t | 8 |
String | const char* String | variable |
Bytes | uint8_t | variable |
メンバー関数
Preferencesライブラリのメンバー関数について説明します。
メンバー関数 | 説明 |
---|---|
Preferences::begin() | NVS(Non-volatile storage)の利用を開始する。 |
Preferences::clear() | NVS(Non-volatile storage)から、現在利用中のネームスペース内の全てのキー・バリューを削除する。 |
Preferences::end() | NVS(Non-volatile storage)の利用を終了する。 |
Preferences::get() | NVS(Non-volatile storage)から、現在利用中のネームスペース内の指定したキーに対応する値を取得する。 |
Preferences::put() | NVS(Non-volatile storage)に、現在利用中のネームスペース内の指定したキーに対応するバリューを書き込む。 |
Preferences::remove() | NVS(Non-volatile storage)から、現在利用中のネームスペース内の指定したキー・バリューを削除する。 |
- データの読み出し用メンバー関数
int8_t getChar(const char* key, int8_t defaultValue = 0);
uint8_t getUChar(const char* key, uint8_t defaultValue = 0);
int16_t getShort(const char* key, int16_t defaultValue = 0);
uint16_t getUShort(const char* key, uint16_t defaultValue= 0);
int32_t getInt(const char* key, int32_t defaultValue = 0);
uint32_t getUInt(const char* key, uint32_t defaultValue = 0);
int32_t getLong(const char* key, int32_t defaultValue = 0);
uint32_t getULong(const char* key, uint32_t defaultValue = 0);
int64_t getLong64(const char* key, int64_t defaultValue = 0);
uint64_t getULong64(const char* key, uint64_t defaultValue= 0);
float_t getFloat(const char* key, float_t defaultValue = NAN);
double_t getDouble(const char* key, double_t defaultValue= NAN);
bool getBool(const char* key, bool defaultValue = false);
size_t getString(const char* key, char* value, size_t maxLen);
String getString(const char* key, String defaultValue = String());
size_t getBytesLength( const char* key);
size_t getBytes(const char* key, void * buf, size_t maxLen);
- データの保存用メンバー関数
size_t putChar(const char* key, int8_t value);
size_t putUChar(const char* key, uint8_t value);
size_t putShort(const char* key, int16_t value);
size_t putUShort(const char* key, uint16_t value);
size_t putInt(const char* key, int32_t value);
size_t putUInt(const char* key, uint32_t value);
size_t putLong(const char* key, int32_t value);
size_t putULong(const char* key, uint32_t value);
size_t putLong64(const char* key, int64_t value);
size_t putULong64(const char* key, uint64_t value);
size_t putFloat(const char* key, float_t value);
size_t putDouble(const char* key, double_t value);
size_t putBool(const char* key, bool value);
size_t putString(const char* key, const char* value);
size_t putString(const char* key, String value);
size_t putBytes(const char* key, const void* value, size_t len);
コードのサンプル
ユーザーのログイン情報や設定を保存する場合
以下のサンプルコードでは、Preferencesオブジェクトを “my_preferences” という名前で初期化します。次に、”username” と “password” というキーで、それぞれ “John Doe” と “secret” というデータを保存します。最後に、保存したデータを読み取って出力します。
#include <Preferences.h>
void setup() {
Preferences preferences;
// Preferencesオブジェクトを初期化します
preferences.begin("my_preferences");
// データを保存します
preferences.putString("username", "John Doe");
preferences.putString("password", "secret");
preferences.putInt("theme", 1);
// データを読み取ります
String username = preferences.getString("username");
String password = preferences.getString("password");
int theme = preferences.getInt("theme");
// Preferencesオブジェクトを終了します
preferences.end();
}
アプリケーションの設定値やパラメーターを保存する場合
以下のサンプルは、Preferencesオブジェクトを “my_preferences” という名前で初期化します。次に、”volume” と “is_on” というキーで、それぞれ 50 と true というデータを保存します。最後に、保存したデータを読み取って出力します。
#include <Preferences.h>
void setup() {
Preferences preferences;
// Preferencesオブジェクトを初期化します
preferences.begin("my_preferences");
// データを保存します
preferences.putInt("volume", 50);
preferences.putBoolean("is_on", true);
// データを読み取ります
int volume = preferences.getInt("volume");
bool is_on = preferences.getBoolean("is_on");
// Preferencesオブジェクトを終了します
preferences.end();
}
参考URL
以下のHPも参照ください。