Arduino Forum

International => Français => Tutoriels et cours => Topic started by: bricoleau on Apr 02, 2016, 07:53 pm

Title: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: bricoleau on Apr 02, 2016, 07:53 pm
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;
};
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: BrUnO14200 on Apr 03, 2016, 10:44 am
Bien joué , moi j'ai fait le feignant et juste un " temps.hour() = temps.hour() + 1 ; :D
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: rjnc38 on Apr 03, 2016, 11:27 am
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
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: kamill on Apr 03, 2016, 11:43 am
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
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: bricoleau on Apr 03, 2016, 11:59 am
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)
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: kamill on Apr 03, 2016, 12:34 pm
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.
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: bricoleau on Apr 04, 2016, 10:15 am
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.
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: dfgh on Apr 04, 2016, 12:57 pm
 :) merci pour ce travail mis à disposition :)
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: bricoleau on Apr 04, 2016, 02:38 pm
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.
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: luckymaxou on Feb 21, 2017, 09:00 pm
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
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: ppzikos on Dec 22, 2017, 11:24 pm
Bonjour bricoleau , merci beaucoup pour votre travail et pour votre partage.
j'ai trouver un petit bug qui empêche l'exécution du code permettant la mise à jour par Timestamp unix

Dans le fichier simpleRTC.cpp , Fonction: simpleRTC::reglerNTP(uint32_t temps_unix)

à la ligne 262
Code: [Select]
accesOK = this->reglerUTC(annee, mois, (uint8_t)jours, heure, minute, seconde);
corriger par
Code: [Select]
accesOK = this->reglerUTC(annee, mois, jours, heure, minute, seconde);


testé fonctionnel sur ESP32(vroom) avec ds3231 ,arduino 1.8.2

en tous cas un grand merci du fond du cœur pour la lib sur les ephemeride
http://forum.arduino.cc/index.php?topic=275902.0 (http://forum.arduino.cc/index.php?topic=275902.0)
et pour cette lib sur le rtc avec mise à jour timestamp , correction heure ete/hiver et gestion utc+1.

mon projet : une lampe qui s'allume en fonction du lever du soleil pour recréer un climat spécifique.
Merci a vous bricoleau
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: bricoleau on Dec 23, 2017, 12:50 pm
Fichtre !

Une ano dans ma bibliothèque?  ;D

J'ai vérifié et pourtant ça a l'air correct, au moins sur arduino.
Je suspecte une différence de compilo.

Dans la fonction reglerNTP(), la variable jours contient au départ le quantième dans l'année
Sa valeur initiale va de 1 à 366, d'où le fait qu'elle est déclarée en uint16_t

Ensuite, à partir de ce quantième, le programme calcule le mois et le jour dans le mois, de manière très simple :
Code: [Select]
uint8_t mois = 1;
uint8_t duree_mois = _RTCnbJoursMois(annee, mois);
while (jours > duree_mois)
{
  jours -= duree_mois;
  mois++;
  duree_mois = _RTCnbJoursMois(annee, mois);
}

à partir de là, la variable jours a une valeur comprise entre 1 et 31
Mais elle est toujours stockée sur deux octets en uint16_t

Pour la passer en paramètre d'appel de la fonction reglerUTC(), qui attend le jour du mois sur un seul octet en uint8_t, j'ai "casté" le type :
Code: [Select]
accesOK = this->reglerUTC(annee, mois, (uint8_t)jours, heure, minute, seconde);

Je ne vois vraiment pas ce qui pourrait clocher avec ça.

Pour isoler/reproduire le problème et tenter de comprendre ce qui pourrait clocher, je viens de passer ce code sur un arduino :
Code: [Select]
void setup() {
  Serial.begin(115200);
  uint16_t jours = 312;
  while (jours > 256) jours -= 30; //après quoi : jours = 252
  afficher((uint8_t)jours);
  afficher(jours);
}

void afficher(uint8_t jours) {
  Serial.println(jours);
}

void loop(){}


Ca compile, et ça affiche bien deux fois 252 sur le terminal

L'équivalent donnerait quoi sur l'esp32?
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: ppzikos on Dec 23, 2017, 06:22 pm
Sa fonctionne , le serial me répond 2 fois 252.

je vient de re-tester avec la ligne 262=

accesOK = this->reglerUTC(annee, mois, (uint8_t)jours, heure, minute, seconde);

et cette fois ci sa fonctionne impeccable , je doit avoir un bug dans mon IDE.

Hier j'ai fait la manip 2 fois et à chaque fois il fallait que je modifie la ligne 262 pour que sa fonctionne.
Je pense que je devrait réinstaller mon ide a neuf.

En tout cas vous faite vraiment un travail formidable et c'est très plaisant!
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: alaindepicardie on Mar 22, 2018, 10:54 pm
bonjour
Dommage j'ai une 1302  :'(
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: bricoleau on Mar 23, 2018, 11:00 am
Bonjour

Effectivement, les DS1307 et DS3231 utilisent une interface de communication I2C, alors que le DS1302 est en SPI.

Deux options :
1) créer une variante de la bibliothèque simpleRTC qui fonctionne en SPI. Le code sera à 90% similaire.
2) remplacer le DS1302 par un DS3231 qui coûte une misère.
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: alaindepicardie on Mar 23, 2018, 10:45 pm
bonjour
Quote
1) créer une variante de la bibliothèque simpleRTC qui fonctionne en SPI. Le code sera à 90% similaire.
ho, la,la je suis pas au niveau, malheureusement.

Quote
2) remplacer le DS1302 par un DS3231 qui coûte une misère.
surement la plus sage solution.... Mais bon sang j'ai déjà attendu deux mois mes Ardruino (clones).
Enfin j'avoue vos "petites" bibliothèque son tout simplement géniales. Merci de les avoir mis a notre disposition
alain
http://forum.arduino.cc/index.php?topic=398112.0
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: pomme-poire on May 27, 2019, 12:19 pm
Déterrage:

pour avoir commencer avec un ds1302, je suis vite passé au ds3231 car le ds1302 n'est pas précis.
je me demande pourquoi c'est encore vendu. Bon, mon ds1302 n'est pas perdu. j'ai utilisé le support de pile pour remplacer la pile bios bizarre d'un vieux pc compaq .
Achetez le ds3231 et surtout pas le ds1302

Merci pour le code.
 
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: Leptro on May 27, 2019, 02:11 pm
Bonjour,
C'est vrai que le DS3231 est plus précis. Dans les faits,c'est surtout son oscillateur interne qui est précis.
En utilisant le ds1302 avec un oscillateur du type ASH7KW (https://abracon.com/Oscillators/ASH7KW.pdf) qui a une dérive inférieur à 5PPM sur la plage de température 15-30°C,l'horloge aura une dérive de moins de 3mns/An.

* Une revue d'électronique "ELE**** " a traité ce sujet dans la dernière revue parue.
Bonne bidouille.
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: iznobe on Apr 03, 2020, 01:21 am
Salut et merci de partager votre taff  ;D

j ' ai regarder les exemples fournis dans la bibliotheque et en particulier exemple auto et reglage manuel mais bon , ils sont trop fournis je trouve , du coup on perd de vu ce qu on cherche dans le code .

je n' ai pas vraiment trouver ce que je cherche pour le moment .

je voudrais mettre a jour mon RTCDS1307 par un serveur NTP une fois par jour .

alors dans le fichier source j ' ai bien vu cette methode :
Code: [Select]
bool simpleRTC::reglerNTP(uint32_t temps_unix)

mais ca donne l ' impression de faire l' inverse ... ca parait un peu aberant mais bon regler son serveur NTP avec un arduino pourquoi pas apres tout ! a condition d' avoir un serveur NTP ok , bon je sors =>>

je crois que je suis fatigué et que je suis plus en etat  :smiley-mr-green:

je regarderai mieux demain .
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: bricoleau on Apr 03, 2020, 10:55 am
Bonjour

Tu es la toute première personne qui indique que je mets trop d'exemples dans mes lib. D'habitude les retours sont plutôt le contraire.

Pour tes autres remarques, je te laisse remettre les yeux en face des trous.  :)
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: bricoleau on Apr 03, 2020, 12:09 pm
Ce dev un peu vieux, donc je viens de vérifier : les exemples fournis avec la lib sont classés & numérotés & avec un titre qui me semble assez clair.
Ils sont censés montrer les principaux cas d'usage, pas seulement celui qui t'amène ici.

