Loading...
Pages: [1]   Go Down
Author Topic: config.txt sur une sd card  (Read 668 times)
0 Members and 1 Guest are viewing this topic.
lyon
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjours,

Je cherche a récupérer des variables sur une carte SD dans un fichier .TXT.

j'arrive a trouver la présence du fichier, mais impossible de sortir et enregistrer les variables dans l'arduino ethernet.

j'ai essayé une librairie fileinit qui ne marche pas ou que je n'arrive pas a utiliser.

pouvez vous m'aider?

merci


voici le fichier config
[heureON]
hON = 08

[heureOFF]
hOFF = 16


voici le programme



 
Code:
///////////////////////////// gestion du .INI///////////////////////////////////
 #include <SD.h>
   File myFile;
    //int heureON = (0);
   //int hON = (0);
   //char *hon[] ={ "hON"};
   //char myfile[10];
void setup()
{
 
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  pinMode(10, OUTPUT);
  
  if (!SD.begin(4))
     {
    Serial.println("initialization failed!");
    return;
      }
  Serial.println("initialization done.");
  myFile = SD.open("config.txt", FILE_READ);
 
    // lit le fichier config
    while (myFile.available())
    {
       Serial.write(myFile.read());
    // extaits les valeurs du fichiers config
      
      // if (strcmp(myFile,hon) == 0) {
      // Serial.println("trouvé");
        
    }
    // ferme le fichier:
    myFile.close();
  }


void loop()
{
// nothing happens after setup
}
« Last Edit: June 10, 2012, 11:40:00 am by Jean-François » Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 304
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut, strcmp() te dit si tes 2 chaines sont identiques.

Tu devrais plutôt utiliser strstr() qui te donne la position de la première occurrence de ta chaine1 dans chaine2.

