Go Down

Topic: Lire un fichier text (Read 2 times) previous topic - next topic

bobijack

je me suis tourné du coté de la carte SD car cela m'apporte plusieurs avantages :)

J'arrive bien à lire et ouvrir mon fichier stocker sur ma carte SD avec la library SD
Mais j'arrive pas à parser mon fichier et récupérer l'intensité à chaque pas de temps ...
pourtant j'ai suivis ton tuto sur ton site mais rien y fait ma led brille de la même façon.

suis-je obligé de stocker les valeurs d'intensités ? ou je peux directement les récupérer du fichier et les assigner dans le analogwrite ?

encore 1000x merci pour votre aide ;)

skywodd

Faire voir ton code actuel et un exemple de fichier texte ;)
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

bobijack

#17
Apr 05, 2013, 10:28 am Last Edit: Apr 05, 2013, 10:31 am by bobijack Reason: 1
Salut Skywodd :)
Merci de ton aide ...

voici mon horrible code traficoté avec plusieurs choses trouvées sur le net.
J'ai plusieurs erreurs et j'ai vraiment du mal mais bon ça vous donnera surement une idée.

Code: [Select]


#include <SPI.h>
#include <SD.h>

File myFile;
String config;
int led1 = 9;  

void setup()
{
// Open serial communications and wait for port to open:
 Serial.begin(9600);
  while (!Serial) {
   ; // wait for serial port to connect. Needed for Leonardo only
 }


 Serial.print("Initializing SD card...");
 pinMode(10, OUTPUT);
 
 if (!SD.begin(4)) {
   Serial.println("initialization failed!");
   return;
 }
 Serial.println("initialization done.");
 
 
 // open the file for reading:
 myFile = SD.open("test.txt");
 if (myFile) {
   Serial.println("test.txt:");
   
   // read from the file until there's nothing else in it:
   while (myFile.available()) {
    Serial.write(myFile.read());
   }
   // close the file:
   myFile.close();
 } else {
  // if the file didn't open, print an error:
   Serial.println("error opening test.txt");
 }
}

void loop()
{
 File myFile = SD.open("test.txt");
 if(myFile){
   for(int i=0;i<10;i++)
   config[i]=myFile.parseInt();
   
   analogWrite(led1, config[i]);
   delay(5000)
   
   myFile.close();
 }
 
}




mon fichier txt ressemble à ça :
Code: [Select]
255,100,255,50,100,20,10,200,50,90,85,200,0,0,0,255
Mais je peux le mettre sous une forme différente selon ce qui est plus facile.

Dans mon vrai travail le vecteur sera beaucoup beaucoup plus long.
du coup autre question : il y a t-il une taille maximal de fichier utilisable ?

Encore merci :)

skywodd


voici mon horrible code traficoté avec plusieurs choses trouvées sur le net.
J'ai plusieurs erreurs et j'ai vraiment du mal mais bon ça vous donnera surement une idée.

Aie aie aie ... le code va pas du tout, ya de grosses erreurs qui me sautent au visage ;)


mon fichier txt ressemble à ça :
Code: [Select]
255,100,255,50,100,20,10,200,50,90,85,200,0,0,0,255
Mais je peux le mettre sous une forme différente selon ce qui est plus facile.

Tu peut ré-expliquer la signification de ces nombres j'ai cru comprendre mais je suis pas trop sûr.
Si j'ai bien compris j'ai une solution bien plus simple en tête pour toi.


Dans mon vrai travail le vecteur sera beaucoup beaucoup plus long.
du coup autre question : il y a t-il une taille maximal de fichier utilisable ?

La seule limite que je vois c'est le uint32_t qui stock la position dans le fichier soit un maximum de quelque chose comme 4Go donc.
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

bobijack

Salut Skywodd,
Je savais bien que mon code était tout pourris ... ;)

Ce que j'essaye de faire c'est reproduire une histoire lumineuse perçu par un objet x.
Donc une fois que j'ai cette histoire lumineuse (obtenue numériquement) je veux la tester en vraie ;)

Concernant le fichier text : il contient les intensités lumineuses perçu par cette objet.
255 étant l'intensité maximal de ma led et 0 l'intensité minimale (led éteinte).

Donc mon fichier ressemblera à ça :

Code: [Select]
255,100,20, ... etc..., 200,10,230
où chaque nombre correspond à un entier que j'implemente dans la fonction : analogwrite.

Donc je veux qu'à chaque pas de temps (environ 60 secondes) ma led s'allume pendant 60 secondes à 255 puis 100 puis 20 ... etc.
et arrivé à la fin de mon vecteur que ça boucle et revient au début afin de reproduire n fois cette histoire lumineuse ;)
est-ce-que c'est plus clair ?

