Bonjour !
Vieux serpent de mer.
Pourtant, en fouinant sur le web et après avoir testé 6 codes différents, je n'ai trouvé (mal cherché...) aucun code pour Arduino réellement fonctionnel.
Celui-ci par exemple, repris dans le test ci-après, aussi évolué qu'il paraisse, est également faux.
Sauf erreur de ma part, ce code ne fonctionne pas pour le jour du passage été -> hiver (fin octobre). Il donne, par exemple, le 27 octobre 2024 comme étant un jour "Eté", alors qu'il vient de passer en jour "Hiver".
Par contre, le passage "hiver -> été" fonctionne correctement.
En convertissant le code original, cette fois sans la prise de l'heure depuis la RTC, il devient :
// Source : https://forum.arduino.cc/t/heure-dete-heure-dhiver-automatique-avec-ds1307/196851/94
// Fonctionne pour passage Hiver -> Eté.
// Ne fonctionne pas pour Eté -> hiver (un jour trop tard...).
void setup() {
Serial.begin(9600);
//String result = adjustDstEurope(annee, mois, date);
String result = adjustDstEurope(2024, 3, 30); // Correct.
Serial.print("2024, 3, 30 : "); Serial.println(result);
result = adjustDstEurope(2024, 3, 31); // Correct.
Serial.print("2024, 3, 31 : "); Serial.println(result);
result = adjustDstEurope(2024, 10, 26); // Correct.
Serial.print("2024, 10, 26 : "); Serial.println(result);
result = adjustDstEurope(2024, 10, 27); // ****** FAUX ******************.
Serial.print("2024, 10, 27 : "); Serial.println(result);
result = adjustDstEurope(2024, 10, 28); // Correct.
Serial.print("2024, 10, 28 : "); Serial.println(result);
}
void loop() { }
// Le code original modifié uniquement dans les 2 'return'.
// Les lignes commentées sont les lignes originales.
String adjustDstEurope(int year, int month, int day){
//int adjustDstEurope(int year, int month, int day){
/*
With: y = year.
European Economic Community:
Begin DST: Sunday March (31 - (5*y/4 + 4) mod 7) at 1h U.T.
End DST: Sunday October (31 - (5*y/4 + 1) mod 7) at 1h U.T.
Since 1996, valid through 2099
(Equations by Wei-Hwa Huang (US), and Robert H. van Gent (EC))
Adjustig Time with DST Europe/France/Paris: UTC+1h in winter, UTC+2h in summer
*/
int beginDSTDate= (31 - (5* year/4 + 4) % 7); // last sunday of march
int beginDSTMonth=3;
int endDSTDate= (31 - (5 * year /4 + 1) % 7); // last sunday of october
int endDSTMonth=10;
// DST is valid as:
if (((month > beginDSTMonth) && (month < endDSTMonth))
|| ((month == beginDSTMonth) && (day >= beginDSTDate))
|| ((month == endDSTMonth) && (day <= endDSTDate)))
//return 7200; // DST europe = utc +2 hour (summer time)
return "Eté";
//else return 3600; // nonDST europe = utc +1 hour (winter time)
else return "Hiver";
}
Il retourne (le contenu des parenthèses a été ajouté manuellement) :
2024, 3, 30 : Hiver (correct)
2024, 3, 31 : Eté (correct)
2024, 10, 26 : Eté (correct)
2024, 10, 27 : Eté (FAUX)
2024, 10, 28 : Hiver (correct)
Disposez-vous d'un code fonctionnel ?
Merci pour votre aide.