Problème séparation nombre à virgule

Bonjour,

N'étant pas très très expérimenté sur Arduino, je rencontre quelques difficultés afin de faire fonctionner mon programme.
Je vous explique le but de celui-ci afin de me venir en aide s'il vous plaît.

Alors voilà, j'ouvre un fichier texte de plusieurs nombres (données de température séparés par des tabulations) avec ma carte SD (Shield SD Arduino) et je dois être capable de lire la première valeur de ce fichier texte, je précise que les valeurs sont toutes à virgule.
Jusque là aucun problème, mais maintenant je dois être capable de séparer ce nombre relevé, par exemple 82,1 dans mon code et afficher 82 et 1 afin d'avoir des entiers (INT). C'est là que ça coince... Je me retrouve à extraire 8 et 2 mais non pas le 1 alors que je voudrais un INT = 82 et un deuxième égal à 1...

Je vous présente mon code :

#include <SPI.h>
#include <SD.h>
#include <String.h>
File myFile;
char c;

String readString, part1, part2;

void setup() {
  Serial.begin(9600);
 //Il est montré à l'écran que la communication avec le SD va commencer
  Serial.println("Communication avec la carte SD...");

  
  //Le moniteur indique si la communication a été établie correctement
  //ou il y a eu un type d'erreur.
  if (!SD.begin(4)){
    
    Serial.println("La communication a échouée");
    return;
  }
  Serial.println("La communication a démarrée correctement");
  
  
  /*                    LECTURE DE DONNÉES DANS LA MÉMOIRE SD DE ARDUINO                 */

  //Le fichier est ouvert à nouveau, cette fois pour lire les données écrites.
  myFile = SD.open("V01_1L.txt");
  
  //Si le fichier a été ouvert correctement, les données sont affichées.
  if (myFile){
    
    //Le moniteur indique les informations qui apparaîtront dans
    //test.txt
    Serial.println("\nLecture de la première donnée thermique");
    
    //Une boucle est implémentée qui parcourt le fichier jusqu'à ce qu'il n'en trouve plus
            
            /* RECHERCHE DE LA PREMIERE DONNEE THERMIQUE */  
 
    while (myFile.available()){
      
      c = myFile.read();

          //stock des caractères dans une chaîne
          readString += c;  
          readString = myFile.readStringUntil('\t');
}

          /* FIN DE LA RECHERCHE */
   
    Serial.println(readString); //Affichage de la donnée

      part1 = readString.substring(0, 2); //Prend les 2 premiers caractères
      part2 = readString.substring(3, 4); //Prend le suivant après la virgule
     
      Serial.println(part1);  //Affiche les résulats
      Serial.println(part2);

      int n1 = part1.toInt(); // Convertit en entier
      int n2 = part2.toInt();

      Serial.println("Les nombres sont :");
      Serial.println(n1);  //Affiche le résultat final
      Serial.println(n2);
           
    readString="";
  

//Si tout s'est bien passé, fermer le fichier pour ne pas perdre les données
    myFile.close();
  }
  
  //Au cas où il y aurait eu des problèmes pour ouvrir test.txt, celui-ci sera affiché à l'écran.
  else{
 
    Serial.println("Le fichier test.txt ne s'est pas ouvert correctement");
  }

}

void loop(){
  
}

Voici ce que j'ai en sortie :

Communication avec la carte SD...
La communication a démarrée correctement

Lecture de la première donnée thermique
82,1
8
2
Les nombres sont :
8
2

Je précise que le 82,1 est celui prélevé dans le fichier texte et c'est la bonne valeur. Le problème se pose lors de la séparation, je n'obtiens pas 82 et 1 mais 8 et 2.
Voilà, j'espère que vous saurez m'éclaircir et je vous souhaite un bonne fin de journée.
Merci :slight_smile:

Bonjour,

La sortie que tu nous présentes n'a pas été effectuée avec le programme que tu nous as mis.

Le programme que tu as mis donne bien les résultats corrects, mais il vaudrait mieux rechercher la virgule dans la chaine puis extraire la valeur avant et la valeur après.

De plus tu ne dis pas quelle est la carte arduino. Si c'est une carte avec processeur avr, il serait préférable de ne pas utiliser string à cause de la fragmentation méméoire.

kamill:
Bonjour,

La sortie que tu nous présentes n'a pas été effectuée avec le programme que tu nous as mis.

Le programme que tu as mis donne bien les résultats corrects, mais il vaudrait mieux rechercher la virgule dans la chaine puis extraire la valeur avant et la valeur après.

De plus tu ne dis pas quelle est la carte arduino. Si c'est une carte avec processeur avr, il serait préférable de ne pas utiliser string à cause de la fragmentation méméoire.

Bonjour, je vous remercie pour votre réponse rapide.

La sortie que je vous ai présenté est bel et bien celle du programme que j'ai mis, j'ai même vérifié en réessayant et ça me remet exactement ce que je vous ai mis, je vous l'assure.

Communication avec la carte SD...
La communication a démarrée correctement

Lecture de la première donnée thermique
82,1
8
2
Les nombres sont :
8
2

