IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Synchronisation DateTime NTP ou RTC Modul DS1302


Sujet :

Arduino

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2016
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Synchronisation DateTime NTP ou RTC Modul DS1302
    Bonjour,

    Configuration : Un Arduino méga 2560 + une carte Ethernet Shield 2 + RTC Modul DS1302

    J'utilise l'heure synchronisation depuis un serveur ntp grâce a la bibliothèque NtpClientLib.h + Ethernet.h + TimeLib.h.
    S'il y a une coupure de connexion physique ou d'internet (synchronisation) je souhaite passer sur l'heure stoker sur un DS1302.
    J'ai trouvé la bibliothèque virtuabotixRTC.h pour l'utiliser, je par du principe que l'arduino c'est connecter au réseau au moi une foi pour initialiser l'heure du DS1302.


    Je suis arrivé un peu à faire cela :
    - si la connexion ne fonctionne pas au démarrage de l'arduino on passe sur l'heure du DS1302.
    - si on débranche le câble rj45 on passe sur l'heure du DS1302 et si on le reconnecte on repasse sur l'heure NTP.
    - mais si j'ai une erreur de synchronisation du NTP du à une perte de connexion internet il faudrait que je passe sur l'heure DS1302 mais le programme s'arrête jusqu'à ce que la connexion revienne...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #include <SPI.h>
    #include <Ethernet.h>
    #include <TimeLib.h>
    #include <NtpClientLib.h>
    #include <virtuabotixRTC.h>
     
    virtuabotixRTC myRTC(35, 37, 39);
     
    byte mac[] = {0x8A, 0x1E, 0xD5, 0xAC, 0x32, 0x82};
    int erreur = 0;
     
    void setup() {
     Serial.begin(9600);
      if (Ethernet.begin(mac) == 0) {
        Serial.println("Ethernet Error");
        erreur = 1;
      } else {
        serveur.begin();
        NTP.onNTPSyncEvent ([](NTPSyncEvent_t error) {
          if (error) {
            erreur = 1;
          }
        });
        NTP.setNTPTimeout (60);
        NTP.setInterval (60);
        NTP.begin("1.fr.pool.ntp.org", 1, true);
        myRTC.setDS1302Time(second(), minute(), hour(), weekday(), day(), month(), year());
        Serial.println(Ethernet.localIP());
      }
    }
     
    void loop() {
     Serial.println(dateTimeBD());
     delay(1000);
    }
     
    String dateTimeBD(){
      String resultat = "";
      if (Ethernet.linkStatus() == LinkON && erreur == 0) {
        resultat = String(year())+"-";
        if (month() < 10) {resultat += "0"+String(month());}else {resultat += String(month());}
        resultat += "-";
        if (day() < 10) {resultat += "0"+String(day());}else {resultat += String(day());}
        resultat += " ";
        if (hour() < 10) {resultat += "0"+String(hour());}else {resultat += String(hour());}
        resultat += ":";
        if (minute() < 10) {resultat += "0"+String(minute());}else {resultat += String(minute());}
        resultat += ":";
        if (second() < 10) {resultat += "0"+String(second());}else {resultat += String(second());}
        return resultat;
     } else {
       myRTC.updateTime();
         resultat = String(myRTC.year)+"-";
         if (myRTC.month < 10) {resultat += "0"+String(myRTC.month);}else {resultat += String(myRTC.month);}
         resultat += "-";
         if (myRTC.dayofmonth < 10) {resultat += "0"+String(myRTC.dayofmonth);}else {resultat += String(myRTC.dayofmonth);}
         resultat += " ";
         if (myRTC.hours < 10) {resultat += "0"+String(myRTC.hours);}else {resultat += String(myRTC.hours);}
         resultat += ":";
         if (myRTC.minutes < 10) {resultat += "0"+String(myRTC.minutes);}else {resultat += String(myRTC.minutes);}
         resultat += ":";
         if (myRTC.seconds < 10) {resultat += "0"+String(myRTC.seconds);}else {resultat += String(myRTC.seconds);}
         return resultat+" RTC";
     }
    }
    NTP.setNTPTimeout (60); NTP.setInterval (60); 60 seconde c'est juste pour les tests.

    Quelqu'un aurait une idée?
    Car cela fait un moment que je cherche mais je n'ai rien trouver sur les erreurs de synchronisation NTP

    Peu-être avec NTP.onNTPSyncEvent ([](NTPSyncEvent_t error) {}); mais je n'ai pas compris comment l'utiliser dans loop()


    Merci d'avance

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2016
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Problématique résolu
    Bonjour,

    Pour les personnes que ça intéresse j'ai résolu mon problème en le contournant en utilisant la bibliothèque EthernetUdp.h disponible dans la bibliothèque Ethernet.h.

    Pour cela j'ai utilisé Udp.beginPacket pour vérifier si j'ai un retour de par exemple le DNS de Google par la suite je contacterai le serveur NTP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((Udp.beginPacket("8,8,8,8", 53)) != 0) {}
    Je me suis aidée de rgot.org et bien sur arduino.cc.

    Ce n'est surement pas la meilleure technique mais ça fonctionne

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WS 2016] l'heure de mes clients ne se synchronisent pas (NTP Serveur)
    Par shellxy dans le forum Windows Serveur
    Réponses: 0
    Dernier message: 15/04/2020, 15h42
  2. [WS 2008 R2] problème synchronisation serveur NTP
    Par snake264 dans le forum Windows Serveur
    Réponses: 3
    Dernier message: 29/12/2010, 17h40
  3. DateTime : Un (bon) module de gestion de date
    Par Jedai dans le forum Modules
    Réponses: 11
    Dernier message: 27/07/2007, 12h30
  4. Synchronisation par serveur ntp
    Par ghyslain84 dans le forum Windows Serveur
    Réponses: 10
    Dernier message: 02/06/2006, 16h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo