2024/04/24「多機能ファイラーAs/Rの魅力と活用法」を出版、KView32公開

ArduinoでのSDカードの設定ファイルの読み込み

ESP32

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も参考にしてください。

タイトルとURLをコピーしました