MKR ZERO problème carte SD - RTC

Allo tout le monde,

Voici un petit problème que je rencontre en ce moment. Il ne s'agit rien de très grave mais si quelqu'un connait une solution cela me simplifierait grandement la vie! J'utilise actuellement un Arduino de type MKR ZERO qui récupère des données pour mon application. Je stocke dans la carte SD les données puis je les traite ensuite sur un autre logiciel. Le time pour le RTC est initialisé au moment où le code est téléversé. Cette donnée m'est très utile car je peux en ressortir un timestamp, et traiter mes données beaucoup plus facilement. Jusque là tout va bien. Malheureusement, au moment où je replace la carte SD dans l'Arduino, le code se relance! Cela ne serait pas un problème si le RTC ne se réinitialisait pas également... En gros, je me retrouve avec un système qui fonctionne très bien, mais qui me pose problème au moment où je replace ma carte SD. Je dois quand même avouer que je trouve extrêmement stupide que l'on ne puisse pas avoir un vrai RTC à cause de cette carte SD. Je rêve probablement, mais peut être existe t'il une ligne de code permettant d'éviter ce problème. Je suis ouvert à tout types de pistes. Merci beaucoup!

Écrivez quelque part sur la carte SD que la RTC a été initialisé et ne le refaites pas au reboot en vérifiant la carte avant

(Je n'avais pas remarqué de reboot au changement de carte SD faudra que je vérifie)

Salut J-M-L, merci de votre réponse,

Je comprends ce que vous voulez dire, mais malheureusement je n’ai pas la priorité. Mon problème principal est que lorsque la carte SD entre dans la fente, je n’ai pas la priorité et mon code va se réinitialiser. Je peux écrire n’importe quoi ou demander à mon Arduino de faire une action, ce dernier va dans tout les cas se réinitialiser. Il n’y a pas, en tout cas à ma connaissance, de moyens d’effectuer une action au moment où la carte SD pénètre la fente. Si il existe une ligne de code dédiée à cela, cela me permettrait déjà en effet d’atténuer mon problème.

Réinitialiser ça veut dire que le setup() s'exécute non ? et c'est dans ce setup() que vous remettez la RTC à l'heure avec celle de l'heure de téléchargement je suppose ? Si le courant n'a pas été coupé la RTC n'aura pas perdu l'ancienne heure... il ressemble à quoi votre setup()?

J’initialise mon RTC de cette façon,

Dans les variables globales :

const char compile_date[12] = __DATE__;
const char compile_time[9]  = __TIME__;

DATE et TIME sont apparemment d’après ce que j’ai compris des instructions en C qui correspondent donc au moment du téléversement.

Dans le setup() :

void setup() { 
  
  if (!SD.begin(chipSelect)) {                //Si la carte n'est pas détectée, abandon des opérations
    Serial.println("Carte non insérée");
    return;
  }  
  
  Serial.println("Carte détectée");
  
  rtc.begin();                                //Démarre le Real Time Clock
  rtc.setTime(hours,minutes,seconds);         //Setting du time et du date
  rtc.setDate(day,month,year);
  rtc.setAlarmTime(0,0,0);                    //Alarme début à t=0
  rtc.enableAlarm(rtc.MATCH_SS);              //Active une mesure chaque minute
  rtc.attachInterrupt(dataCheck);             //Au bout d'une minute, le booleen loadDataCheck passe de 0 à 1

}

day, minutes, seconds etc… sont issus des compile_date et compile_time que j’ai traité. Pour éviter de mettre trop de ligne je ne les affiche pas ici.

Donc en gros, dans cette configuration, au moment de la réinitialisation induite par la carte SD, le RTC se réinitialise à l’heure du téléversement.

Puis je comprends ce que vous voulez dire. Je pourrai en effet m’arranger d’une certaine façon pour enregistrer une valeur dans le loop(), puis trouver un moyen d’initialiser celle-ci en fonction de si je téléverse pour la première fois ou de si je mets la carte SD, mais honnêtement je trouve ça bien compliqué pour quelque chose qui ne devrait pas l’être. J’essaye de trouver quelque chose de moins étrange pour résoudre mon problème.

Oui donc vous avez bien la main et votre propre code est celui qui remet l’horloge à une mauvaise date. si vous créez juste un fichier vide sur la carte SD pour dire “ne pas initialiser la RTC” il suffit de regarder avant d’appeler setTime et setDate si ce fichier existe et dans ce cas ne pas le faire

Je suis d’accord avec vous je trouve curieux ce reset au moment de l’insertion d’une carte. Je n’ai jamais regardé cela sur un Zéro mais On peut déclencher une interruption lors de l’insertion d’une carte SD, faudrait voir si cette interruption est routée par défaut dans la librairie vers un code de reset (ou si vous avez fait quelque chose vous même avec cette interruption)

J’ai vu que vous avez posé votre question sur openclassroom et le site de adafruit, vous ratissez large! Ce serait bien de le mentionner et si vous obtenez des réponses ailleurs de les répercuter ici…

Bonjour,

Le plus simple est de créer un programme spécifique pour la mise à l'heure et de supprimer la mise à l'heure dans le programme application.

Pour mettre à l'heure compiler et charger le programme de mise à l'heure.
Ensuite charger le programme d'application et tu pourras avoir autant de reset que tu veux, il n'y aura pas de remise à l'heure.