取得したセンサー情報等をArduino側から送信する際、小数点が含まれた情報を送信したいが、文字列に変換する方法は以下のとおり。
小数(浮動小数点数)を文字列に変換する
Arduino Uno(というかavr-libc)のsprintf()は、浮動小数点数を扱うことはできません。一方、Arduino Dueのsprintf()は、浮動小数点を扱うことができます。avr-libcでは浮動小数点数を文字列に変換するために、dtostre()/dtostrf()という関数が用意されています。dtostre()は指数表示、dtostrf()は小数表示です。よりよく使うと思われるdtostrf()の説明をリファレンス形式で示します。
名称
dtostrf()
説明
浮動小数点数を文字列に変換する。
書式
char *dtostrf(double val, signed char width, unsigned char prec, char *s)
引数
val | 変換対象の数値 |
width | 小数点や符号を含んだ、最小の表示幅(表示文字数)。負の数を指定すると左詰めとなる。 |
prec | 小数点以下の表示幅(表示文字数) |
s | 変換後の文字列を格納するメモリ領域(格納するのに必要な十分な領域を用意する必要がある) |
戻り値
変換後の文字列を格納する領域(引数で与えたsが返ってくる)。
使用例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
void setup() { Serial . begin (9600); char s[16]; char t[16]; double val = -12.345678; dtostrf(val, 5, 1, s); Serial . println (s); val = 12.345678; dtostrf(val, 5, 1, s); Serial . println (s); sprintf (t, "Val = %s" , dtostrf(val, 5, 10, s)); Serial . println (t); dtostre(val, s, 3, DTOSTR_ALWAYS_SIGN|DTOSTR_PLUS_SIGN); Serial . println (s); } void loop() { } |
注意
変換後の文字列を格納する領域は呼び出し側で十分な領域を確保する必要がある。