Arduino Forum

International => Français => Topic started by: Felicien9 on Mar 25, 2019, 02:27 pm

Title: Conversion d'un tableau de float en chaine de caractère
Post by: Felicien9 on Mar 25, 2019, 02:27 pm
Bonjour, j'aimerai convertir un tableau de valeur float en char ou en string, quelqu'un saurait m'aider?
J'ai fais ceci qui ne fonctionne pas.

Code: [Select]
   float tabVal[]={10.12,14,18.6};
  char tabChaine[30];
  sprintf(tabChaine, "%f-%f-%f",tabVal[0],tabVal[1],tabVal[2]);

Merci d'avance
Title: Re: Conversion d'un tableau de float en chaine de caractère
Post by: kamill on Mar 25, 2019, 02:31 pm
Bonjour,

Le format %f ne fonctionne pas par défaut avec les processeurs avr
Tu peux utiliser dotostrf()
Title: Re: Conversion d'un tableau de float en chaine de caractère
Post by: Felicien9 on Mar 25, 2019, 03:24 pm
Merci pour votre réponse rapide, vous parlez de dtostrf j'imagine? J'arrive a convertir un float mais pas un tableau de float...
Title: Re: Conversion d'un tableau de float en chaine de caractère
Post by: kamill on Mar 25, 2019, 03:29 pm
Oups! Effectvement dtostrf()
Pour le tableau, il suffit de faire une boucle.
Title: Re: Conversion d'un tableau de float en chaine de caractère
Post by: Felicien9 on Mar 25, 2019, 03:39 pm
J'ai essayé en faisant comme ça :
Code: [Select]
   float tabVal[]={10.12,14,18.6};
  char tabChaine[30];
  for(int i=0;i<3;i++)
  {
    dtostrf(tabVal[i],30,2, tabChaine);
  }
  Serial.println(tabChaine);


Mais il m'affiche que le dernier nombre de "tabVal" ce qui est normal je pense, il faudrait que quand je tourne dans le tableau, les valeurs viennent se mettre à la suite de la chaine de caractère, comment je peux faire? Ou concaténer?
Merci de votre aide
Title: Re: Conversion d'un tableau de float en chaine de caractère
Post by: dbrion06 on Mar 25, 2019, 03:55 pm
Une solution lourde serait
Code: [Select]

char final[100]="";
  char tabChaine[30];
  for(int i=0;i<3;i++)
  {
    dtostrf(tabVal[i],30,2,tabChaine );
    strcat(final, tabChaine);
  }

====
edited : avez vous besoin de 30 caractères pour coder un float avec deux chiffres décimaux?
Une solution moins obèse -je réserve 100 octets; même si je devais n'en reserver que 30*3 + 1, c'est gros -serait d'imprimer au fur et à mesure que les sous chaînes sont créées...)
Si vous avez besoin de 30 caractères, dimensionnez tabChaine à 31 (pour le terminer par NULL...)
Title: Re: Conversion d'un tableau de float en chaine de caractère
Post by: Felicien9 on Mar 25, 2019, 04:34 pm
Je savais pas si le 30 était pour l'ensemble du tableau de float ou si c'était pour une seul float. Merci de votre aide, je pense que ça va fonctionner maintenant.
Title: Re: Conversion d'un tableau de float en chaine de caractère
Post by: J-M-L on Mar 25, 2019, 04:44 pm
à quoi va servir tabChaine ?? en avez vous vraiment besoin?
Title: Re: Conversion d'un tableau de float en chaine de caractère
Post by: Felicien9 on Mar 25, 2019, 04:57 pm
Je dois envoyer un tableau de float sur un BDD MYSQL par PHP et je pense que cela sera plus facile avec une chaine de caractère
Title: Re: Conversion d'un tableau de float en chaine de caractère
Post by: J-M-L on Mar 25, 2019, 05:02 pm
vous pouvez l'envoyer en plusieurs bouts...

