Mesure delai écoulé entre 2 dates rtclib.h+ sd.h?

Bonjour,
bouton1 ecrit date/h/m sur sd
bouton2 ecrit nouvelle date/h/m sur sd
le temps est "lu" sur le ds3231par
DateTime now = rtc.now(); // Clock call
now = rtc.now(); // quelle heure est-il?

type or paste code here

void bp1{
  // ecriture
  DateTime now = rtc.now(); // Clock call
  now = rtc.now();  // quelle heure est-il?
  Logfile = SD.open("sleep.txt", FILE_WRITE);
  Logfile.println();
  if (now.day() < 10) Logfile.print("0");      // date
  Logfile.print(now.day(), DEC);
  Logfile.print("/");
  if (now.month() < 10) Logfile.print("0");
  Logfile.print(now.month(), DEC);
  Logfile.print("/");
  Logfile.print(now.year(), DEC);
  Logfile.print("; ");  // separateur excel

  if (now.hour() < 10) Logfile.print("0");      // heure
  Logfile.print(now.hour(), DEC);
  Logfile.print(":");
  if (now.minute() < 10) Logfile.print("0");
  Logfile.print(now.minute(), DEC);

  Logfile.println("   : JE DORS ");
  Logfile.close();  //  ou flush et mettre close() uniquement
  // a la fin du loop ?
}
void bp2()  {
  // ecriture
   DateTime now = rtc.now(); // Clock call
   now = rtc.now();  // quelle heure est-il?
  Logfile = SD.open("sleep.txt", FILE_WRITE);
  Logfile.println();
  if (now.day() < 10) Logfile.print("0");  // date
  Logfile.print(now.day(), DEC);
  Logfile.print("/");
  if (now.month() < 10) Logfile.print("0");
  Logfile.print(now.month(), DEC);
  Logfile.print("/");
  Logfile.print(now.year(), DEC);
  Logfile.print("; ");  // separateur excel

  if (now.hour() < 10) Logfile.print("0");      // heure
  Logfile.print(now.hour(), DEC);
  Logfile.print(":");
  if (now.minute() < 10) Logfile.print("0");
  Logfile.print(now.minute(), DEC);

  /* if (now.second() < 10) Logfile.print("0");
    Logfile.print(now.second(), DEC);  // nul besoin d'enregistrer les secondes
         //
    Logfile.print(";  ");
  */
  Logfile.println("  : JE SUIS DEBOUT ");
  Logfile.close();  // sauvegarde sd
}

comment faire la différence entre le temps2 et le temps1 ? pour un résultat en minutes
j'ai des réponses sur google mais je ne comprends rien, désolé

Merci

Il suffit de demander l'heure au format UNIX et de faire la soustraction :

    DateTime t1 = rtc.now();
    ....
    DateTime t2 = rtc.now();
    uint32_t diff = t2.unixtime() - t1.unixtime();
    uint32_t diffMinutes = diff / 60;

Dans le fichier log il serait beaucoup plus intéressant d'enregistrer l'heure au format UNIX également, ce qui serait moins coûteux en temps d'exécution et en place occupée dans le fichier.

Bonjour,
Ou bien de passer par les jours Julien.

en fait la RTCLib, outre la classe DateTime fournit une autre classe, la classe TimeSpan et implémente directement les additions et soustractions

  DateTime operator+(const TimeSpan &span);
  DateTime operator-(const TimeSpan &span);
  TimeSpan operator-(const DateTime &right);

donc vous pouvez faire

DateTime t1 = rtc.now();
    ....
DateTime t2 = rtc.now();

TimeSpan delta = t2 - t1;

vous pouvez ensuite demander à la variable delta différentes choses

  int16_t days();        // Number of days in the TimeSpan
  int8_t hours()         // Number of hours in the TimeSpan , 
  int8_t minutes()       // Number of minutes in the TimeSpan (not the total minutes)
  int8_t seconds()       // Number of seconds in the TimeSpan
  int32_t totalseconds() // Total number of seconds in the TimeSpan 

Merci pour les infos, juste que je ne sais où mettre t1, t2, delta
la structure du croquis :

