Я пытаюсь настроить модуль nodemcu для сбора данных с датчика температуры и отправить его с помощью mqtt pubsubclient моему брокеру mqtt, но это не проблема.
Я пытаюсь отправить температуру в формате, который имеет только один десятичный знак, и в этот момент я успешно сделал округление вверх или вниз, но формат не правильный. на данный момент он округляет временную шкалу до 24,50, 27,80, 23,10 и т. д. Я хочу удалить конечные Zereos, поэтому он становится 24,5, 27,8, 23,1 и т. д.
У меня есть этот код настроен до сих пор:
#include <math.h>
#include <PubSubClient.h>
#include <ESP8266WiFi.h>float temp = 0;
void loop {
float newTemp = sensors.getTempCByIndex(0);
temp = roundf((newTemp * 10)) / 10;
serial.println(String(temp).c_str())
client.publish("/test/temperature", String(temp).c_str(), true);
}
Я довольно новичок в C ++, поэтому любая помощь будет принята с благодарностью.
Независимо от того, что вы с ними делаете, значения с плавающей точкой всегда имеют одинаковую точность. Чтобы контролировать количество цифр в текстовой строке, измените способ преобразования значения в текст. В нормальном C ++ (т.е. там, где нет String
тип <g>), вы делаете это с помощью потока:
std::ostrstream out;
out << std::fixed << std::set_precision(3) << value;
std::string text = out.str();
В среде, которую вы используете, вам придется либо использовать стандартные потоки, либо выяснить, что обеспечивает эта среда для управления преобразованиями с плавающей запятой в текст.
Непонятно, каков ваш API. Похоже, вы хотите передать в строке C. В этом случае просто используйте sprintf
:
#include <stdio.h>
float temp = sensors.getTempCByIndex(0);
char s[30];
sprintf(s, "%.1f", temp);
client.publish("/test/temperature", s, true);
Используемая вами библиотека не является частью стандартного C ++. String
вы используете нестандартно.
Как отметил в своем ответе Пит Беккер, вы не сможете контролировать конечные нули, изменяя значение temp
, Вам нужно либо контролировать точность при преобразовании его в String
или выполните преобразование, а затем настройте результирующую строку.
Если вы читаете документацию для String
тип, который вы используете, могут быть варианты сделать один или оба из;
float
в строку; или жеString
и вручную удалить конечные нули.Или вы могли бы использовать std::ostrstream
производить значение в std::string
и работать с этим вместо этого.