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
// --- 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 ---