Concernant le fichier je ne pense pas du coup qu'il dépassera 4giga ;)

Merci 1000 fois pour ton aide precieuse :):):)






skywodd

Remplace le Serial.println() dans le while par ton analogWrite et ça devrait être bon ;)

Code: [Select]
#include <SD.h>

void setup() {

   Serial.begin(9600);
   pinMode(10, OUTPUT);
   
   if (!SD.begin(4)) {
     Serial.println("Card failed, or not present");
     for(;;);
   }
}

void loop() {

   File dataFile = SD.open("test.txt");

   if (!dataFile) {
     Serial.println("error opening datalog.txt");
for(;;);
   }
 
   while (dataFile.available()) {
     Serial.write(dataFile.parseInt());
     delay(60000);
   }
   
   dataFile.close();
}
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

bobijack

Wuaaouuu ça marche :) :) :)
Merci 1000 fois ;)

si tu as le temps peux tu me commenter mes erreurs s'il te plais ?

skywodd


si tu as le temps peux tu me commenter mes erreurs s'il te plais ?

Ok, allez commatons commentationnons commentant dans ce cas :smiley-mr-green:

Code: [Select]
#include <SPI.h> // Pas obligatoire
#include <SD.h>

File myFile; // Tu n'est pas obligé de déclarer ça ici
String config; // Tu déclares un String pour stocker tes valeurs, ça va pas du coup pour stocker des chiffres ;)
int led1 = 9;   // const byte au lieu de int, c'est mieux et plus propre pour des numéros de broche

void setup()
{
// Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) { // pas besoin pour la UNO, uniquement pour la leonardo
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");
  pinMode(10, OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
 
  // Pourquoi afficher le contenu du fichier texte ici ? Le ^c^v bête et méchant c'est pas bien ;)
  // open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
   
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
    Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
  // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop()
{
  File myFile = SD.open("test.txt");
  if(myFile){
    for(int i=0;i<10;i++)
    config[i]=myFile.parseInt(); // Tu récupéres un int que tu met dans un char (de la String), ce n'est pas viable comme méthode et ça ne marche pas
    // Enfin si ça peut marcher mais c'est pas comme ça qu'il faut faire
    analogWrite(led1, config[i]); // Du coup tu utilises toujours le même char, à quoi sert le string ? Médite la dessus ;)
    delay(5000)
   
    myFile.close();
  }
 
}
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

bobijack

Super merci beaucoup,
Je vais méditer la dessus en effet ;)

J'ai deux dernières petites questions :

- j'essaye à chaque fois de copier dans un fichier text vierge la position où je me situe dans mon vecteur :
Code: [Select]

File write1 = SD.open("position1.txt",FILE_WRITE);
write1.println(led1.position());

Cependant je ne peux pas mettre quelque chose de non integer ce qui m'étonne ... ???

- Comment je peux faire pour faire la même chose avec différentes led et différents vecteurs d'intensités ?
J'ai essayé avec différents fichier text mais les résultats ne sont pas concluants. Peut être avec différentes lignes ?

Merci Beaucoup !

skywodd


Cependant je ne peux pas mettre quelque chose de non integer ce qui m'étonne ... ???

File::println() est en fait la même fonction que Serial::println() tout ce que tu peut sortir sur le port série tu peut le sortir sur un fichier ;)
Texte, int, float, char, ...


- Comment je peux faire pour faire la même chose avec différentes led et différents vecteurs d'intensités ?
J'ai essayé avec différents fichier text mais les résultats ne sont pas concluants. Peut être avec différentes lignes ?

Regarde le format CSV ;)
1 ligne = 1 série de valeurs

Exemple :
Quote
led1;led2;led3;led4
led1;led2;led3;led4
led1;led2;led3;led4


Le code n'as alors besoin que d'une modification mineure :
Code: [Select]
while (dataFile.available()) {
     analogWrite(LED1_PIN, dataFile.parseInt()); // led 1
     analogWrite(LED2_PIN, dataFile.parseInt()); // led 2
     analogWrite(LED3_PIN, dataFile.parseInt()); // led 3
     analogWrite(LED4_PIN, dataFile.parseInt()); // led 4
     delay(60000);
   }
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

bobijack

Super pour la réponse rapide ! MERCI ;)
Par contre pour l'écriture de la position j'obtiens toujours cette erreur :
Code: [Select]

request for member 'position' in 'led1', which is of non-class type 'const byte'


Merci de ta patience ;)

skywodd


Par contre pour l'écriture de la position j'obtiens toujours cette erreur :
Code: [Select]

request for member 'position' in 'led1', which is of non-class type 'const byte'


"led1" doit être une variable de type "const byte" et non de type File d'où l'erreur ;)
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Go Up