Cette lib ne prend pas en charge la communication NTP : elle gère un DS1307 ou un DS3231.

L'interrogation NTP que tu dois mettre en place dans ton programme, te permet de récupérer l'heure UTC sous forme d'un timestamp Unix, c'est-à-dire un entier long non signé.

C'est cette valeur qu'il faut passer en paramètre d'appel de la méthode ci-dessous et hop ! ton RTC est à la bonne date et heure.

Code: [Select]
    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)
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: lesept on Apr 03, 2020, 03:16 pm
Je me suis permis d'extraire la fonction "heure d'été" pour aider un membres du forum qui voulait juste cette information. Merci Bricoleau !
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: iznobe on Apr 03, 2020, 08:30 pm
Ce dev un peu vieux, donc je viens de vérifier : les exemples fournis avec la lib sont classés & numérotés & avec un titre qui me semble assez clair.
Ils sont censés montrer les principaux cas d'usage, pas seulement celui qui t'amène ici.

Cette lib ne prend pas en charge la communication NTP : elle gère un DS1307 ou un DS3231.

L'interrogation NTP que tu dois mettre en place dans ton programme, te permet de récupérer l'heure UTC sous forme d'un timestamp Unix, c'est-à-dire un entier long non signé.

C'est cette valeur qu'il faut passer en paramètre d'appel de la méthode ci-dessous et hop ! ton RTC est à la bonne date et heure.

Code: [Select]
   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)

Salut ,

et merci beaucoup pour ces infos que je viens de tester dans mon prog , j ' ai une erreur " reglerNTP was not declared in this scope ".

Pourtant il me semble que j' ai fait les choses bien ( enfin pas tant que ca surement ) pourtant a cette heure -ci , j ' y vois encore a peu pres clair  :smiley-lol:

voici ce que j ' ai fait :

ajout des libs :
Code: [Select]
#include <Wire.h>
#include "simpleRTC.h"


ajout dans void setup (); de :
Code: [Select]
Wire.begin();

ensuite dans la fonction du serveur UDP qui recupere le temps unix j ' ai ajouté :
Code: [Select]
reglerNTP(epoch); // met a jour la RTC par le serveur NTP[/code

la fonction complete du serveur UDP a l' air de fonctionner a la vue du moniteur serie qui affiche bien le temps unix , mais dans le doute la voici :
[code]void reglerHeureByNTP () {
 sendNTPpacket(timeServer); // send an NTP packet to a time server
 
 
 // wait to see if a reply is available
 delay (3000);
 if ( Udp.parsePacket() ) {
 // We've received a packet, read the data from it
 Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer

 //the timestamp starts at byte 40 of the received packet and is four bytes,
 // or two words, long. First, esxtract the two words:

 unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
 unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
 // combine the four bytes (two words) into a long integer
 // this is NTP time (seconds since Jan 1 1900):
 unsigned long secsSince1900 = highWord << 16 | lowWord;
 
 Serial.print("Seconds since Jan 1 1900 = " );
 Serial.println(secsSince1900);

 // now convert NTP time into everyday time:
 Serial.print("Unix time = ");
 // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
 const unsigned long seventyYears = 2208988800UL;
 // subtract seventy years:
 unsigned long epoch = secsSince1900 - seventyYears;
 // print Unix time:
 Serial.println(epoch);
 reglerNTP(epoch); // met a jour la RTC par le serveur NTP

 /*
 // print the hour, minute and second:
 Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
 Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
 Serial.print(':');
 if ( ((epoch % 3600) / 60) < 10 ) {
 // In the first 10 minutes of each hour, we'll want a leading '0'
 Serial.print('0');
 }
 Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
 Serial.print(':');
 if ( (epoch % 60) < 10 ) {
 // In the first 10 seconds of each minute, we'll want a leading '0'
 Serial.print('0');
 }
 Serial.println(epoch % 60); // print the second
 */
 }
 gestionnaireDeTache.registerAsyncCommand(188, 12*TIMER_A, reglerHeureByNTP ); // tourne en boucle
}


et la fonction de communication avec le serveur , juste au cas ou :
Code: [Select]
unsigned long sendNTPpacket(char* address) {
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;

  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}


