web-dev-qa-db-fra.com

Arduino sprintf float non formaté

J'ai ce croquis Arduino,

char temperature[10];
float temp = 10.55;
sprintf(temperature,"%f F", temp);
Serial.println(temperature);

la température est imprimée comme

? F

Des idées sur la façon de formater ce float? J'ai besoin que ce soit une chaîne de caractères.

38
Mistergreen

Pour des raisons de performances, %f N'est pas inclus dans l'implémentation Arduino de sprintf(). Une meilleure option serait d'utiliser dtostrf() - vous convertissez la valeur en virgule flottante en chaîne de style C. La signature de la méthode ressemble à:

char *dtostrf(double val, signed char width, unsigned char prec, char *s)

Utilisez cette méthode pour le convertir en chaîne C-Style, puis utilisez sprintf, par exemple:

char str_temp[6];

/* 4 is mininum width, 2 is precision; float value is copied onto str_temp*/
dtostrf(temp, 4, 2, str_temp);
sprintf(temperature,"%s F", str_temp);

Vous pouvez modifier la largeur minimale et la précision afin qu'elles correspondent au float que vous convertissez.

93
Dinal24

Comme indiqué précédemment, le support Float n'est pas inclus dans sprintf sur Arduino.

Classe de chaîne

Arduino a sa propre classe String .

String value = String(3.14);

puis,

char *result = value.c_str();

Référence de classe de chaîne, lien ci-dessus

Construit une instance de la classe String. Plusieurs versions construisent des chaînes à partir de différents types de données (c'est-à-dire, les formatez en séquences de caractères), notamment:

  • une chaîne constante de caractères, entre guillemets (c'est-à-dire un tableau de caractères)
  • un seul caractère constant, entre guillemets
  • une autre instance de l'objet String
  • un entier constant ou entier long
  • un entier constant ou entier long, utilisant une base spécifiée
  • une variable entière ou entière
  • une variable entière ou entière longue, utilisant une base spécifiée
  • un nombre à virgule flottante ou double, en utilisant un nombre décimal spécifié
3