kamill:
Le programme que tu as mis donne bien les résultats corrects, mais il vaudrait mieux rechercher la virgule dans la chaine puis extraire la valeur avant et la valeur après.

Avez vous un exemple à me montrer s'il vous plaît afin de voir comment ça marche ou alors le nom d'une fonction capable de le faire parce que je ne vois pas comment. :confused:

PS : J'utilise la carte Wireless SD Shield sur un Arduino Uno

Merci bien en tout cas ! :slight_smile:

Est-ce que par hasard il n'y aurait pas un caractère avant le 8? Comme, par exemple, un espace ou une tabulation.

fdufnews:
Est-ce que par hasard il n'y aurait pas un caractère avant le 8? Comme, par exemple, un espace ou une tabulation.

Bonjour, je viens d'aller vérifier et non il n'y a pas d'espace ou de tabulation avant le 8. Je m'étais demandé ça aussi mais visiblement non.
Si vous voulez je peux vous mettre si possible le fichier texte à disposition mais je ne sais pas comment faire.

Bref c'est très bizarre tout ça, parce que ouais, je sais vraiment pas qu'est-ce qui cloche...

Quand tu cliques sur le bouton REPLY sous le dernier post tu ouvres une fenêtre de réponse, en dessous cette fenêtre il y a un lien pour attacher des pièces jointes

fdufnews:
Quand tu cliques sur le bouton REPLY sous le dernier post tu ouvres une fenêtre de réponse, en dessous cette fenêtre il y a un lien pour attacher des pièces jointes

Ah voilà merci ! Je vous l'ai mis à disposition du coup ^^

V01_1l.txt (1.17 KB)

Ah ah, faut pas se fier aux apparences

Ah si je comprend bien il y a des points à chaque fois qui les sépare ? :o

Pas tout à fait, selon mon éditeur préféré, ton fichier est encodé en UTF-16LE.
Je ne sais pas à partir de quelle application il est généré mais ce n'est pas du texte ASCII brut.

Waouh, j'ai généré cela via une application de caméra thermique afin d'exploiter à chaque fois les données thermiques d'une image.

Mais du coup Arduino n'est pas capable de traiter cela ?

Maintenant que tu vois comment est constitué le fichier tu vas pouvoir t'adapter.
Ou alors tu regardes dans les paramètres de ta caméra pour voir s'il n'y a pas moyen de faire générer le fichier sous une autre forme.

fdufnews:
Maintenant que tu vois comment est constitué le fichier tu vas pouvoir t'adapter.
Ou alors tu regardes dans les paramètres de ta caméra pour voir s'il n'y a pas moyen de faire générer le fichier sous une autre forme.

Oui, du coup j'ai commencé à retravailler mon programme et j'ai modifier cela :

 part1 = readString.substring(0, 4); 
 part2 = readString.substring(7, 8);

Ce qui est bien, c'est que j'ai maintenant le 1 après la virgule mais le 82 je ne l'ai toujours pas mais uniquement le 8...

Voici le code en sortie :

Communication avec la carte SD...
La communication a démarrée correctement

Lecture de la première donnée thermique
82,1
8
1
Les nombres sont :
8
1

On dirait que ce n'est pas possible de prendre le 82 en entier mais uniquement un chiffre, soit 8 soit 2...

Si tu ne peux pas modifier le format de ton fichier, il faut éliminer les caractères en trop lors de la lecture.

   while (myFile.available()) {
      c = myFile.read();
      if (c=='\t')
      break;

      //stock des caractères dans une chaîne
      if (c!=0 && c!=(char)0xff && c!=(char)0xfe)
        readString += c;
    }

@kamill, j'ai essayé votre solution et ça marche nickel merci beaucoup ! Sauf que je n'ai pas compris pourquoi vous avez mentionné lors du stockage de caractère 0xFF (255) et 0xFE (254) ?

 while (myFile.available()) {
      c = myFile.read();
      if (c=='\t')
      break;

      //stock des caractères dans une chaîne
      if (c!=0 && c!=(char)0xff && c!=(char)0xfe)
        readString += c;
    }


          /* FIN DE LA RECHERCHE */
   
    Serial.println(readString); //Affichage de la donnée

      part1 = readString.substring(0, 2); //Prend les 2 premiers caractères
      part2 = readString.substring(3, 4); //Prend le suivant après la virgule
     
      Serial.println(part1);  //Affiche les résulats
      Serial.println(part2);

      int n1 = part1.toInt(); // Convertit en entier
      int n2 = part2.toInt();

      Serial.println("Les nombres sont :");
      Serial.println(n1);  //Affiche le résultat final
      Serial.println(n2);
           
    readString="";

Sortie :

82,1
82
1
Les nombres sont :
82
1

Parce comme on peut le voir sur le dump de fdufnews ai post #7 ce sont les deux premiers caractères du fichier.

kamill:
Parce comme on peut le voir sur le dump de fdufnews ai post #7 ce sont les deux premiers caractères du fichier.

Ah d'accord merci beaucoup ^^