Go Down

Topic: Reprise d'écriture sur une carte SD (Read 2 times) previous topic - next topic

Pascal-49

Bonjour  :) ,
J'ai un souci avec la reprise d'écriture sur une carte SD avec le shield Adafruit.
Je suis en train de réaliser un projet de data loger de température relativement simple avec écriture sur carte SD des températures et affichage des températures max du jour, de la semaine, et du mois sur un écran LCD.
Mon projet est quasi terminé, mais je me suis rendu compte d'un problème de reprise d'écriture sur la carte SD que je trouve gênant.
J'ai reproduit le problème dans un programme plus simple pour vous expliquer.
Le programme consiste à écrire les minutes et les secondes dans un fichier "backup.txt" à chaque fois qu'on appuie sur un bouton poussoir.
Le programme fonctionne bien sauf que quand je retire la carte SD et que j'appuie sur le bouton, il ne me met pas d'erreurs d'écriture, mais il n'écrit pas les données sur la SD!
Si je remets la carte SD, il n'écrit pas non plus et n'indique pas d'erreur non plus.
Pour pouvoir réécrire à nouveau il faut que je fasse un reset ce que je voudrais éviter.
je vous joins mon programme afin que vous puissiez m'aider
Chose importante, je suis débutant sur arduino et je suis prêt à accepter toutes les remarques :~
Merci
Pascal
Code: [Select]
// --- Programme Arduino ---
// par P.M - Le 19/08/2012
//
// --- Que fait ce programme ? ---
//Ecriture sur la SD des minute et seconde courante à chaqua appuis sur le Boouton poussoir
/* Programme type utilisant la connexion série*/

// --- Fonctionnalités utilisées ---
// Utilise la connexion série vers le PC

// --- Circuit à réaliser ---
// Connecter le Boutton poussoir sur la broche 2 du arduino

//**************** Entête déclarative *******
// A ce niveau sont déclarées les librairies, les constantes, les variables...

// --- Inclusion des librairies utilisées ---
#include <Wire.h>
#include <SD.h>
#include "RTClib.h"
RTC_DS1307 RTC;
// --- Déclaration des constantes ---
const int APPUI=0; // constante état du BP - appui sur niveau bas
const int PAS_APPUI=1; // constante état du BP - relâché sur niveau haut

// --- constantes des broches ---
const int chipSelect = 10; //declaration constante de broche adafruit
File backUpFile;
const int BP=2; //declaration constante de broche

// --- Déclaration des variables globales ---
int ETAT_BP; // variable d'état du bouton poussoir
// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---
int minute=0,seconde=0;

//**************** 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 au démarrage ---

Serial.begin(9600); // initialise connexion série à 115200 bauds
Wire.begin();
RTC.begin();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiLED_ROUGE
//RTC.adjust(DateTime(__DATE__, __TIME__));

}

// IMPORTANT : régler le terminal côté PC avec la même valeur de transmission


// ------- Broches en sortie ------- 
pinMode(chipSelect, OUTPUT);//met la broche en sortie pour la schield adafruit (SD)
// ------- Broches en entrée ------- 
pinMode(BP, INPUT); //met la broche en entree

// ------- Activation du rappel au + interne des broches en entrée si nécessaire ------- 
digitalWrite(BP, HIGH) ; // activation du pullup de la broche en entrée

// ------- initialisation carte SD
if (!SD.begin(chipSelect)) {
Serial.println("Error : Card failed, or not present");

} else {
Serial.println("debug :2");
Serial.println ("card initialized.");


}

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


//*************** 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()

// --- ici instructions à exécuter par le programme principal ---

DateTime now = RTC.now();
minute=now.minute();
seconde=now.second();

ETAT_BP=digitalRead(BP); // lit l'état du BP et met la valeur 0/1 dans la variable

if (ETAT_BP==APPUI){ // si l'état du BP est appuyé (càd si variable état BP = 0)
// Attention à bien utiliser == et non =

if (SD.exists("backup.txt")) {
Serial.println ("backup.txt exist.");
backUpFile = SD.open("backup.txt", FILE_WRITE);
if (backUpFile){
Serial.println("Ecriture possible");
backUpFile.print(minute);
backUpFile.print(":");
backUpFile.println(seconde);
backUpFile.flush();
backUpFile.close();
} else {
Serial.println ("Ecriture imposible !!!");
}
} else{
Serial.println  ("Creation fichier backup.");
backUpFile = SD.open("backup.txt", FILE_WRITE);
if(backUpFile){
Serial.println("Ecriture possible");
backUpFile.print(minute);
backUpFile.print(":");
backUpFile.println(seconde);
backUpFile.flush();
backUpFile.close();
} else {
Serial.println ("Ecriture imposible !!!");
}
}


}
else { // sinon (càd si variable état bp=1)

}
delay(100);


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


