我有这个arduino草图,
char temperature[10];
float temp = 10.55;
sprintf(temperature,"%f F", temp);
Serial.println(temperature);
温度打印为
? F
有关如何格式化此浮点数的任何想法?我需要它成为一个字符串。
答案 0 :(得分:91)
由于某些性能原因,%f
未包含在Arduino的sprintf()
实现中。更好的选择是使用dtostrf()
- 将浮点值转换为C风格的字符串,方法签名如下:
char *dtostrf(double val, signed char width, unsigned char prec, char *s)
使用此方法将其转换为C-Style字符串,然后使用sprintf,例如:
char str_temp[6];
/* 4 is mininum width, 2 is precision; float value is copied onto str_temp*/
dtostrf(temp, 4, 2, str_temp);
sprintf(temperature,"%s F", str_temp);
您可以更改最小宽度和精度以匹配您要转换的浮动。
答案 1 :(得分:2)
如前所述,在Arduino的sprintf
中不包含Float支持。
Arduino有自己的String类。
String value = String(3.14);
然后,
char *result = value.c_str();
构造String类的实例。有多个版本可以从不同的数据类型构造字符串(即将它们格式化为字符序列),包括:
答案 2 :(得分:1)
为了解决这个问题,我已经努力了几个小时,但是我终于做到了。这使用了Platformio提供的现代Espressif C ++,我的目标MCU是ESP32。
我想显示一个前缀标签,即float / int值,然后显示单位,全部内联。
我无法使用单独的Serial.print()语句进行中继,因为我使用的是OLED显示屏。
这是我的代码示例:
int strLenLight = sizeof("Light ADC: 0000");
int strLenTemp = sizeof("Temp: 000.0 °C");
int strLenHumd = sizeof("Humd: 00.0 %");
char displayLight[strLenLight] = "Light ADC: ";
char displayTemp[strLenTemp] = "Temp: ";
char displayHumd[strLenHumd] = "Humd: ";
snprintf(strchr(displayLight, '\0'), sizeof(displayLight), "%d", light_value);
snprintf(strchr(displayTemp, '\0'), sizeof(displayTemp), "%.1f °C", temperature);
snprintf(strchr(displayHumd, '\0'), sizeof(displayHumd), "%.1f %%", humidity);
Serial.println(displayLight);
Serial.println(displayTemp);
Serial.println(displayHumd);
哪个显示:
Light ADC: 1777
Temp: 25.4 °C
Humd: 55.0 %
答案 3 :(得分:0)
dtostrf()
已过时,并非在每个主板核心平台上都存在。
另一方面,sprintf()
在AVR平台上没有格式化浮点数!