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() не имеет проблем с отображением фактических значений, но почему отображается форматированная строка ???. Я делаю что-то не так?

, 👍0


1 ответ


Лучший ответ:

0

Стандартный avr-libc не имеет поддержки float, включенной в семейство функций printf. Это происходит потому, что поддержка float сильно раздует ваш код, а большинству людей она не нужна.

Можно включить его с помощью какой-то черной магии (я не знаю, какой, но кто-то другой может), но в целом вы не хотите этого делать, так как есть лучшие способы.

Обычно вы используете dtostrf() для форматирования float в массив char отдельно. Или если все, что вы делаете, это печатаете в serial, то вы даже не будете форматировать его в строку в первую очередь.

Serial.print(F("Temp = "));
Serial.print(temp);
Serial.print(F("  Humidity = "));
Serial.println(humid);
,

Ну ладно. Я буду использовать dtostrf (), так как мне нужно передать эти значения и другой функции. Таким образом, я могу сохранить значение с подходящим no. десятичных знаков., @Zaffresky