//*************** Autres Fonctions du programme *************


// --- Fin programme ---





Pascal-49

Bonsoir,
je cherche je cherche(pas assez bien surement) mais je ne trouve rien sur mon problème.
Moi qui pensais que ce devais êtres un simple oublie quelque part :-(

Un petit coup de main serait le bienvenu ;-)
Merci

SesechXP

Salut,

Je n'ai pas regardé en détail ce que fait la méthode SD.begin mais il est probable qu'il faille la rappeler lorsque tu remets la carte SD. Piste à creuser...

++

Pascal-49


Salut,

Je n'ai pas regardé en détail ce que fait la méthode SD.begin mais il est probable qu'il faille la rappeler lorsque tu remets la carte SD. Piste à creuser...

++


Merci SesechXP pour ton aide,
Malheureusement j'ai regardé cette piste hier et en faite on ne peux appeler qu'une fois la méthode SD.begin sinon au deuxième coup elle renvoie False (card fail ou card no présent) même si on n' a pas retirer la carte SD:-(
Il faudrait une méthode du genre SD.end mais elle n'existe pas:-(
++

Jean-François

Essaye de changer de librairies et utilise plutôt sdFat qui est semble t'il plus aboutie.
MacBook intel core 2 duo  os X snow Leopard 10.6
 eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

SesechXP

Du coup la bibliothèque SD ne semble pas adaptée à ce que tu veux faire... Soit tu ajoutes la fonction end (vive le logiciel libre  :smiley-mr-green:), soit tu utilises une autre bibliothèque comme le suggère Jean-François.

skywodd

Bonjour,

sdFatLib n'est rien d'autre que la librairie caché derrière la librairie SD ;)

Pour bien faire il faudrait une interruption sur la broche "card detect" du connecteur pour carte sd.
La librairie SD est simple d'utilisation mais elle n'est pas trés complète, avec sdfatlib tu doit pouvoir faire des choses beaucoup plus poussé mais ce sera pas aussi simple qu'avec SD ;)
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Pascal-49

Merci pour ces explications,
Je vais donc essayer d'utiliser la sdfatlib sur vos conseille.
Skywodd, bonne idée d'utiliser les interuptions pour détecter le retrait de la carte, en plus j'en ai utilisé dans mon projet initial donc ça ne me fait pas peur et c'est relativement simple d'utilisation :)
Savez vous si sur le dataloger de ardafruit le contacte de présence carte et câblé sur la carte et sur quel pin récupérer l'information?
La doc est pas super claire à ce sujet, visiblement ce contacte est relié sur le connecteur jp14 d'après le shema mais je ne trouve le plan du PCB pour retrouver ou il ce situe, pourtant y a pas 36 connecteurs sur cette carte :~ même pas une petite sérigraphie sur la carte pour le repérer. 
Bon j'essaye de me dégager du temps d'ici la fin de la semaine pour voir ça plus finement.
Merci des tuyaux  :)

Image du dataloger:
http://www.adafruit.com/index.php?main_page=popup_image&pID=243

Schéma:
http://www.ladyada.net/make/logshield/design.html

Jean-François

On dirait assez que ça correspond à ça non ?

MacBook intel core 2 duo  os X snow Leopard 10.6
 eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Pascal-49

Effectivement tu as l'oeil  8)
La sérigraphie était légèrement effacé sur ma carte je testerais la pin 'cd' demain au multi mètre pour confirmer :)
Merci

Pascal-49

Je confirme le groupe de pin que tu as trouvé Jean François est le bon  :)
La pin 'cd' correspond au contacte "presence de carte" ouvert quand la carte est présente et relié à la masse quand la carte est absente.
Bien vue  :)
Reste plus qu'a m'attaquer à la lib sdfatlib :smiley-roll-sweat:
Merci

Jean-François

MacBook intel core 2 duo  os X snow Leopard 10.6
 eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Pascal-49

Ok merci,
Je vais utiliser le contacte en pullup en utilisant les résistances internes de broches de l'arduino.
Comme mon boutton poussoir 'bp'
;)

Go Up