Juste ce week-end Europe a commencé à l’heure d’été. Vous avez tous dû réinitialiser vos horloges, mais qu’en est-il de votre microcontrôleur ? De nombreux programmes sur l’arduino et autres microcontrôleurs garder l’heure et faire qu’avec l’un des CCF populaire puces comme le DS1307 ou le DS3231. Ils gardent le temps très bien (mais je préfère le DS3231) et un appareil de levage des bibliothèques sont disponibles pour eux. Une chose, qu'ils ne le font pas est de basculer automatiquement entre l’heure normale et l’heure d’été (DST). Évidemment, cela serait assez difficile car il sont a des conditions différentes de DST partout dans le monde
On pourrait bien sûr réinitialiser la puce CCF manuellement deux fois par an, mais c’est fastidieux, surtout si il peut être facilement résolu avec quelques lignes de code.
Différentes parties du monde ont des règles différentes pour quand l’heure d’été a lieu et de nombreux pays n’ont bien sûr aucune heure : elle n’a de sens (voire pas du tout) de le faire entre les tropiques et les cercles arctiques, donc en fait entre le tropique du Cancer et le cercle polaire Arctique et le tropique du Capricorne et le cercle Antarctique.
En Australie , heure d’été est une question des États et des territoires, mais en général les daylight Savings time is entre le premier dimanche d’octobre et le premier dimanche d’avril (Rappelez-vous, c’est selon)
Au Canada , qu'elle dépend largement de là où vous vivez, certains États suivent aux États-Unis. Fr de Newfoundland Nunavut ont leur propre règle et beaucoup des territoires nordiques n’ont pas d’heure d’été
Les USA a heure du 2ème dimanche de mars au premier dimanche de novembre.
L' EU a bien sûr une ligne directrice sur ce qui détermine l’heure d’été pour démarrer sur le dernier dimanche de mars et à la fin le dernier dimanche d’octobre. Dans l’Union européenne, l’heure de passer est à 01:00 UTC. Dans la pratique le temps UTC est égale à l’heure GMT (Greenwich Mean Time). UTC, lui-même n’est pas une abréviation mais un compromis entre l’abréviation Français « TUC » et les anglais "CUT" (Temps Universel Coordonné REEE temps universel coordonné).
Traiteur pour votre programme d’épargne locales de lumière du jour est généralement assez facile : laissez votre programme vérifier le mois correct et ensuite compter le nombre de dimanches (la différence est généralement le dimanche). Lorsque vous êtes arrivé à la nécessaire dimanche vérifier l’heure et si c’est à dire de 02:00, avance l’horloge à l’heure (= mettre à 3) si la DST doit lancer, ou attendre jusqu'à 03:00, puis réinitialiser les heures d’horloge à '2'. Évidemment, vous devrez également définir un indicateur pour faire la correction de l’horloge qu’une seule fois.
Assez simple... Sauf si vous habitez dans l’Union européenne (ou au Nunavut). Dans l’Union européenne, l’interrupteur n’est pas fait à la première, deuxième, troisième ou quatrième dimanche en mars et octobre, mais au dernier dimanche du mois.
Eh bien, un mois a quatre dimanches de droite ? Mal. Si par exemple octobre commence le vendredi, samedi ou dimanche, il a 5 dimanches. Alors que faire ? Eh bien vous pouvez bien sûr déterminer si le premier jour commence le vendredi, samedi ou dimanche et dans l’affirmative, compter jusqu'à 5 et sinon compter jusqu'à 4. Mais il existe un moyen plus simple, dans lequel vous n’avez même compter.
Permet de mettre cela dans un programme pour l’Europe occidentale, ce qui signifie que les temps de commutation sont 2 et 03:00 (c’est à 01:00 UTC)
Nous allons accepter que vous avez un CCF qui gardera le « jour de la semaine » (comme le DS1307 et le DS3231). Comme ces valeurs sont définies vous permet d’accord que vous avez défini le jour de la semaine tel que lundi est le jour 1 et le dimanche est jour 7. Certaines personnes aiment à commencer la semaine le dimanche, mais c’est juste une question de goût. En tout cas, nous avons les variables suivantes Lire nos CCF
Dow = jour de la semaine (comme 1-7)
Mo = mois
d = jour (comme 1-31)
h = heure
DST est un indicateur nous définissons au démarrage de DST et que nous clairement à la fin de la DST pour éviter que le programme commence à corriger l’heure pendant une heure et même faire une boucle infinie lorsque nous régler l’horloge dès octobre a 31 jours, nous savons que le dernier dimanche toujours tombera du 25 au 31 jusqu'à notre arrivée à la fin du jour sauver sera comme suit :
if (dow == 7 && mo == 10 && d >= 25 && h == 3 && DST==1)
{
setclockto 2 am;
DST=0;//store this in your NVRAM
}
Comme vous pouvez utiliser la commande différentes bibliothèques ' setclockto 02:00 ' est juste un espace réservé pour votre routine spécifique pour définir votre CCF à 02:00. Je vous conseille de stocker l’indicateur DST quelque part dans la mémoire non volatile, au cas où vous devriez débrancher votre arduino. Le DS1307 a quelques-unes sur puce de RAM Non Volatile où vous pouvez le stocker, le DS3231 ne fonctionne pas. Les deux viennent toutefois généralement comme un module avec une EEPROM sur elle même, autrement que l’EEPROM de l’Arduino peut être utilisé.
En tout cas permet de faire une vérification si nous avons la bonne routine : Supposons que le 1 octobre est un dimanche. Cela signifie que le 25 est un mercredi et la 29e dimanche (dimanche dernier et 5e), alors la routine sera en effet activée le 29 que toutes les conditions sont réunies. Supposons qu’octobre commence le lundi. Cela signifie qu’il n’y a que 4 dimanches et le dernier dimanche tombera le 28. Encore une fois, c’est entre 25 et 31 ainsi que la condition est remplie. Supposons que le premier octobre tombe un jeudi, puis le 25 est un dimanche (le quatrième dimanche) et le 31 sera un samedi, donc encore une fois la condition sera remplie de la dernière (et dans ce cas 4e dimanche).
Pour summertime/daylightsaving heure de début sur le dernier dimanche de mars revient mutatis mutandis :
if (dow == 7 && mo == 3 && d >= 25 && h ==2 && DST==0)
{
setclockto 3 am;
DST=1; //store this in your NVRAM
}
Mars a aussi 31 jours donc les calculs sont les mêmes. Cette fois, bien que nous vérifions à 2 am et un indicateur DST reset puis régler l’horloge à 3 suis et définir l’indicateur DST pour indiquer que c’est déjà fait.
Maintenant si vous n’utilisez pas un CCF qui maintient le jour de la semaine ou si vous gardez une trace de heure et la date d’une autre manière qu’avec un CCF, alors il y a une formule simple pour déterminer le jour de la semaine à compter de la date avec l’algorithme de Sakamoto
//gives day of week for a given date Sunday=0, Saturday=6
int dow(int y, int m, int d)
{ static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
y -= m < 3; return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7; }
esprit que vous cependant que cette routine compte de 0 (dimanche) à 6 (samedi)
J’ai été informé que l’Avr-libc a time.h avec le soutien de la DST mais non seulement vous avez à dire à la bibliothèque à utiliser DST mais vous devez aussi inclure un fichier utilitaire assez vaste, selon que vous êtes en Europe ou aux USA. J’ose dire que mon code est sensiblement plus court.