Ensuite y a un autre problème, il faudra savoir comment se comporte exactement ce code :
Code:
   while (myFile.available())
    {
       Serial.write(myFile.read());
       ....

Parce qu'en C, normalement, selon la taille du fichier, il ne le lit pas en entier, et peut te parcourir le fichier en plusieurs voir, ou ligne par ligne ?
Ca une importance, car s'il lisait le fichier, avec une coupure en pleine ligne, il serait possible qu'un mot que tu cherches sur cette ligne soit coupé en 2, et que tu ne puisses dont pas le trouver.

De plus, sur microcontroleur, on a pas de mémoire pour charger en ram tout le fichier.
Donc pour cette question, faut attendre la réponse de quelqu'un d'autre.

EDIT :

Il y a aussi myFile.seek() qui éviterai le problème du dessus.
Il sert à te positionner dans le fichier. Donc tu parcours dans une première boucle ton fichier caractère par caractère, et à chaque caractères, tu vérifies ensuite si le char sur lequel tu es = le 1er de ta chaine, si le char actuel +1 = le 2ème de ta chaine, etc... jusqu'au '\0' de ta chaine.
« Last Edit: June 11, 2012, 12:36:37 am by vohu » Logged

83 - var
Offline Offline
Sr. Member
****
Karma: 0
Posts: 483
ARDUINO Powa !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

salut, tout devrais fonctionné vue tes config et le nom du fichier qui respect bien les 8 caractères + extension, après je pense que tu devrai faire simple, déja, SD.read ne te donne que le prochaine octet du fichier donc fait plutôt:

Code:
string lecture;

lecture += myfile.read();

et après tu l'envoie sur Serial.print tu à moins de risque de voir des problème apparaître.

Skizo !
Logged

Un tien vaux mieux que deux tu l'auras !

lyon
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

merci je vais essayer sur cette base,
j'ai reassayé la librairie fileinit mais elle ne marche pas dommage
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 187
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

salut il y a quelque temps j'avais le me souci que toi pour mon projet , je ne suis pas une bon programeur j'ai donc bidouiller ça si cela peut t'aider
le code de sauve garde sur la SD:
Code:
void saugardeConfig(){

  //---- efface l'ancien fichier  au préalable ---
  test=SD.remove("save.txt"); // efface fichier et mémorise résultat opération 
  if (test==true) {
    lcd.drawText(5,5,"Ancien fichier efface",1,COLOR_BLACK,couleur_fond );//Serial.println("Fichier efface");
  }; // affiche message si fichier bien effacé
  file = SD.open("save.txt", FILE_WRITE); // ouvre le fichier en écriture// NB : le fichier est créé si il n'existe pas !

  //---- test si fichier dispo en écriture
  if (file==false) {
    lcd.drawText(5,20,"Erreur ouverture fichier !",1,COLOR_BLACK,couleur_fond );//Serial.println ("Erreur ouverture fichier !")
    ;
  } // si fichier pas dispo
  else {
    lcd.drawText(5,30,"Nouveau fichier pret pour ecriture !",1,COLOR_BLACK,couleur_fond ); //Serial.println ("Fichier pret pour ecriture !");// si le fichier existe et est ouvert
    // premiere ligne du fichier CSV - entete avec liste des champs
    //Serial.println ("ecriture A");

    file.print("TCH_chauffage_Piece=");
    file.print(TCH_chauffage_Piece);
    file.println(";");
//pour le cas ou la variable n'est pas un float on convertie le int en float
 file.print("B=");
    file.print(float(B));
    file.println(";");//

    lcd.drawText(5,60,"Fin enregistrement !",1,COLOR_BLACK,couleur_fond );//Serial.println("Fin enregistrement !");
    file.close(); // ferme le fichier 
    lcd.drawText(5,90,"Fermeture fichier !",1,COLOR_BLACK,couleur_fond );//Serial.println("Fermeture fichier !");
    delay(2000);
  };
  lcd.clear(couleur_fond);
  selecteurPage=1;
  return;
}


et pour la restoration des donné :

Code:
void restorConfig(){
  file = SD.open("save.txt", FILE_READ); // ouvre le fichier lecture
  if (file==false) {
    lcd.drawText(5,75,"Erreur ouverture fichier !",1,COLOR_BLACK,couleur_fond );//Serial.println ("Erreur ouverture fichier !");
  }// si fichier pas dispo
  else {
    // si le fichier existe et est ouvert
    lcd.drawText(5,95,"Fichier pret pour lecture !",1,COLOR_BLACK,couleur_fond );//Serial.println ("Fichier pret pour lecture !");
    lcd.drawText(5,115,"Lecture fichier",1,COLOR_BLACK,couleur_fond );
    delay(1000);
    lcd.clear(couleur_fond);

    unsigned long i;
    float valeur;
    byte y=0;
    int a=0;
    for (i=0;i<=(file.size());i=(file.position()+1L)){
      file.seek(i);
      valeur=file.parseFloat ();
      a=a+1;
      lcd.printOptions(1, COLOR_BLACK, couleur_fond);
      lcd.printXY(0,y);
      switch(a){
      case 1:
        TCH_chauffage_Piece=valeur;
        lcd.print("TCH_chauffage_Piece");
        break;
      case 2:
         B=valeur;
        lcd.print("B");
        break;

      };
      lcd.print(" val:");
      lcd.print(valeur);
      lcd.print(" a:");
      lcd.print(a);
      y=y+15;
      if (y>220){
        lcd.clear(couleur_fond);
        y=0;
      };
      delay(100);
    }

    lcd.clear(couleur_fond);
    lcd.drawText(5,105,"Fermeture fichier !",1,COLOR_BLACK,couleur_fond );//Serial.println("Fermeture fichier !");
    lcd.drawText(5,125,"Restauration terminer",1,COLOR_BLACK,COLOR_GREEN );//Serial.println("Fermeture fichier !");
    file.close();

  };
  delay(1000);
  lcd.clear(couleur_fond);
}


beaucoup de partie du code serve a afficher les valeur a l'ecrant

en esperant que sa te soit utile!
Logged

lyon
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

je vais essayer sur ces bases mais dommage qu'il n'existe pas une librarie qui fonctionne
Logged

France
Online Online
Faraday Member
**
Karma: 36
Posts: 4457
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Je fait un morceau de code qui permet de lire un fichier de configuration au format texte.
Ça m'as pris une bonne heure mais il marche smiley-wink

Il y a 3 régles à respecter pour qu'il marche correctement :
- fin de lignes au format UNIX (\n)
- les lignes de commentaires ne doivent pas avoir d'espaces ou de tabulations avant le #
- il faut impérative ajouter une ligne à la fin du fichier

Le code du programme de test + parser de fichier :
Code:
/* Includes */
#include <SPI.h>
#include <SD.h>

/* Buffer size */
const byte BUFFER_SIZE = 32;

/* User variables */
int toto = 0, tata = 0, titi = 0;

/* setup() */
void setup() {

  /* Declare global buffer and pair pointers */
  char buffer[BUFFER_SIZE], *key, *value;

  /* Declare iterator, buffer lenght and line counter */
  byte i, buffer_lenght, line_counter = 0;

  /* Initialize serial port */
  Serial.begin(9600);
  Serial.println("Config file parsing example");

  /* Initialize SD card */
  pinMode(10, OUTPUT);
  if (!SD.begin(4)) { // Handle error
    Serial.println("SD card error !");
    for(;;);
  }

  /* Open configuration file */
  File config_file = SD.open("config.txt", FILE_READ);
  if(!config_file) { // Handle error
    Serial.println("Open file error !");
    for(;;);
  }

  /* While not end of file */
  while(config_file.available() > 0 ){

    /* Buffering one line */
    i = 0;
    while((buffer[i++] = config_file.read()) != '\n') {

      /* If line is longest than buffer size */
      if(i == BUFFER_SIZE) {

        /* Finish processing of line (without storing data) */
        while(config_file.read() != '\n');
        break; // Stop buffering
      }
    }

    /* Store number of char filled in buffer */
    buffer_lenght = i;

    /* Hnadle buffer overflow */
    if(i == BUFFER_SIZE) {
      Serial.print("Line overflow at line ");
      Serial.println(line_counter, DEC);
    }

    /* Finalize ASCIIZ string (and strip \n at end) */
    buffer[--i] = '\0';

    /* Increment line counter */
    ++line_counter;

    /* Skip empty line or comment line */
    if(buffer[0] == '\0' || buffer[0] == '#') continue;
     
    /* Process key field (skip tabs and spaces at start of string) */
    i = 0;
    while(buffer[i] == ' ' || buffer[i] == '\t') {
      if(++i == buffer_lenght) break; // Skip lines with just tabs and spaces
    }
    if(i == buffer_lenght) continue; // Handle lines with just tabs and spaces
    key = &buffer[i];

    /* Search fields separator = (skip tabs and spaces at start of string) */
    while(buffer[i] != '=') {

      /* Strip tabs and spaces */
      if(buffer[i] == ' ' || buffer[i] == '\t') buffer[i] = '\0';
       
      if(++i == buffer_lenght) {
        Serial.print("Parsing separator error at line ");
        Serial.println(line_counter, DEC);
        break; // Skip malformed lines
      }
    }
    if(i == buffer_lenght) continue; // Handle malformed lines

    /* Skip separator */
    buffer[i++] = '\0';

    /* Process value field (skip tabs and spaces at start of string) */
    while(buffer[i] == ' ' || buffer[i] == '\t') {
      if(++i == buffer_lenght) {
        Serial.print("Parsing value error at line ");
        Serial.println(line_counter, DEC);
        break; // Skip malformed lines
      }
    }
    if(i == buffer_lenght) continue; // Handle malformed lines
    value = &buffer[i];

    /* Compute and store key / value pair */
    if(strcmp(key, "toto") == 0) {
      toto = atoi(value);
    }
    else if(strcmp(key, "tata") == 0) {
      tata = atoi(value);
    }
    else if(strcmp(key, "titi") == 0) {
      titi = atoi(value);
    }
    else { // Default
      Serial.print("Unknown key ");
      Serial.println(key);
    }

  }

  /* Close configuration file */
  config_file.close();

  /* Print configuration result */
  Serial.print("toto = ");
  Serial.println(toto);
  Serial.print("tata = ");
  Serial.println(tata);
  Serial.print("titi = ");
  Serial.println(titi);
}

/* loop() */
void loop() {
  // Nothing to do here
}

Exemple de fichier de configuration (aussi en fichier joint) :
Code:
# Ceci est un commentaire

# Toto
toto = 42

   titi   =  1337
     
tata=7

Et le résultat sur le serial monitor :
Code:
Config file parsing example
Parsing separator error at line 7
toto = 42
tata = 7
titi = 1337
(L'erreur ligne 7 est normal, j'ai volontairement ajouté une tabulation pour montrer que le programme continue en cas de ligne mal formé)
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Full Member
***
Karma: 0
Posts: 187
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

la c'est bien plus rechercher que ce que j'avais fait va falloir que je regarde ça de prés aussi!! smiley-grin
Logged

lyon
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

super cela me semble tres bien merci a tous pour votre travail je vais essayer d'integrer cela
Logged

Pages: [1]   Go Up
Print
 
Jump to: