Go Down

Topic: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver (Read 1 time) previous topic - next topic

bricoleau

Bonjour

Petite librairie facile d'utilisation, pour ceux qui ont du remettre à l'heure leur DS1307 ou leur DS3231 le week end dernier  :D

La gestion des heures d'été / hiver est intégrée à la librairie, et calée sur l'heure de France Métropolitaine.
Les changements d'heure sont automatiques.

De surcroît, la librairie facilite la mise à jour par protocole NTP ou par protocole DCF77.

Voir aussi les exemples fournis

Header
Code: [Select]
class simpleRTC
{
  public :
    //Principales méthodes d'accès au circuit externe
    //Retournent true si accès ok, false sinon

    bool actualiser();
         //Actualisation des variables privées par lecture du circuit externe.
         //Idéalement : à exécuter une fois par seconde

    bool regler(uint8_t annee, uint8_t mois, uint8_t jour, uint8_t heure, uint8_t minute, uint8_t seconde);
         //Mise à jour à partir de valeurs date heure locales

    //Méthodes constantes pour consultation de l'horloge
    uint8_t annee() const       {return this->_annee;}
    uint8_t mois() const        {return this->_mois;}
    uint8_t jour() const        {return this->_jour;}
    uint8_t jourSemaine() const {return this->_joursem;} //0 dimanche, 1 lundi, 2 mardi, ...
    uint8_t heure() const       {return this->_heure;}
    uint8_t minute() const      {return this->_minute;}
    uint8_t seconde() const     {return this->_seconde;}

    bool heureEte() const       {return this->_ete;} //Permet de savoir si on est en heures d'été ou d'hiver


    //Méthodes secondaires
    //Retournent true si accès ok, false sinon

    bool reglerUTC(uint8_t annee, uint8_t mois, uint8_t jour, uint8_t heure, uint8_t minute, uint8_t seconde);
         //Mise à jour à partir de valeurs date heure UTC

    bool reglerNTP(uint32_t temps_unix);
         //Mise à jour dans le cadre d'une synchro NTP (secondes écoulées depuis le 01/01/1970 00:00:00 UTC)

    bool reglerDCF77(uint8_t annee, uint8_t mois, uint8_t jour, uint8_t heure, uint8_t minute, bool ete);
         //Mise à jour dans le cadre d'une synchro DCF77 (signal radio heure locale + indic heure d'été)

    uint8_t anneeUTC() const {return this->_anneeUTC;}
    uint8_t moisUTC() const  {return this->_moisUTC;}
    uint8_t jourUTC() const  {return this->_jourUTC;}
    uint8_t heureUTC() const {return this->_heureUTC;}

  private :
    void    _memoriser(uint8_t annee, uint8_t mois, uint8_t jour, uint8_t heure);
    uint8_t _annee, _mois, _jour, _joursem, _heure, _minute, _seconde;
    uint8_t _anneeUTC, _moisUTC, _jourUTC, _heureUTC;
    bool    _ete;
};

BrUnO14200

Bien joué , moi j'ai fait le feignant et juste un " temps.hour() = temps.hour() + 1 ; :D
Mes montages d'Arduino : http://nonoduino.blogspot.fr/

rjnc38

trop fort Bricoleau !!!

le décorticage de la date NTP m'a pris 150 lignes de code (et beaucoup d'aspirine), la ou toi tu le fais en 20 lignes

chapeau bas

kamill

Bonjour Bricoleau,

Beau travail, mais j'ai une petite question: Y a t'il une raison pour que tu utilises le pointeur this? Car
Code: [Select]
    uint8_t annee() const       {return this->_annee;}
et
Code: [Select]
   uint8_t annee() const       {return _annee;}
sont équivalents

bricoleau

Bonjour,

C'est juste une habitude de coding, pour différencier les propriétés de l'objet par rapport aux autres variables.
A priori cela ne change rien au compilé (enfin j'espère  :P )

Pour les cas très simples, je remonte le corps de la fonction dans le header pour donner au compilo la possibilité de la mettre en inline là où elle est appelée (si je ne trompe pas : le inline est alors implicite, mais c'est le compilo qui décide de son application)

kamill

Effectivement je pense aussi que ça ne change rien au code généré. C'était juste pour savoir la raison de l'utilisation de this.

bricoleau

trop fort Bricoleau !!!

le décorticage de la date NTP m'a pris 150 lignes de code (et beaucoup d'aspirine), la ou toi tu le fais en 20 lignes

chapeau bas

Oups j'avais pas vu

Merci !!!!!

Perso c'est l'optimisation du calcul du jour de la semaine qui m'a fait le plus transpirer ;D
Je ne vois pas comment on pourrait le faire en moins de ticks.

Toutes ces fonctions ont été testées du 01/01/2000 au 31/12/2099 en vérifiant la validité du résultat pour chaque jour.

dfgh


bricoleau

Petit complément : pour maîtriser facilement le délai d'une seconde entre chaque actualisation de l'horloge, je conseille d'utiliser la librairie simpleMinuteur.h

Code: [Select]
#include "simpleRTC.h"
#include "simpleMinuteur.h"

simpleMinuteur synchroRTC(1000);

void setup()
{
  Wire.begin();
  ...
  synchroRTC.demarrer();
  RTC.actualiser();
}

void loop()
{
  if (synchroRTC) RTC.actualiser();
  ...
}


Et à partir de là, il n'y a plus à ce soucier du RTC.
Les dates / heures sont à jour en permanence, et disponibles en consultation par le reste du code.

luckymaxou

Bonjour,
je suis débutant et je me suis pris la tête gravement avec DOW sur la librairie RTClib, sans y arriver.
j'ai trouvé sur les forums plein de solutions beaucoup trop compliquées pour moi.
Avec ta librairie simpleRTC c'est GENIAL.
MERCI BEAUCOUP Bricoleau

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy