Soit un montage (toujours mes volets mais peu importe en fait) avec un ESP32, un DS3231, synchroNTP du DS3231 au setup() (et périodiquement - mais ce n'est pas encore codé). Il est destiné à fonctionner longtemps de façon autonome (plusieurs semaines-mois...)
Je cherche à exécuter certains tâches toutes les minutes (pour le moment) mais aussi d'autres toutes les heures ou à certains moments de la journée (par exemple à 03h42 ou je ne sais quoi - mais ça ce n'est pas encore prêt)
Pour le moment je suis parti sur une structure classique du loop() :
void loop() {
currentMillis = millis();
// boucle des minutes
if ((unsigned long)(currentMillis - previousMillisMinute) >= 60000) {
previousMillisMinute = currentMillis;
// Action à exécuter toutes les minutes
Serial.println("Une MINUTE s'est écoulée !");
}
// boucle des heures
if ((unsigned long)(currentMillis - previousMillisHeure) >= 3600000) {
previousMillisHeure = currentMillis;
// Action à exécuter toutes les heures
Serial.println("Une HEURE s'est écoulée !");
}
unTrucAChaqueTour();
}
Ça marche mais...
Si l'ESP32 a été démarré à 18h 34min et 42s les différentes actions auront lieu à 42s de chaque minute et à 34min 42s de chaque heure.
Ce que je souhaite c'est que les actions aient lieu 0 s (ou à peu près) de chaque minutes. C'est moins gênant pour les heures, je peux éventuellement garder le test sur millis
Ma première question : intuitivement je me dis que ce n'est pas une bonne idée de faire
DateTime now = rtc.now();
uint8_t secondeRTC = now.second();
pour ensuite tester si secondeRTC est repassé à 0 :
- l'ESP32 va passer son temps à communiquer avec le DS3231
- lors d'une synchro NTP il se peut très bien que l'on passe de 59s à 1s sans passer par 0.
Est-ce que ma réflexion est correcte ?
Alternative : utiliser l'horloge interne et un code du genre (pas testé)
struct tm tmNow = *localtime(&t);
int seconde = tmNow.tm_second;
et pareil, tester le passage à 0 de seconde
Sauf que, si je ne me trompe pas, l'horloge interne dérive plus vite que le RTC et pareil qu'avant, il est tout à fait possible, lors d'une resynchronisation, de louper un "0 s"
Donc question 2 : quelle est la manière propre et académique pour faire ce genre de choses ?
MErci d'avoir lu jusque là ![]()
