Arduino Sketch Compile Error: Intentando concatenar flotante con una cadena

4

No estoy seguro de si debería publicar esto aquí o en Stackoverflow, pero como esta audiencia probablemente tiene la mayor experiencia con Arduino, pensé que este sería el mejor lugar.

Acabo de comprar un protector Ethernet, y como primer proyecto con él, estoy tratando de publicar una lectura de temperatura TMP36 en Pachube. Mientras Pachube acepta múltiples formatos para sus datos, estoy tratando de publicar estas cosas en JSON, porque me gusta JSON. Sin embargo, estoy teniendo problemas para obtener mi valor de temperatura, que es un flotador, en la cadena JSON. Soy un desarrollador de Python / PHP, y relativamente nuevo en C, así que he buscado en Google pero todavía 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 Arduino IDE (versión 1.0): "No se puede convertir 'String' en 'const char' para el argumento '2' en 'int sprintf (char, const char *, ...)' "

Descubrí que estoy llamando a sprintf () con el número incorrecto de argumentos / argumentos en el orden incorrecto, ya que no devuelve la cadena con formato. Sin embargo, ni siquiera estoy seguro de que sprintf () sea la mejor función a utilizar para lograr el objetivo de obtener el valor de punto flotante del sensor en una cadena. ¿Hay una mejor manera de hacer esto?

    
pregunta tommytwoeyes

1 respuesta

6

No puedes usar sprintf() para formatear un flotador en una cadena en el Arduino.

No solo es incorrecto el formato del comando, sino que sprintf en Arduino no admite flotantes.

Hay una función dtostrf() que convierte un flotador 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 función dtostrf es:

dtostrf(value, width, precision, output);

donde value es el valor flotante que desea convertir, width es el número mínimo de caracteres que se muestran antes del punto decimal (relleno 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.

    
respondido por el Majenko

Lea otras preguntas en las etiquetas