Problème de fichier d'une carte SD avec un arduino NANO

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 :
BlocNotes

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

que donne le code avec IDE 2.3.2 sur Nano ?

Bonjour J-M-L,
Je n'ai jamais pu déclarer une NANO avec l'IDE. J'obtiens toujours un problème de connexion ; que je fasse un reset ou que je débranche l'usb ou que je redémarre l'ide !

avez vous choisi l'option "old bootloader" dans l'IDE ?

Merci ! Je viens d'activer cette option et effectivement le téléchargement s'opère.
Mais le résultat est le même : "errur de fichier" au second loop !...
C'est rageant !

donc ça fonctionne sur UNO mais pas sur Nano avec le même IDE sur la même machine et les mêmes branchements ?

je serai tenté de vous dire de mettre à jour le bootloader de voter Nano pour voir si ça change quelque chose.. (la compilation n'est peut être pas identique)

testez un code hyper simple pour valider le fonctionnement de la carte SD

Pardon, mais comment changer le boatloader avec l'IDE ?
Peut-être devrais-je utiliser le nanonew avec VSCODE... J'essaierai demain.
Merci beaucoup.

il y a pas mal de posts sur ce sujet si vous cherchez sur le forum, en voici un

Merci J-M-L pour cette docs claire et très détaillée.

J'ai finalement changé de lecteur de carte SD (la A au lieu de la B) et ça marche avec l'IDE que je sais maintenant utiliser avec le NANO et le choix du old bootloader. Je savais le faire avec VSCode.

Je dois basculer ce programme d'essai vers VSCode maintenant avant de réinjecter mon programme final si c'est ok.

Suite, et j'espère fin, au prochain épisode de l'ANEMO trois NANOs !
Encore merci.
Bébert

OK - bonne continuation

Bonjour,
Fin de l'épopée ANEMO. Tout est OK. Place à la réalisation maintenant.
J'en aurai fouiné des pistes et leurs découvertes grâce à vous avec un remerciement chaleureux à J-M-L toujours fidèle, disponible et sacrément au fait de tant de connaissances qu'il a plaisir à partager.
A bientôt pour d'autres aventures.
Bébert.

toujours un plaisir d'aider ceux qui mettent vraiment les mains dans le cambouis et cherchent aussi par eux même.

Bonne continuation.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.