snprintf не отображает значения с плавающей точкой
Я не понимаю, почему отображается форматированная строка?? вместо плавающих значений. Мой код:
#include <Arduino.h>
#include <Wire.h>
#include "SparkFunCCS811.h"
#include <DFRobot_SHT3x.h>
DFRobot_SHT3x sht3x(&Wire, /*address=*/0x44, /*RST=*/4);
//* Получить показания SHT31
void readSHT(float &temp, float &humid)
{
DFRobot_SHT3x::sRHAndTemp_t data = sht3x.readTemperatureAndHumidity(sht3x.eRepeatability_High);
char shtVal[50];
if (data.ERR == 0)
{
temp = data.TemperatureC;
humid = data.Humidity;
Serial.println(data.TemperatureC);
Serial.println(data.Humidity);
}
snprintf(shtVal, 50, "Temp = %f Humidity = %f", temp, humid);
Serial.println(shtVal);
}
void setup()
{
Serial.begin(115200);
//* Инициализация чипа
while (sht3x.begin() != 0)
{
Serial.println("SHT31 Initialization Failed");
delay(1000);
Serial.print("Chip serial number");
Serial.println(sht3x.readSerialNumber());
if (!sht3x.softReset())
{
Serial.println("Failed to Initialize the chip....");
}
}
}
void loop()
{
unsigned long newTime = millis();
static unsigned long oldTime = 0;
if (newTime - oldTime >= 5000)
{
float temp = 0.0;
float humid = 0.0;
oldTime = newTime;
readSHT(temp, humid);
}
}
& вот результат: Вот что я получаю в качестве вывода:
21.23
41.06
Temp = ? Humidity = ?
Функция readSHT() не имеет проблем с отображением фактических значений, но почему отображается форматированная строка ???. Я делаю что-то не так?
@Zaffresky, 👍0
1 ответ
Лучший ответ:
Стандартный avr-libc не имеет поддержки float, включенной в семейство функций printf
. Это происходит потому, что поддержка float сильно раздует ваш код, а большинству людей она не нужна.
Можно включить его с помощью какой-то черной магии (я не знаю, какой, но кто-то другой может), но в целом вы не хотите этого делать, так как есть лучшие способы.
Обычно вы используете dtostrf()
для форматирования float в массив char
отдельно. Или если все, что вы делаете, это печатаете в serial, то вы даже не будете форматировать его в строку в первую очередь.
Serial.print(F("Temp = "));
Serial.print(temp);
Serial.print(F(" Humidity = "));
Serial.println(humid);
- форматирование строк в Arduino для вывода
- Проблемы с преобразованием byte[] в String
- Чтение строки, разделенной запятыми
- Использование строки вместо строки C, еще одна попытка затронуть загруженную проблему
- Разделение Serial.readString на массив строк
- GSM-модуль Arduino + строка SMS, отправляющая мусорное значение
- Преобразование JSON в строку для MQTT
- strcmp, похоже, не работает
Ну ладно. Я буду использовать dtostrf (), так как мне нужно передать эти значения и другой функции. Таким образом, я могу сохранить значение с подходящим no. десятичных знаков., @Zaffresky