je vois pas ce que j ' ai pu loupé .


petite question  subsidiare toute bete , je peux tres bien supprimer la lib RTClib et n ' utiliser que la tienne pour une fonction afficher dateHeure et recuper des trucs du  style  now.hour() , now.day() etx si je ne me trompe pas ca me fera gagner de la memoire .[/code]
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: bricoleau on Apr 03, 2020, 10:30 pm
Oui reglerNtp() est une méthode de classe...

Inspire-toi de l'exemple relatif au NTP
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: iznobe on Apr 04, 2020, 09:49 am
salut ,

finalement ca marche  ;D

j ' avais oublie de mettre " RTC. " devant ...

du coup j ' ai supprime la RTClib.h standard de mon programme .

Cependant , il me reste un point que je n' arrive pas a resoudre qui n' est pas directement lié a cette classe .

quand je n' ai pas internet de connecté ou parfois sans raison , sur la RTC , tout est a " 0 "  :smiley-mr-green:

pour mettre a jour uniquement quand le retour est bon , j ' ai mis ça :

Code: [Select]
if ( epoch > 1585951635UL ) {  // => date du 04 / 04 / 2020 .
RTC.reglerNTP(epoch); // met a jour la RTC par le serveur NTP
gestionnaireDeTache.registerAsyncCommand(108, 12*TIMER_A, reglerHeureByNTP ); // tourne en boucle
}
else gestionnaireDeTache.registerAsyncCommand(108, TIMER_A, reglerHeureByNTP );  // tourne en boucle


j ' espere ne pas avoir ecrit une betise , il devrait mettre la RTC a jour que si il trouve une valeur correcte de la variable epoch , non?
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: hbachetti on Apr 04, 2020, 12:49 pm
Si la connexion est absente ou que le serveur NTPne répond pas, il devrait être assez facile de ne pas mettre à jour la RTC non ?
Je ne vois pas en qui comparer epoch à 04/04/2020 apporte quoi que ce soit, étant donné que si le serveur NTP n'est pas joignable, epoch ne devrait même pas être récupéré.
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: iznobe on Apr 04, 2020, 03:03 pm
Si la connexion est absente ou que le serveur NTPne répond pas, il devrait être assez facile de ne pas mettre à jour la RTC non ?
Je ne vois pas en qui comparer epoch à 04/04/2020 apporte quoi que ce soit, étant donné que si le serveur NTP n'est pas joignable, epoch ne devrait même pas être récupéré.

Salut henri ,

justement je pensais que si epoch n ' etait pas recuperer avec ce que j' ai mis , ca ne ferait pas la mise a jour de la RTC , selon toi ce n' est pas le cas ?


voici la fonction complete :
Code: [Select]
void reglerHeureByNTP () {
 sendNTPpacket(timeServer); // send an NTP packet to a time server

 delay(3000);
 // wait to see if a reply is available
 if ( Udp.parsePacket() ) {
 // We've received a packet, read the data from it
 Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer

 //the timestamp starts at uint8_t 40 of the received packet and is four bytes,
 // or two words, long. First, esxtract the two words:

 unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
 unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
 // combine the four bytes (two words) into a long integer
 // this is NTP time (seconds since Jan 1 1900):
 unsigned long secsSince1900 = highWord << 16 | lowWord;

 // now convert NTP time into everyday time:
 Serial.print("Unix time = ");
 // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
 const unsigned long seventyYears = 2208988800UL;
 // subtract seventy years:
 unsigned long epoch = secsSince1900 - seventyYears;
 // print Unix time:
 Serial.println(epoch);
 if ( epoch > 1585951635UL ) {  // => date du 04 / 04 / 2020 .
 RTC.reglerNTP(epoch); // met a jour la RTC par le serveur NTP
 gestionnaireDeTache.registerAsyncCommand(108, 12*TIMER_A, reglerHeureByNTP ); // tourne en boucle
 }
 else gestionnaireDeTache.registerAsyncCommand(108, TIMER_A, reglerHeureByNTP );  // tourne en boucle
 }
}


il est censé faire la mise a jour de la RTC uniquement dans le cas ou la valeur de epoch est superieure a celle du 04/04/2020 donc , je vois pas pourquoi je me retrouve avec 0 partout .

