Arduinoで、ESP32,M5Stack等のプログラムを作成しているとき、設定ファイルの値によってプログラムの動きを変えたいことが良くあります。
SDカードに設定ファイルを書き込んでおき、その設定ファイル(inifile)を利用する方法をサンプルコードを使用して説明します。
ESP32、M5Stack、M5Core2等で使用できます。
設定ファイルから設定値の取得
以下のWebサイトのコードをベースに説明します。
Arduino IDEでのIniファイル読込 - Qiita
ESP32やESP8266の小物を作っていると、WiFi導入部は毎回同じ記述になってきました。しかし、サーバーアプリなどはhostnameを別物にしないと名前解決できません。とは言えソースコード…
inifile から、設定情報を読み込みサンプルコードです。ファイルのオープン先を変更すれば、SPIFFSにも応用できます。
const char *iniFileName = "/SETUP.ini";
String SSID = "";
String PASSWORD = "";
int nunm = 0;
void ReadIniFile( void )
{
File fp = SD.open( iniFileName, "r" );
if( !fp )
{
Serial.println("error: SD.open");
} else {
Serial.println("OK: SD.open");
}
SSID = inifileString( fp, (char *)iniHeader, "SSID", "ssid_01234" );
PASSWORD = inifileString( fp, (char *)iniHeader, "PASSWORD", "pass_woed" );
nunm = inifileInteger( fp, (char *)iniHeader, "nunm", 0 );
fp.close();
}
String型の設定値の取得
String型の設定値を取得する関数です。
// ----------------------------------------------------------------------------
/**
* @brief iniファイルから文字列対応の設定値を読み出す関数
*
* @param[in] File fp : ファイルポインタ
* @param[in,out] char* header : 取得したいキーのあるセクション
* @param[in,out] char* detail : 取得したいキー
* @param[in,out] char* defaultData : キーデータがないときのデフォルトの文字列
*
* @return String 取得した文字列
*/
// ----------------------------------------------------------------------------
String inifileString( File fp, char *header, char *detail, char *defaultData)
{
int position, length, index = 0;
uint8_t buf[10];
String str = "";
String output = "";
bool fFind = false, headerHit = false;
if( !fp )
{
return defaultData;
}
fp.seek( 0 );
while ( fp.available() )
{
fp.read(buf, 1);
if( !((buf[0] == 0x0d) || (buf[0] == 0x0a) ) )
{
str += (char)buf[0];
continue;
}
if(str != "")
{
if(headerHit)
{
if( str[0] == '[' )
{
String hstr = header;
headerHit = CheckHeadString( str, hstr);
} else {
String wdetail = detail;
if(CheckItemString(str, detail, &output) )
{
fFind = true;
break;
}
}
} else {
String hstr = header;
headerHit = ChecjHeadString( str, hstr);
}
}
str = "";
}
if(!fFind)
{
output = defaultData;
}
return output;
}
int型の設定値の取得
int型の設定値の取得する関数です。
// ----------------------------------------------------------------------------
/**
* @brief iniファイルからintタイプの設定値を読み出す関数
*
* @param[in] File fp : ファイルポインタ
* @param[in,out] char* header : 取得したいキーのあるセクション
* @param[in,out] char* detail : 取得したいキー
* @param[in] int defaultData : キーデータがないときのデフォルトのint
*
* @return 取得したint値
*/
// ----------------------------------------------------------------------------
int inifileInteger( File fp, char *header, char *detail, int defaultData )
{
String str = inifileString( fp, header, detail, "" );
if( str=="" )
{
return defaultData;
}
int num = str.toInt();
return num;
}
bool型の設定値の取得
bool型の設定値の取得する関数です。
// ----------------------------------------------------------------------------
/**
* @brief iniファイルからboolタイプの設定値を読み出す関数
*
* @param[in] File fp : ファイルポインタ
* @param[in,out] char* header : 取得したいキーのあるセクション
* @param[in,out] char* detail : 取得したいキー
* @param[in] bool defaultData : キーデータがないときのデフォルトのbool値
*
* @return 取得したbool値
*/
// ----------------------------------------------------------------------------
bool inifileBool( File fp, char *header, char *detail, bool defaultData )
{
String str = inifileString( fp, header, detail, "" );
if( str == "" )
{
return defaultData;
}
int num = str.toInt();
return ( (num==0)?true:false );
}
セクションデータを取得する関数
セクションデータを取得する関数です。
指定した、セクションデータであれば、trueを返します。
// ----------------------------------------------------------------------------
/**
* @brief セクションデータを取得する関数
*
* @param[in] String str : セクションかどうかをチェックする文字列
* @param[in] String header : セクション文字列
*
* @return bool true:セクションを見つけた / false:セクションが見つからない
*/
// ----------------------------------------------------------------------------
bool CheckHeadString(String str, String header)
{
bool fhead = false;
str.trim();
if( str[0] == '[' )
{
int pos = str.indexOf("]");
if(pos > 0)
{
String hstr = "";
for(int i=1;i<pos;i++)
{
hstr += str[i];
}
if(hstr == header)
{
fhead = true;
} else {
fhead = false;
}
}
}
return fhead;
}
キーデータから設定値を取得する関数
キーデータから設定値を取得する関数です。この関数では、文字列として取得します。
// ----------------------------------------------------------------------------
/**
* @brief キーデータから設定値を取得する関数
*
* @param[in] String str : チェックする文字列
* @param[in] String detail : キーデータ
* @param[in,out] String* Value : 取得したデータ(文字列として取得)
*
* @return bool true:成功 / false:失敗
*/
// ----------------------------------------------------------------------------
bool CheckItemString(String str, String detail, String *Value)
{
String item = "";
String sub = "";
bool fFind = false;
int i;
if(str != "")
{
int pos = str.indexOf("=");
for(i=0;i<pos;i++)
{
sub += str[i];
}
sub.trim();
if(sub == detail)
{
fFind = true;
int len = str.length();
for(i=(pos+1);i<len;i++)
{
item += str[i];
}
item.trim();
} else {
fFind = false;
}
}
if(!fFind)
{
item = "";
}
*Value = item;
return fFind;
}
参考URL
以下の、URLも参考にしてください。