Bonjour,
Une pratique élémentaire d’écriture dans un fichier de carte SD qui me rend chèvre :
J’utilise un arduino nano avec un lecteur de carte micro SD. Voir schéma du montage :
Le programme d’essai tout simple doit écrire toutes les 10 s quelques données dans un fichier « ANEMO.TXT ».
/*
Le programme :
- avec Arduino Nano
- verifie la connexion avec la carte SD - pin 10 pour CS et pin A2 pour les nombres aleatoires
- verifie l'existence du fichier "ANEMO.TXT"et le supprime pour eviter le cumul des donnees, si on le lui demande
- ferme toujours le fichier en fin d'enregistrement
*/
#include <Arduino.h>
#include <SPI.h>
//#include <SD.h>
#include <SdFat.h>
// Crée un objet SdFat
SdFat sd;
#include <Wire.h>
#include <RTClib.h> // Declaration de DS3231
RTC_DS3231 rtc;
// Declaration des types de variables à concatener pour afficher la date
String dateActuelle="";
String heureActuelle="";
String stringSlash = "/";
String stringPoints= ":";
String stringTiret= "-";
String dataEvent= "";
File file;
File root;
const byte pin_CS = 10;
int tailleFichier=0;
int x = 0; //rang enregistrement
int data1 = 100;
int data2 = 0;
int nbEnregistrements = 0;
static unsigned long tps_Deb_10MN = 0.0; //Mémo temps de départ
unsigned long tps_Act_10MN = 0.0;
unsigned long duree = 10000.0; // Valeur à changer éventuellement POUR 10 Min
boolean messageOK = 1; // Mettre à 0 pour ne plus afficher !
// boolean optionEffacement = 0;
void message(String s)
{
if (messageOK)
{
Serial.println(s);
}
}
// // =================================================================================
// // Fonction : formateValeurSurDeuxChiffresMinimum
// // (permet d'avoir une homogénéïté, au niveau de l'affichage, sur le moniteur série)
// String formateValeurSurDeuxChiffresMinimum(int nombre)
// {
// if (nombre < 10)
// return "0" + String(nombre);
// else
// return String(nombre);
// }
// =================================================================================
void DateEtHeure()
{
DateTime now = rtc.now(); //recuperation date et heure
// Recuperation date et heure
int jour= now.day(), mois=now.month(), an = now.year();
dateActuelle = jour + stringSlash + mois + stringSlash + an;
Serial.print(dateActuelle);
Serial.print(" ");
int heure = now.hour() , minut = now.minute();
heureActuelle = heure + stringPoints + minut;
Serial.println(heureActuelle);
Serial.println();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////**************** SETUP() ****************///////////////////////////////
void setup()
{
Serial.begin(9600); //début de communication avec le moniteur série
// Serial.println("***************\n Nombre pris au hasard...\n***************");
message("Initialisation");
pinMode(pin_CS, OUTPUT);
if (!sd.begin(pin_CS)) //Test du début de la communication avec la carte sur le pin 10
{
Serial.println("Communication impossible !");
return;
}
Serial.println("Communication etablie avec la carte SD !");
// **************** EFFACEMENT OU NON *******************
// if (optionEffacement)
// {
// message("Effacement du fichier s'il existe");
// if (sd.exists("ANEMO.TXT"))
// {
// message("Effacement du fichier");
// sd.remove("ANEMO.TXT");
// tailleFichier = file.size();
// Serial.println(tailleFichier);
// }
// }
/////////////////////// ****************** INITIALISATION DS3231 ******************* ///////////////////////////////
if (!rtc.begin())
{
Serial.println("Couldn't find RTC");
Serial.flush();
//while (1);
}
else
{
Serial.println("DS3231 OK !");
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////**************** LOOP() ****************///////////////////////////////
void loop()
{
tps_Act_10MN = millis();
u32 _duree = tps_Act_10MN - tps_Deb_10MN;
// Enregistrements sur une periode de 1 min (6 enregistrements chaque 10 s ici )
// if (nbEnregistrements <= 5)
//{
// Enregistrement sur SD
if (_duree >= duree)
{
// Carte SD : enregistrements si non action de la telecommande
DateEtHeure(); //definition date et heure avec le module DS3231
Serial.println("Ouverture du fichier");
//file = sd.open("ANEMO.TXT",FILE_WRITE);
if (file = sd.open("ANEMO.TXT",FILE_WRITE))
{
delay(10);
message("Fichier ouvert");
tailleFichier=file.size();
Serial.println(tailleFichier);
if (tailleFichier == 0) // le fichier a ete vide donc on ecrit la 1ere ligne
{
file.println("Rang;Date;h:min;Data1;Data2");
nbEnregistrements = 0; //pour enregistrement a la prochaine reeption
delay(10);
file.close();
}
// else
// {
Serial.println("Enregistrements en cours");
x++; //Rang
file.print(x),file.print(";"),file.print(dateActuelle),file.print(";"),file.print(heureActuelle),
file.print(";"),file.print(data1),file.print(";"),file.print(data2);
tailleFichier = file.size();
Serial.println(tailleFichier);
//////////////////// if (nbEnregistrements > 1) nbEnregistrements = 0; // Pour prise en compte d'une détection pdt les 20s de "drapeauAlarme_ON = true"
file.close();
message("Fichier clos");
nbEnregistrements ++;
//tps_Deb_10MN = millis();
Serial.print("nbEnregistrements : ");
Serial.println(nbEnregistrements); // Incrémùenté en fin d'ecriture
//}
}
else
{
message("Erreur de fichier");
//return;
}
tps_Deb_10MN = millis();
}
// }
// else
// {
// tps_Deb_10MN = millis();
// /////////// while(1); // Arrêt des enregistrements (NON POUR LE PG ANEMO !)
// }
}
En fait, lors du premier loop, touts est ok ! L’écriture se fait avec actualisation de la taille du ficher… Mais pour les loops suivants, impossible de reconnaître le fichier alors que je l’ai fermé à la fin de l’écriture précédente. J’ai essayé avec d’autres nanos, j’ai vérifié mes connexions, sans résultat, je suis passé de la librairie SD.h à la SdFat.h sans succès.
J'ai alors utilisé une UNO et là, tout fonctionne (y compris la connexion de la carte dès le lancement du programme, alors qu’il me faut la sortir puis la réinsérer pour qu’elle soit reconnue avec le NANO).
Enregistrements avec le UNO :

Oups ! Je donne ma langue au chat !
Où sont mes erreurs ? Je tourne en rond. Merci pour votre aide.
Bébert



