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é
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.
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 :
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 ?
// 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