Code: [Select]
client.print(tabVal[0],2); // le 2 pour 2 chiffres après la virgule
client.print("-");
client.print(tabVal[1],2);
client.print("-");
client.print(tabVal[2],2);
Title: Re: Conversion d'un tableau de float en chaine de caractère
Post by: Felicien9 on Mar 26, 2019, 08:24 am
Je pense au deux mais je voulais essayer les deux parce que je dois envoyer un tableau[6][3] ce qui est assez long à envoyer. Ca va faire un GET fort à rallonge que je devrais probablement faire en plusieurs fois
Title: Re: Conversion d'un tableau de float en chaine de caractère
Post by: J-M-L on Mar 26, 2019, 08:48 am
La façon de générer le GET n'a aucune importance du côté réception... et si vous savez un tableau c'est hyper simple de faire deux boucles imbriquées  pour générer la requête

Si votre GET est trop long passez en POST
Title: Re: Conversion d'un tableau de float en chaine de caractère
Post by: Felicien9 on Mar 26, 2019, 09:06 am
D'accord merci de votre aide, j'avais déjà essayé avec une boucle mais ça n'avait pas trop été. Je vais réessayer et je reviens vers vous si ça ne va pas.
Title: Re: Conversion d'un tableau de float en chaine de caractère
Post by: J-M-L on Mar 26, 2019, 10:36 am
ce n'est quand même pas très compliqué d'écrire une boucle qui parcourt le tableau

voici un exemple
Code: [Select]
uint8_t tableau[6][3] = {
  {0, 1, 2},
  {1, 12, 13},
  {2, 21, 22},
  {3, 31, 32},
  {4, 41, 42},
  {5, 51, 52}
};

void setup() {
  Serial.begin(115200);

  for (uint8_t i = 0; i < 6; i++) {
    for (uint8_t j = 0;  j < 3; j++) {
      Serial.print(F("tableau["));
      Serial.print(i);
      Serial.print(F("]["));
      Serial.print(j);
      Serial.print(F("] = "));
      Serial.print(tableau[i][j]);
      if (j != 2) Serial.print(F("\t")); // on ne sépare avec une tabulation que si on n'est pas au dernier élément
    } // fin de boucle j
    Serial.println(); // on saute une ligne (par exemple)
  } // fin de boucle  i
}

void loop() {}


vous verrez dans la console série (réglée à 115200 bauds)

tableau[0][0] = 0   tableau[0][1] = 1   tableau[0][2] = 2
tableau[1][0] = 1   tableau[1][1] = 12   tableau[1][2] = 13
tableau[2][0] = 2   tableau[2][1] = 21   tableau[2][2] = 22
tableau[3][0] = 3   tableau[3][1] = 31   tableau[3][2] = 32
tableau[4][0] = 4   tableau[4][1] = 41   tableau[4][2] = 42
tableau[5][0] = 5   tableau[5][1] = 51   tableau[5][2] = 52


ou si vous voulez tout écrire sur une seule ligne (comme pour un GET)
Code: [Select]
uint8_t tableau[6][3] = {
  {0, 1, 2},
  {1, 12, 13},
  {2, 21, 22},
  {3, 31, 32},
  {4, 41, 42},
  {5, 51, 52}
};

void setup() {
  Serial.begin(115200);
      Serial.print(F("GET /envoyer?"));
  for (uint8_t i = 0; i < 6; i++) {
    for (uint8_t j = 0;  j < 3; j++) {
      Serial.print(F("t"));
      Serial.print(i); // pas de séparateur des indices car on sait qu'ils ne sont que sur 1 caractère
      Serial.print(j);
      Serial.print(F("="));
      Serial.print(tableau[i][j]);
      if ((i != 5) && (j != 2)) Serial.print(F("&")); // on ne met rien à la toute fin
    } // fin de boucle j
  } // fin de boucle  i
}

void loop() {}


vous donnera
GET /envoyer?t00=0&t01=1&t02=2t10=1&t11=12&t12=13t20=2&t21=21&t22=22t30=3&t31=31&t32=32t40=4&t41=41&t42=42t50=5t51=51t52=52


Title: Re: Conversion d'un tableau de float en chaine de caractère
Post by: Felicien9 on Mar 26, 2019, 01:20 pm
Merci beaucoup, j'ai fait un défilement de tableau du même style et qui fonctionne aussi mais sans la tabulation après chaque donnée. Maintenant il faut que j'arrive a récupérer tout ça en php... Merci de votre aide :)