Go Down

Topic: sauvegarder des réglage sur sd ? (Read 715 times) previous topic - next topic

Heloderma-kris

Bonjour a tous ,
Pour mon projet de gestion de ma  piece d'elevage de reptile j'ai ecrit un programme qui utilise:
un shield mega_sd de chez Watterott avec port SDcard et RTC
et un aficheur MI0283QT-2 de chez Watterott également
bref mon systeme fonctione mais je souhaiterai
sauvgarder en cas de coupure d'electricité mes réglage : comme la temperature de consigne
les coordonné gps que je rentre etc
je sait qu'il est posible d'utiliser l' eeprome mais cela m'enuis dans sens ou c'est limité et je préférerai utiliser une SD
en utilissant une partie du code trouver sur http://www.mon-club-elec.fr
j'arrive a ecrire une valeur dans un fichier text, cela fonctione trés bien puisque lorsque je consulte le fichier sur pc la valeur et bien ecrite

par contre impossible de la lire corectement
exemple si je stock 42 et que je fais apelle a la fonction
Code: [Select]
Serial.println(file.read());};
il me renvoi 52 a l' écrans

et si je stock 32 il me renvoi 51!

est ce que cela vient de la façon de lire la valeur avec une conversion spéciale genre hex dec bite ou autre?
PS : j'ai pas encore bie pigé les fonction de la librairie sd et les example de chez Watterott sont difficile a comprendre vu mon niveau actuel ! :smiley-roll-blue:

Benvenuto

Hello,

file.read() ne lit qu'un caractère dans le fichier texte. Si tu as stocké le nombre "42", file.read() va renvoyer le caractère 4 sous la forme d'un code ASCII. En ASCII, le caractère '4' est représenté par la valeur 52 (lien), d'où le 52.

Je n'ai pas de quoi tester sous la main, mais si tu es avec arduino 1.0 tu devrais essayer de remplacer file.read() par file.parseInt().

Dis-moi ce que ça donne

Heloderma-kris

