Heure d'été / heure d'hiver automatique avec DS1307

Bonjour à tous,

Je me demandais si par hasard on ne pourrait pas paramétrer un changement d'heure Hiver/Eté automatiquement.

Lors du dernier passage à l'heure d'hiver j'ai du déconnecter mes modules pour effectuer le changement d'heure.

A votre avis est-ce que c'est possible de faire un changement d'heure automatiquement sans faire de reset à la carte et sans brancher l'ordi ?

gunsman76:
Bonjour à tous,

Je me demandais si par hasard on ne pourrait pas paramétrer un changement d'heure Hiver/Eté automatiquement.

Lors du dernier passage à l'heure d'hiver j'ai du déconnecter mes modules pour effectuer le changement d'heure.

A votre avis est-ce que c'est possible de faire un changement d'heure automatiquement sans faire de reset à la carte et sans brancher l'ordi ?

bonsoir
Sur le papier c'est assez simple :
detetcter le dernier dimanche de mars et octobre et agir selon le cas à 2H00 ou 3H00 (si on est puriste) pour avancer ou reculer d'une heure et reecrire les registres du DS1307

La solution d'Artouste est sans doute la première à venir à l'esprit, mais comme le laisse supposer son expression « sur le papier c'est assez simple », elle comporte de nombreuses chausse-trapes qui ne sont pas toujours faciles à éviter.

Par exemple lors du passage à l'heure d'hiver il sera deux fois de suite 3 heure du matin, donc pour éviter d'entrer dans une boucle infinie qui ferait reculer d'une heure à chaque fois qu'il est 3 heure, il faut que le microcontrôlleur se souvienne qu'il a déjà fait la manœuvre.

Mais il est aussi possible que (comme pas hasard :grin:) le microcontrôlleur ne soit pas allumé au moment du changement d'heure (maintenance, panne d'électricité, etc.). Il est donc nécessaire que lorsqu'il se réveille, par exemple deux jours plus tard, il soit capable de se dire « ah bah zut, on est passé en période d'hiver mais je vois dans mon EEPROM que le flag passage_heure_hiver_2013 n'est pas à 1, je m'en vais régler cet oubli sans attendre un seul cycle de plus ».

Ce qui fait qu'a chaque fois que tu va lire le contenu de la RTC, tu es obligé de faire un petit calcul pour savoir si tu est en période d'été/hiver et d'aller vérifier quelque part le contenu d'une variable. J'abrège parce que sinon ça va être trop long, mais il y a encore bien d'autres cas à traiter qui pourraient faire que ça parte en sucette.

Du coup, puisqu'on en est arrivé à la conclusion qu'à chaque lecture de la RTC il est nécessaire de faire un traitement pour vérifier leur validité, la solution « à l'épreuve des balles » et qui est presque toujours utilisée, est de renverser le problème : ne pas stocker dans la DS1307 l'heure civile locale, mais l'heure UTC. Ensuite, a chaque lecture tu vérifie simplement si l'heure/date renvoyée correspond à l'hiver, auquel cas tu ajoutes 1 heure, et sinon tu en ajoute 2. Ça fonctionne à tous les coups.

En effet l'UTC présente l'avantage d'avancer de manière continue et homogène*, toujours dans le même sens, contrairement à cette garce d'heure civile qui s'amuse à faire des bonds en avant ou en arrière.