loop()
int dormir = digitalRead(bpdormir); // test bp1
if ( dormir == 0
{ fonction bp1);
pour ecrire sur la sd la date/h/m où je "m'endors"
admettons que je j'ajoute DateTime t1 = rtc.now();
comment je sors t1 de la fonction ?

idem dans la fonction bp2 appelée quand j'appuie sur bp2
DateTime t2 = rtc.now();
puisque je ferai :

    uint32_t diff = t2.unixtime() - t1.unixtime();
    uint32_t diffMinutes = diff / 60;

dans le loop, qu'il faudra réécrire sur la sd en rouvrant le fichier
genre
Logfile = SD.open("sleep.txt", FILE_WRITE);
Logfile.print("j'ai dormi durant : ");
Logfile.print(diffMinutes);
Logfile.print(" minutes");
au lieu de faire Logfile.close() dans les fonctions je fais Logfile.flush() , çà écrit mais ne ferme pas le fichier quand je sors de la fonction ?

Merci pour tout

:warning: éditez votre post et mettez les balises de code

lire les recommandations listées dans « Les bonnes pratiques du Forum Francophone”

En la retournant, tout simplement :

DateTime bp1(void)
{
  DateTime now = rtc.now();
  ///...
  return now;
}
// idem pour bp2
// Dans loop() : 
    DateTime t1 = bp1();
    // ...
    DateTime t2 = bp2();
    uint32_t diff = t2.unixtime() - t1.unixtime();
    uint32_t diffMinutes = diff / 60;
    // ou :
    TimeSpan delta = t2 - t1;
    uint32_t diff = delta.totalseconds();
    uint32_t diffMinutes = diff / 60;

bonjour,

en utilisant unixtime c plus pratique en effet

// fonctions reveil et sommeil


unsigned long reveil()  {
  // ecriture
  DateTime now = rtc.now(); // Clock call
  //now = rtc.now();  // quelle heure est-il?
  H_debout = now.unixtime(); // en secondes
  //H_debout = H_debout/10; // H_debout s incremente de 1 a chaque minute : a verifier

  Logfile = SD.open("sleep.txt", FILE_WRITE);
  Logfile.println();
  Logfile.print(daysOfTheWeek[now.dayOfTheWeek()]);
  Logfile.print("   ");
  print2SD(now.day());
  Logfile.print("/");
  print2SD(now.month());
  Logfile.print("/");
  Logfile.print(now.year(), DEC);
  Logfile.print("; ");  // separateur excel
  print2SD(now.hour());
  Logfile.print(":");
  print2SD(now.minute());
  Logfile.print(":");
  
  // secondes a decommenter pour autres applications plus rapides
  /*Logfile.print(":");
  print2SD(now.second());
   * 
   */
  Logfile.println(" : JE SUIS DEBOUT ");
  Logfile.close();  // sauvegarde sd
  return (H_debout);
}

//fonction format 00
void print2SD(int value) {
  if (value >= 0 && value < 10) {
    Logfile.print("0");
  }
  Logfile.print(value, DEC);
}

void loop() {
  // a mettre dans les fonctions ?
  //DateTime now = rtc.now(); // Clock call
  //now = rtc.now();  // quelle heure est-il?
  // ?

  int dormir = digitalRead(bpdormir);  // appui bpdormir
  if ( dormir == 0 && lastdebout == 1) // condition initiale
  {
    lastdebout = 0; // je ne peux plus retourner dans le if
    // il faudra que j'aille dans le suivant
    // autant utiliser un while ????
    Serial.print(F(" DEBUT du sommeil "));
    Serial.println(F("je dors"));
    //Serial.println(H_debout);
    digitalWrite(ldr, 1);
    delay(100);// inutile juste par sécurité
    H_sommeil = sommeil(); // ok ecrit sur sd et retourne H_sommeil
    // Serial.println(H_sommeil);
    // delay led allumée : supprimer ces 2 lignes et la led
    // reste allumée tant qu'on dors
    delay(2000);
    digitalWrite(ldr, 0);

    // faire un if hdebout=0 hdebout= now.unixtime(); ?
    // c'est juste pour empecher au reset que le premier appui "je dors" il enregistre
    // j'ai été debout pendant xxxx ?
    //
    diff_Minutes = (H_sommeil - H_debout)/60; // au départ H_debout = 0
    Serial.print("j'ai ete debout pendant  ");
    Serial.print(diff_Minutes);
    Serial.println("   minutes ");
    heur = diff_Minutes / 60;
    minut = diff_Minutes % 60;
    //ecriture sd
    Logfile = SD.open("sleep.txt", FILE_WRITE); // on reouvre le fichier
    Logfile.print("j'ai ete debout pendant  ");
    Logfile.print(diff_Minutes);
    Logfile.println("   minutes ");
    Logfile.print(" soit : "); Logfile.print(heur); Logfile.print(" heures et "); Logfile.print(minut);
    Logfile.println(" minutes ");
    Logfile.close();

    //  mettre une interuuption ici déclenchée par appui sur bouton debout ?
  }

  // bouton debout
  int debout = digitalRead(bpdebout);
  if ( debout == 0 && lastdebout == 0)// si je n'ai pas été dans la boucle
    // if qui precéde lastdebout est à 1 donc l'appui est sans effet
  {
    lastdebout = 1; // je pourrai retourner dans le if dormir

    Serial.println(F("FIN du sommeil, il est temps de se lever"));
    // le serial print sert pour les tests
    digitalWrite(ldv, 1);
    delay(200);
    H_debout = reveil();  // ok retourne H_debout et ecrit sd

    diff_Minutes = (H_debout - H_sommeil)/60; //  le dénominateur pour convertir en minutes ? 60
    // les var H_xxx sont unixtime en secondes
    // pour le test pas de diviseur
    Serial.print("j'ai dormi durant : ");
    Serial.print(diff_Minutes);
    Serial.println("   minutes "); // on convertira en heures minutes pour l'affichage
    heur = diff_Minutes / 60;
    minut = diff_Minutes % 60;
    // la partie suivante pourrait aller dans la fonction reveil ?
    // en y ajoutant le cacul diff_Minutes, sauf que je ne vois pas comment H_sommeil arrivera
    // dans la fonction reveil ?
    Logfile = SD.open("sleep.txt", FILE_WRITE); // on reouvre le fichier
    Logfile.print("j'ai dormi pendant : ");
    Logfile.print(diff_Minutes);
    Logfile.println("   minutes ");
    Logfile.print(" soit : "); Logfile.print(heur); Logfile.print(" heures et : "); Logfile.print(minut);
    Logfile.println(" minutes ");
    Logfile.close();

    delay(2000);
    digitalWrite(ldv, 0);
  }


}  // end loop

il y a certainement plus simple comme écriture, j'ai 2 contraintes à modifier :
au premier appui "bpdormir" : çà écrit la diff_minut comme expliqué en commentaire
idem en cas de reset panne alim
-remplacer les 2 bp par un seul qui alternera les 2 fonctions

Merci pour m'avoir "aiguiller"