Tu n'expliques pas comment tu te rend compte que ton RTC ne compte plus le temps.
Si tu utilises le programme dont tu mets le listing, après l'avoir lancé une fois, il faut lettre en commentaire la ligne "rtc.adjust(DateTime(F(_DATE_), F(_TIME_)));" sinon la date heure va être réinitiallisée à chaque lancement du programme.
Je peut laisser tourner le programme pendant des heures, rien ne change.
De plus, concernant la ligne "rtc.adjust(DateTime(F(_DATE_), F(_TIME_)));" c'est dans le setup, donc je dois pouvoir la laisser. Mais je l'ai mise après également en commentaire.
Non, cette ligne ne s'utilise qu'en cas de déconnexion de la batterie pour mettre une fois, l'horloge à l'heure.
A la compilation, avec cette ligne, la date et l'heure de cette dernière est "gravée" dans l'Arduino et est reprise à chaque démarrage. C'est pourquoi il faut télécharger et lancer le programme avec cette ligne pour la mise à l'heure, mettre cette ligne en remarque, puis retélécharger le programme.
Pour ton programme, modifies la façon de démarrer ta RTC, à la place de: rtc.begin();
mets:
if (!rtc.begin()) {
Serial.println("RTC non trouve !");
while (1);
}
D'après la datasheet, après une perte d'alimentation de sauvegarde la RTC se réinitialise à OFF.
On peut vérifier si le DS1307 tourne avec la méthode isrunning().
Si la valeur retournée est false il faut mettre à 1 le poids fort du registre 0 de la RTC.
Je pense que le plus simple serait de faire la modification suivante dans la librairie
fichier RTC_DS1307.cpp
/**************************************************************************/
/*!
@brief Set the date and time in the DS1307
@param dt DateTime object containing the desired date/time
*/
/**************************************************************************/
void RTC_DS1307::adjust(const DateTime &dt) {
uint8_t buffer[8] = {0,
// bin2bcd(dt.second()),
0x7F & bin2bcd(dt.second()), // active RTC
bin2bcd(dt.minute()),
bin2bcd(dt.hour()),
0,
bin2bcd(dt.day()),
bin2bcd(dt.month()),
bin2bcd(dt.year() - 2000U)};
i2c_dev->write(buffer, 8);
}
On pourrait aussi faire une méthode pour activer/désactiver la RTC, mais il n'est pas illogique de forcer la démarrage lorsqu'on met la RTC à l'heure
EDIT: correction de la ligne contenant les secondes pour forcer le MSB à 0.
Que je comprenne bien, j'ai copié le code que vous m'avez donné dans la bibliothèque:
void RTC_DS1307::adjust(const DateTime &dt) {
uint8_t buffer[8] = {0,
// bin2bcd(dt.second()),
DS1307_ON | bin2bcd(dt.second()), // active RTC
bin2bcd(dt.minute()),
bin2bcd(dt.hour()),
0,
bin2bcd(dt.day()),
bin2bcd(dt.month()),
bin2bcd(dt.year() - 2000U)};
i2c_dev->write(buffer, 8);
}
Ensuite j'ai programmé avec sans adjust Et il ne sais rien passé de plus.
Mais peut être que je n'ai pas bien compris.
Merci d'avance