Problème d’enregistrements avec une carte SD
Bonjour,
J’ai conçu un programme avec un arduino Nano qui utilise un lecteur de carte SD avec une horloge temps réel DS3231. Un fichier est créé avec pour nom la date du jour. Je souhaite effectuer des enregistrements toutes les min pour des essais.
J’intègre la fonction « SD.end() » pour pouvoir retirer sans risque la carte. Un tuto m’a permis de récupérer la broche 5 de la carte qui détecte ou non la présence de la carte (voir photo). Le pin 7 renseigne la variable associée « SDmissing ».
J’utilise la fonction millis() pour l’intervalle de 60s d’enregistrement. Ce système fonctionne d’habitude mais ici, le compteur du delta_T s’arrête au bout de quelques tours de loop. Mystère !
Quelqu’un voit-il la raison de ce phénomène ? Est-ce lié à l’utilisation du « SD.end » ? Merci pour votre aide.
Voici le sketch :
Blockquote
/*
Le programme :
- avec Arduino Nano
- verifie la connexion avec la carte SD - pin 10 pour CS
- Vérifie la connexion au DS3231
- Crée le nouveau fichier du jour à 00h:00min:00s
- ferme toujours le fichier en fin d'enregistrement
*/
// Déclaration des bibliothèques
#include <Arduino.h>
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <RTClib.h> // Declaration de DS3231
RTC_DS3231 rtc;
// Déclaration du pin de détection de présence de la carte SD en pin 7
#define SDmissing 7
boolean testCarteInseree;
// Declaration des types de variables à concatener pour afficher la date
String stringPoints = ":";
String dateActuelle;
String heureActuelle ="";
//File file;
File fichier;
File root;
int tailleFichier=0;
String nomFichier;
// Essais enregistrements
int x = 0; //rang enregistrement
int data1 = 100;
int data2 = 0;
int data3 = 200;
String data4 = "Vent violent";
String data5 = "VR";
unsigned long tpsAct_10MIN = 0;
static unsigned long tpsPrec_10MIN = 0;
unsigned long delta_T = 0.0;
unsigned long duree = 60000;
//-----------------------------------------------------------------------------------------------------
// ROUTINE REINITIALISATION DE LA CARTE
//-----------------------------------------------------------------------------------------------------
void initSDCard()
{
while (!SD.begin())
{
Serial.print("---");
Serial.print("Carte SD non disponible !");
Serial.println("---");
SD.end(); // Fonction non incluse dans la bib de l'IDE
delay(100);
}
return;
}
//-----------------------------------------------------------------------------------------------------
// SETUP SETUP SETUP SETUP
//-----------------------------------------------------------------------------------------------------
void setup()
{
Serial.begin(9600); //début de communication avec le moniteur série
Serial.println("Initialisation");
pinMode(SDmissing, INPUT_PULLUP); // Pin détection Carte insérée oun noInterrupts()
initSDCard(); // Routine de détection de présence de la carte
Serial.println("Communication etablie avec la carte SD !"); // Quand initSDCard est ok
// ******************** INITIALISATION DS3231 *********************
if (!rtc.begin())
{
Serial.println("Couldn't find RTC");
Serial.flush();
//while (1);
}
else
{
Serial.println("DS3231 OK !");
}
}
//----------------------------------------------------------------------------
// LOOP LOOP LOOP LOOP LOOP
//----------------------------------------------------------------------------
void loop()
{
// OPTION afichage état pin 7
// testCarteInseree = digitalRead(SDmissing);
// Serial.print("testCarteInseree = ");
// Serial.println(testCarteInseree);
//recuperation date et heure
DateTime now = rtc.now();
heureActuelle = now.hour() + stringPoints + now.minute() + stringPoints + now.second();
// Serial.println(heureActuelle);
// Serial.println();
// Pour création fichier date
int jour= now.day();
int mois = now.month();
int an = now.year();
//Si la carte est insérée (pin SDmissing à 0)
if(!digitalRead(SDmissing))
{
char datafile[14];
//******************* CREATION FICHIER ***************************
sprintf(datafile,"/%04d%02d%02d.txt",an,mois,jour); // %d pour un int
delay(10);
fichier = SD.open(datafile, FILE_WRITE);
// Si le fichier existe
if (fichier)
{
nomFichier = fichier.name();
Serial.print("nomFichier : ");
Serial.println(nomFichier);
tailleFichier = fichier.size();
if (tailleFichier == 0) // Ecriture des en-tête
{
fichier.println("Rang;Heure;Vint;Vmax;Vmoy;Vent;Rafale");
x = 0;
fichier.close();
delay(10);
}
else
{
// Calcul durée pour 10 min
tpsAct_10MIN = millis();
// Serial.print("tpsAct = ");
// Serial.print(tpsAct_10MIN);
// Serial.print("- tpsPrec = ");
// Serial.println(tpsPrec_10MIN);
delta_T = tpsAct_10MIN - tpsPrec_10MIN;
Serial.print("delta_T = ");
Serial.println(delta_T);
if (delta_T >= duree)
{
// fichier = SD.open(datafile, FILE_WRITE);
// // Si le fichier existe
// if (fichier)
// {
x++;
data1 = data1 -1;
data2 = data2 + 1;
data3 = data3 -1;
fichier.print(x),fichier.print(";"),fichier.print(heureActuelle),fichier.print(";"),fichier.print(data1),
fichier.print(";"),fichier.print(data2),fichier.print(";"),fichier.print(data3),fichier.print(";"),fichier.print(data4),fichier.print(";"),fichier.print(data5);
fichier.println();
fichier.close();
tpsPrec_10MIN = millis();
}
}
}
else
{
initSDCard();
}
}
else
{
initSDCard();
}
}
Blockquote