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(桁数)識別子を書く事で変換可能となります。
実際の使用例(シリアル表示でテスト)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void setup() { Serial.begin(9600); } void loop() { float x=123.4; int y=1; char buf1[50]; char buf2[10]; dtostrf(x,5,2,buf2); sprintf(buf1,"測定結果%03d:%sV\n",y,buf2); Serial.print(buf1); } |
<<結果>>
補足ですが、\nは特殊文字(エスケープシーケンス)と呼ばれるもので改行を意味しています。他にも\t(水平タブ)などがあります。
という事で、今回はArduinoでsprintfを使用した時のフォーマット識別子の紹介と浮動小数点の扱い方、その他0詰めでした。
ばいばい!
コメント