No estoy seguro de si debería publicar esto aquí o en Stackoverflow, pero dado que esta audiencia probablemente tenga más experiencia con Arduino, pensé que este sería el mejor lugar.
Acabo de comprar un escudo Ethernet y, como primer proyecto con él, estoy tratando de publicar una lectura de temperatura TMP36 en Pachube. Si bien Pachube acepta múltiples formatos para sus datos, estoy tratando de publicar esto en JSON, porque me gusta JSON. Sin embargo, tengo problemas para obtener mi valor de temperatura, que es un valor flotante, en la cadena JSON. Soy un desarrollador de Python/PHP y relativamente nuevo en C, así que busqué mucho en Google pero aún no he descubierto la forma correcta de hacerlo. Aquí está mi código:
float temperature = 85.4; // Or whatever
String jsonData = sprintf("{'version':'1.0.0', 'datastreams':[{'id':'%s', 'current_value':'%f'}]}\n", datastream1, temperature);
Sigo recibiendo el siguiente error del IDE de Arduino (versión 1.0): "No se puede convertir 'String' a 'const char' para el argumento '2' a 'int sprintf(char, const char*, ...)'"
Descubrí que estoy llamando a sprintf() con la cantidad incorrecta de argumentos/argumentos en el orden incorrecto, ya que no devuelve la cadena formateada. Sin embargo, ni siquiera estoy seguro de que sprintf() sea la mejor función para lograr el objetivo de convertir el valor de punto flotante del sensor en una cadena. Hay una mejor manera de hacer esto
No puede usar sprintf()
para formatear un flotador en una cadena en el Arduino.
No solo el formato del comando es incorrecto, sino que sprintf en Arduino no admite flotadores.
Hay una función dtostrf()
que convierte un flotante en una matriz de caracteres. Puedes usarlo como:
float temperature = 85.4;
char temp[10];
String tempAsString;
String jsonData;
dtostrf(temperature,1,2,temp);
tempAsString = String(temp);
jsonData = "{'version':'1.0.0', 'datastreams':[{'id':'" +
datastream1 + "', 'current_value':'" + tempAsString + "'}]}\n";
El formato de la dtostrf
función es:
dtostrf(value, width, precision, output);
donde value
está el valor flotante que desea convertir, width
es el número mínimo de caracteres para mostrar antes del punto decimal (rellenando con espacios según sea necesario), precision
es el número de lugares decimales y output
es la matriz de caracteres para colocar los resultados.
tempAsString = String(temp);
la derecha?
crosley
Kellenjb
crosley
chris stratton
Majenko