Voilà, en espérant avoir été clair (j'ai comme un doute en fait)...

  • ceci ne tient pas compte des secondes intercalaires, mais celles-ci sont ajoutées de manière imprévisibles et ne peuvent donc pas être « programmées »

haifger:
La solution d'Artouste est sans doute la première à venir à l'esprit, mais comme le laisse supposer son expression « sur le papier c'est assez simple », elle comporte de nombreuses chausse-trapes qui ne sont pas toujours faciles à éviter.

...

Du coup, puisqu'on en est arrivé à la conclusion qu'à chaque lecture de la RTC il est nécessaire de faire un traitement pour vérifier leur validité, la solution « à l'épreuve des balles » et qui est presque toujours utilisée, est de renverser le problème : ne pas stocker dans la DS1307 l'heure civile locale, mais l'heure UTC. Ensuite, a chaque lecture tu vérifie simplement si l'heure/date renvoyée correspond à l'hiver, auquel cas tu ajoutes 1 heure, et sinon tu en ajoute 2. Ça fonctionne à tous les coups.

En effet l'UTC présente l'avantage d'avancer de manière continue et homogène*, toujours dans le même sens, contrairement à cette garce d'heure civile qui s'amuse à faire des bonds en avant ou en arrière.

Voilà, en espérant avoir été clair (j'ai comme un doute en fait)...

  • ceci ne tient pas compte des secondes intercalaires, mais celles-ci sont ajoutées de manière imprévisibles et ne peuvent donc pas être « programmées »

la quantité de conditions pour determiner si l'on est "en été" ou "en hiver" etant la meme :grin:
ton approche est meilleure dans la mesure où elle ne necessite déjà pas de reecriture de registre

et pour le secondes intercalaires avec un DS1307 , je pense que gunsman76 va rapidement oublier 8)

Bonsoir,
Il y a plus simple, faite faire le travail par un autre. :smiley:
Il existe le dcf77 et il a les lib qui vont bien.
@+

Oui j'ai un DCF77 dans le tiroir...

Mais j'ai cherché toute la journée un tuto qui tient la route, j'ai pas grand chose de concret.

Quel lib utiliser ?

Bonsoir,

gunsman76:
Oui j'ai un DCF77 dans le tiroir...
Mais j'ai cherché toute la journée un tuto qui tient la route, j'ai pas grand chose de concret.
Quel lib utiliser ?

Je n'ai pas sous la main, je te transmets les liens demain.
@+

Merci !

D'ailleurs je trouve assez bizarre que personne ne se soit pencher sur ce module, le nombre d'utilisateur de DS1307 est important et en France on change d'heure 2 fois par an.

Tout le monde connecte son arduino 2 fois par an pour le remettre à l'heure.

Je suis étonné.

Cela dit, j'espère que ma question aidera plus d'une personne.

gunsman76:
Merci !

D'ailleurs je trouve assez bizarre que personne ne se soit pencher sur ce module, le nombre d'utilisateur de DS1307 est important et en France on change d'heure 2 fois par an.

Tout le monde connecte son arduino 2 fois par an pour le remettre à l'heure.

Je suis étonné.

Cela dit, j'espère que ma question aidera plus d'une personne.

pragmatiquement et compte tenu de la derive des DS1307 (discuté sur le forum , a retrouver demain)
faire une remise à l'heure reguliere n'est pas un luxe.

apres si tu veux de l'horodatage plutot precis
il faut effectivement voir ailleurs

DCF77 (si sur zone de couverture)
NNTP (si reseau)
GPS (si reception)
BdT et serveur de temps qualifié OxxO ,Rubidium, Cesium (mais bon, là ça commence à chiffer lourd :grin: )

Le DCF77 serait la meilleure des solutions !

gunsman76:
Le DCF77 serait la meilleure des solutions !

Icare va te trouver le bon tuto

Je dois dire que franchement j'espère car vu le nombre de tuto que j'ai regardé aujourd'hui... je commence a désespéré un peu.

Une petite question, on peut gérer l'heure avec le DCF77 seul ou il faut le DS1307 couplé au DCF77 ?

Bonsoir,

gunsman76:
Une petite question, on peut gérer l'heure avec le DCF77 seul ou il faut le DS1307 couplé au DCF77 ?

Oui, on peut gérer l'heure uniquement avec le DCF77 mais dans ce cas ta carte Arduino ne fera que ça (ce qui n'est pas forcément ce que tu veux faire). Le rythme de la seconde est donnée par la réception des signaux + la reconstitution de la 59 sec manquante.
Mais utiliser un circuit horloge et faire une mise à jour journalière mini (voir plus suivant les besoins) donne de très bons résultats.
@+

Ok, alors oui je n'ai besoin que d'une mise à jour une fois par semaine, histoire de voir l'heure d'été/hiver passer. Donc une mise à jour chaque dimanche ça irai largement.

Re,

gunsman76:
Ok, alors oui je n'ai besoin que d'une mise à jour une fois par semaine, histoire de voir l'heure d'été/hiver passer. Donc une mise à jour chaque dimanche ça irai largement.

Il faut peut être faire 2 mises à jour le dimanche, histoire de détecter les deux cas de changement d'heure (+ 1 heure et - 1 heure).
Tu dis été/hiver mais il y aussi hiver/été :smiley:
@+

http://playground.arduino.cc/Code/DCF77

Si on test à 4h30 ? le décalage d'heure aura déjà été fait, donc il suffit de synchronisé l'heure courante ?

68tjs:
Arduino Playground - HomePage

Merci,

Il me reste a connecter mon DCF77, je fais ça demain matin (là je suis k.o)

Mais si je le compile, j'ai une erreur, je pense que c'est le fait que le DCF77 ne soit pas branché.

Artouste:
la quantité de conditions pour determiner si l'on est "en été" ou "en hiver" etant la meme :grin:
ton approche est meilleure dans la mesure où elle ne necessite déjà pas de reecriture de registre

Oui, c'est là que je voulais en venir, mais ma cervelle était trop embrouillée hier soir pour que je parvienne à l'expliquer clairement :slight_smile:

gunsman76:
Ok, alors oui je n'ai besoin que d'une mise à jour une fois par semaine, histoire de voir l'heure d'été/hiver passer. Donc une mise à jour chaque dimanche ça irai largement.

J'insiste (au risque de passer pour un gros lourdingue) pour dire qu'il est plus simple et surtout moins source d'erreur de stocker dans la RTC l'heure UTC pour ensuite retrouver l'heure légale à partir des données renvoyées plutôt que le contraire. Si de plus tu ajoute la DCF77, tu pourra non seulement re-synchroniser ton horloge régulièrement mais en plus savoir quel est le delta UTC/heure légale sans avoir le faire calculer par le micro (il y a un bit pour ça dans le signal DCF77).

gunsman76:
Mais si je le compile, j'ai une erreur, je pense que c'est le fait que le DCF77 ne soit pas branché.

Non, le fait que le module ne soit pas branché ne peut pas causer d'erreur de compilation.

Bonjour,
J'utilise un DS1307 avec un récepteur DCF77 et la librairie décrite ici: Réception de l'heure DCF77 sur Arduino - iDreamMicro
J'active la mise à l'heure par le DCF77 toutes les nuits entre 2h et 3h du matin (sur la période de changement d'heure en fait).
Ca fonctionne depuis un an sans soucis.