Arduinoでsprintfの書式とfloatの扱い方、0埋めとか

Arduino

Arduinoでsprintfの書式設定

こんにちは、くろべこです。

C言語である型式をフォーマットに従って文字列に変換する関数としてsprintfがありますよね。

今回はArduinoで使用できるフォーマット指定子の整理を記事として書いていきたいと思います。というのもArduinoではsprintfで一部のフォーマット指定子が使うことが出来ません。

具体的に言うと浮動小数点を表すフォーマット指定子が使用できないんですよね。これは、ちょっと不都合がありまして表示機などに浮動小数点を表すときに小数点以下を丸めたりする処理がめんどくさくなります。

ここら辺の浮動小数点を文字列に変換する方法についても解説していきますね。


Arduinoのsprintfで使用できるフォーマット一覧

指定子 対応する型 説明 使用例 結果 備考
%c char 1文字を出力する sprintf(buf,”test:%c”,’X’); test:X  
%s char * 文字列を出力する sprintf(buf,”test:%s”,”X”); test:X  
%d int, short 整数を10進で出力する sprintf(buf,”test:%05d”,(int)123); test:00123 右詰め(0埋め)
%u unsigned int, unsigned short 符号なし整数を10進で出力する sprintf(buf,”test:%-5u”,(uint8_t)123); test:123 左詰め
%o int, short, unsigned int, unsigned short 整数を8進で出力する sprintf(buf,”test:%05o”,(int)123); test:00173 右詰め(0埋め)
%x int, short, unsigned int, unsigned short 整数を16進で出力する sprintf(buf,”test:%05x”,(int)255); test:000ff 右詰め(0埋め)
%f float 実数を出力する sprintf(buf,”test:%3.2f”,(float)3.14); test:  ? 使用不可
%e float 実数を指数表示で出力する sprintf(buf,”test:%3.2f”,(float)3.14); test:  ? 使用不可
%g float 実数を最適な形式で出力する sprintf(buf,”test:%3.2f”,(float)3.14); test:  ? 使用不可
%ld long 倍精度整数を10進で出力する sprintf(buf,”test:%06ld”,(long)99999); test:099999 右詰め(0埋め)
%lu unsigned long 符号なし倍精度整数を10進で出力する sprintf(buf,”test:%06lu”,(uint32_t)99999); test:099999 右詰め(0埋め)
%lo long, unsigned long 倍精度整数を8進で出力する sprintf(buf,”test:%012lo”,(uint32_t)4294967295); test:037777777777 右詰め(0埋め)
%lx long, unsigned long 倍精度整数を16進で出力する sprintf(buf,”test:%012lx”,(uint32_t)4294967295); test:0000ffffffff 右詰め(0埋め)
%lf double 倍精度実数を出力する sprintf(buf,”test:%10.3lf”,(double)42949.67295); test:  ?

表からわかる様に浮動小数点(float, double)はArduinoでsprintを使用した場合には対応していません。

では、絶対に変換が出来ないかというとそういうわけではありません。

Arduinoには浮動小数点を文字列に変換する関数として【dtostrf】という関数が用意されています。

dtostrfdtostrf(浮動小数点値,文字列の長さ,小数点以下の桁数,文字列バッファ)
ちなみに、小数点以下の桁数を指定することで末尾を0詰めすることが出来ます。
<<使用例>>
dtostrf((float)123.45,8,5,buf);
結果☞123.45000
また、表中に書いてあるようにint型などで頭に0を詰めて書きたい場合には%0(桁数)識別子を書く事で変換可能となります。

実際の使用例(シリアル表示でテスト)


<<結果>>

補足ですが、\nは特殊文字(エスケープシーケンス)と呼ばれるもので改行を意味しています。他にも\t(水平タブ)などがあります。

 

という事で、今回はArduinoでsprintfを使用した時のフォーマット識別子の紹介と浮動小数点の扱い方、その他0詰めでした。

ばいばい!

コメント

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