j ' ai mis ça parceque j' ai fait ca ce matin , je pourrais mettre nimporte quel chiffre ca serait pareil , du moment qu ' il est non nul ( enfin je pense )
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: hbachetti on Apr 04, 2020, 03:42 pm
Je serais plus prudent lors de la réception du paquet :

 if ( Udp.parsePacket() ) {   // ce test est insuffisant

Comment peux-tu être sûr d'avoir reçu les bonnes données si tu ne testes pas la taille de celles-ci ?
Tu te contentes de tester si taille > 0

bricofoy t'a donné un code qui a mon avis est bien plus robuste :

https://forum.arduino.cc/index.php?topic=674870.msg4542356#msg4542356 (https://forum.arduino.cc/index.php?topic=674870.msg4542356#msg4542356)

Code: [Select]

time_t getNtpTime()
{
  while (Udp.parsePacket() > 0) ; // discard any previously received packets
  Serial.println("Transmit NTP Request");
  sendNTPpacket(timeServer);
  uint32_t beginWait = millis();
  while (millis() - beginWait < 1500) {
    int size = Udp.parsePacket();
    if (size >= NTP_PACKET_SIZE) {
      Serial.println("Receive NTP Response");
      Udp.read(packetBuffer, NTP_PACKET_SIZE);  // read packet into the buffer
      unsigned long secsSince1900;
      // convert four bytes starting at location 40 to a long integer
      secsSince1900 =  (unsigned long)packetBuffer[40] << 24;
      secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
      secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
      secsSince1900 |= (unsigned long)packetBuffer[43];
      return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
    }
  }
  Serial.println("No NTP Response :-(");
  return 0; // return 0 if unable to get the time
}


Les premières lignes sont essentielles :

 while (Udp.parsePacket() > 0) ; // discard any previously received packets

   int size = Udp.parsePacket();
   if (size >= NTP_PACKET_SIZE) {

D'autre part il fait plusieurs essais de réception pendant 1.5 secondes.

Ensuite si la fonction retourne ZERO en cas d'échec, l'information est claire : ne pas prendre en compte cette valeur.
Il n'y a aucune raison de tester epoch > 1585951635UL
Soit c'est ZERO, soit c'est la bonne valeur.
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: hbachetti on Apr 04, 2020, 03:46 pm
Tu aurais d'ailleurs mieux fait de continuer sur le sujet "Synchoniser RTC DS1307 par NTP sur mega2506 (https://forum.arduino.cc/index.php?topic=674870.msg4542356)" au lieu de polluer un tutoriel n'ayant rien à voir avec le NTP.
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: ggdu621 on May 03, 2020, 12:26 pm
bonjour,

on est bien d'accord que pour récupérer un protocole NTP il faut une communication au réseau domestique (internet)?

bon dimanche a tous
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: bricoleau on May 03, 2020, 04:43 pm
ben voui  :)

Il faut une connexion réseau et un bout de code pour lire l'heure courante.

Cela permet de récupérer un entier long non signé, qui correspond au nombre de secondes écoulées depuis le 01/01/1970 00:00:00 UTC

Et après, passer la valeur récupérée à la fonction reglerNTP() pour mettre à jour le RTC avec cette valeur.
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: ggdu621 on May 03, 2020, 06:03 pm
il me semblait bien. merci beaucoup
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: iznobe on May 20, 2020, 08:08 pm
Bonjour , c ' est sympa de partager votre travail , avec la communauté , grand merci a vous !

Dites moi , votre bibliothèque , elle calcule les saisons ?
Title: Re: [partage]Librairie simpleRTC (DS1307 / DS3231) avec heures été/hiver
Post by: bricoleau on May 21, 2020, 12:27 am
ah non désolé

Les saisons sont basées sur les solstices & équinoxes, faut se taper des calculs d'astronomie assez chiants je pense. Il doit bien exister des libs là-dessus.

Et pour les flemmards : un bête tableau en progmem chargé avec les dates de solstices et équinoxes des 20 prochaines années trouvées sur le net.  :)

Et encore les dates ce n'est pas suffisant : il faut aussi savoir si on veut les saisons de l'hémisphère nord ou de l'hémisphère sud.