je n'ai pas encors tester ta technique mais effectivement je me suis apersu que sa m'ecrivai de ASCII je peut lire la totalité mais il faut metre sous cette forme
Code: [Select]
while (file.available()) {
        Serial.write(file.read());


la sa marche bien mais par contre je suis pas sur que je puise le réutiliser pour faire quelque chose ou alors stocker des chiffre a virgule je suis encore dessus!

je me demande après réflexion si le stockage en EEPROM n'est pas plus simple car d'après ce que je lit ont peut récrire environ 100000 fois , je pense pas que je modifierai mes réglage autant de fois!

néanmoins je vais tester ta technique car je me dit que sa peut servir pour d'autre merci !

Heloderma-kris

aprés avoir tester avec  file.parseInt() sa me renvoi 0 :~

Benvenuto

Tu pourrais poster un extrait du fichier texte enregistré sur la SD, histoire de voir quelle tête il a ?

Heloderma-kris

le fichier text est des plus simple il y a juste inscri ma variable ici 32.5 rien d'autre!
le but etant au final de créé simplement un fichier pour chaque parametre de je souhaite enregistrer stocker ma variable et la relire en cas de soucis
voici le code que j'utilise pour le moment pour faire mes test
Code: [Select]
void loop(){ // debut de la fonction loop()

  //---- efface fichier au préalable ---
  test=SD.remove("gps.txt"); // efface fichier et mémorise résultat opération 
  if (test==true) { Serial.println("Fichier efface");}; // affiche message si fichier bien effacé

  //---- crée fichier en écriture ---
  file = SD.open("gps.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) {Serial.println ("Erreur ouverture fichier !");} // si fichier pas dispo
  else {Serial.println ("Fichier pret pour ecriture !");// si le fichier existe et est ouvert
    // premiere ligne du fichier CSV - entete avec liste des champs
    file.println(lat);
    Serial.println ("ecriture Lat");
    file.close(); // ferme le fichier
    Serial.println("Fin enregistrement !"); 
    Serial.println("Fermeture fichier !");
  delay(1000);
};
 
  file = SD.open("gps.txt", FILE_READ); // ouvre le fichier lecture
  if (file==false) {Serial.println ("Erreur ouverture fichier !");}// si fichier pas dispo
  else { // si le fichier existe et est ouvert
    Serial.println ("Fichier pret pour lecture !");
    while(file.available()){
        Serial.write(file.read());
         };};
         float b=file.read();
        Serial.println ("Fichier pret pour lecture !");
        Serial.write(b);

while (1);}
// fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

Heloderma-kris

le programme me renvoi bien la valeur du fichier test mais je ne comprend pas comment re-paramétrer une variable avec la lecture du fichier
si je comprend bien il lit dans mon fichier text les valeur une a une
32,5 et alors lu comme 3 puis 2 puis , Puis 5 mais ça ne me donne pas un 32,5 au final donc impossible de re-paramétrer une variable float b
avec une valeur de 32,5!

Benvenuto

file.read() te renverra toujours un byte, donc si tu veux un lire un float tu es obligé de le convertir.

Essaie :

Code: [Select]
float b = file.parseFloat()
Serial.println(b);

Heloderma-kris

c'est dommage que je ne voit ta solution que maintenant sa m'aurai eviter de cherche (faignasse oui un peut :smiley-mr-green:)
je suis arriver en cherchant sur la même solution et voici donc un système basique et fastidieux qui va peut être faire froid dans le dos de ce qui programme bien c'est de la bricole mais sa marche pour un débutant comme moi ! :)
Code: [Select]


// Connecter broche SCLK du module Ethernet sur la broche 13
// Connecter broche MISO du module Ethernet sur la broche 12
// Connecter broche MOSI du module Ethernet sur la broche 11
// Connecter broche Select Ethernet du module Ethernet sur la broche 10
// Connecter broche Select SD Card du module Ethernet sur la broche 4
// Le module Ethernet est compatible avec la carte Mega via le connecteur ICSP

// Broche 14 : Une résistance variable de 10 KOhms

// /////////////////////////////// 1. Entête déclarative ///////////////////////
// A ce niveau sont déclarées les librairies incluses, les constantes, les variables, les objets utiles...

// --- Déclaration des constantes ---

// --- Inclusion des librairies ---

#include <SD.h> // crée automatiquement un objet racine SD représentant la carte mémoire SD



const int brocheSDCardSelect=4; // broche utilisée pour sélectionner la SD card

// --- Déclaration des constantes des broches analogiques ---


int test; // Variable utilisée pour tester valeur renvoyée par fonctions SD Card
float A=342.51;
float B=2.21;
float C=1.5;


// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---

/*
Sd2Card card; // création d'un objet Sd2Card
SdVolume volume; // création d'un objet SdVolume
SdFile root; // création d'un objet SdFile pour le répertoire racine
SdFile file; // création d'un objet SdFile pour le fichier utilisé
*/

File file; // objet file
File root; // objet root pour le répertoire racine


// ////////////////////////// 2. FONCTION SETUP = Code d'initialisation //////////////////////////
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// --- ici instructions à exécuter 1 seule fois au démarrage du programme ---

// ------- Initialisation fonctionnalités utilisées ------- 

Serial.begin(115200); // initialise connexion série à 115200 bauds
// IMPORTANT : régler le terminal côté PC avec la même valeur de transmission

//---- initialise l'utilisation de la carte mémoire SD en mode SPI 
pinMode(10, OUTPUT); // met la broche 10 (SS) en sortie (nécessaire avec module ethernet)
digitalWrite(10, HIGH); // mais désactive le  circuit intégré W5100 du module ethernet!

  //----- initialisation de la carte SD -----
  Serial.println("Initialisation de la SD card...");

  pinMode(10, OUTPUT); // laisser la broche SS en sortie - obligatoire avec librairie SD

  test=SD.begin(brocheSDCardSelect); // initialisation de la carte SD avec broche 4 en tant que CS - renvoie true/false

  if (test!=true) { // si initialisation n'est pas réussie
    Serial.println("Echec initialisation!"); // message port Série
  }
  else { // si nitialisation réussie
    Serial.println("Initialisation reussie !"); // message port Série

  //----- affiche le contenu du répertoire

  root = SD.open("/"); // ouvre la SD Card à la racine

  Serial.println("Repertoire racine ouvert !");

  };}

// fin de la fonction setup()
// ********************************************************************************

////////////////////////////////// 3. FONCTION LOOP = Boucle sans fin = coeur du programme //////////////////
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

  //---- efface fichier au préalable ---
  test=SD.remove("sav.txt"); // efface fichier et mémorise résultat opération 
  if (test==true) { Serial.println("Fichier efface");}; // affiche message si fichier bien effacé
  file = SD.open("sav.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) {
  Serial.println ("Erreur ouverture fichier !");} // si fichier pas dispo
  else {
    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("A=");
    file.print(A);
    file.println(";");
    Serial.println ("ecriture B");
    file.print("B=");
    file.print(B);
file.println(";");
Serial.println ("ecriture C");
file.print("C=");
    file.print(C);
    file.println(";");
   
    Serial.println("Fin enregistrement !");
  file.close(); // ferme le fichier 
    Serial.println("Fermeture fichier !");
  delay(1000);};
 
  file = SD.open("sav.txt", FILE_READ); // ouvre le fichier lecture
  if (file==false) {Serial.println ("Erreur ouverture fichier !");
}// si fichier pas dispo
  else {
    // si le fichier existe et est ouvert
    Serial.println ("Fichier pret pour lecture !");
    Serial.println("les constantes enregistrer sont extraite repectivement en a,b,c");
    file.seek (2);//positione le curseur a la fin de la chaine de caratere"A="soit position 2 on compt la position 0
    //fastidieu car il faut compter mais accecible pour un debuttan comme moi
   float b=file.parseFloat ();
    file.seek (11);//tout les carractere se suivant on arive donc en position 11
    float c=file.parseFloat ();
    file.seek (19);//tout les carractere se suivant on arive donc en position 19
   float d=file.parseFloat ();
    file.close();
    Serial.println ("valeur de b !");
    Serial.println(b);
    Serial.println ("valeur de c");
     Serial.println(c);
     Serial.println ("valeur de d");
     Serial.println(d);
     
    };
         Serial.println ("fin de la demonstration");
       

while (1);}
// fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

Go Up