Arduino, horloge sans module RTC

Bonjour. Est il possible avec une carte arduino ethernet seule sans shield ou autre module RTC d'horodater et enregistrer ces données sur la carte SD en synchronisant l'horloge au démarrage via internet (ntp) en profitant de cette démarche pour tester le reseau. En bref, sans module RTC, l'arduino est il capable de compter l'heure si on la synchronise correctement dés branchement électrique? Merci!

Tu as ça si tu veux. Mais pour avoir testé, ce n'est pas d'une précision très fiable. Suivant la taille de ton code et d'autres paramètres, j'ai moi-même constaté un décalage de quelques minutes au bout d'un ou deux jours. (de l'ordre de 2 à 5 minutes parfois tout de même)

Merci! Dans le cadre de mon utilisation cette précision est très acceptable, à la rigueur toutes les 24H, je pourrais faire un NTP pour resynchroniser sachant que l'arduino sera connecté en permanence. Je suis vraiment au tout début et trés newbie, j'ai le materiel mais pourriez vous me filer un coup de main pour un code permettant justement de mesurer cette dérive avec un arduino ethernet sans POE (version all-in-one, non pas l'arduino + shield), simplement synchroniser l'heure au démarrage et me connecter 24h aprés pour lire l'heure et la comparer avec celle de mon PC? Merci!!!!!!!!!!!!!!!!

Bonjour,

Pour la syncro NTP avec Time.h tu peut piquer ma fonction getNTPsync() ici : http://skyduino.wordpress.com/2013/01/02/arduino-systeme-de-traitement-online-offline/

Ensuite dans loop() tu fait juste un boucle qui attend 5 secondes, envoi l'heure sur Serial, attend 5 secondes, etc ... Comme ça tu peut regarder l'heure de l'arduino et la comparer à celle de ton ordi quand tu veut ;)

Code impeccable, merci

Mais!!! Je ne parviens pas à le faire fonctionner avec mon arduino ethernet, ce code est conçu pour un uno + shield, alors que j'ai un tout en un. Je change l'adresse IP, le MAC, les IP des serveurs temps, cela m'indique toujours :

Synchronisation NTP ... Tentative de synchronisation NTP ... Erreur serveur NTP 1 ! Erreur serveur NTP 2 !

J'ai également bien mis l'adresse mac de l'étiquette et installé l'ip en dehors du DHCP et bien en 192.168.0 puisque c'est une Freebox. Le ping répond bien depuis mon PC ce qui indique que l'arduino est connecté, c'est donc l'interrogation des serveurs qui ne fonctionnent pas? J'ai pourtant essayé avec d'autres IP de serveur en France ou US, mais rien!

Merci!!

josse34: Mais!!! Je ne parviens pas à le faire fonctionner avec mon arduino ethernet, ce code est conçu pour un uno + shield, alors que j'ai un tout en un.

UNO + shield == Arduino Ethernet, c'est strictement la même chose (logiciellement).

josse34: Je change l'adresse IP, le MAC, les IP des serveurs temps, cela m'indique toujours :

Synchronisation NTP ... Tentative de synchronisation NTP ... Erreur serveur NTP 1 ! Erreur serveur NTP 2 !

Tu est sûr de ton adresse IP, de tes adresses de serveur NTP, ... ? Manifestement tes IP de serveurs NTP sont fausses.

-> Donne le haut du code avec les ip / config / ...

Bonjour!
Le code est exactement le même que toi, j’ai changé :

  • Ajout de la bibliothèque SD.h car son absence génère une erreur à la compilation : “error: ‘SD’ was not declared in this scope” au niveau de static File root;
  • L’adresse MAC telle que sur l’étiquette de la carte, à savoir 90-A2-DA-0D-9F-C8
  • L’adresse IP de la carte pour une freebox et en dehors du DHCP : 192.168.0.55, le Ping sur réseau interne depuis mon PC fonctionne donc cela indique que l’arduino est bien connecté
  • J’ai beau changer les IP des serveurs NTP selon cette liste http://tf.nist.gov/tf-cgi/servers.cgi , cela ne change rien

Le reste du code n’est pas modifié car n’impacte pas cette synchronisation NTP.
Merci:

#include <SD.h>
#include <Ethernet.h>    /* Pour la shield ethernet */
#include <SPI.h>         /* Pour la communication bas niveau (carte SD et ethernet) */
#include <EthernetUdp.h> /* Pour la communication UDP */
#include <Time.h>        /* Pour la gestion du temps */
 
/** Taille du buffer pour la lecture du fichier texte et l'envoi de la requete HTTP */
static const byte BUFFER_SIZE = 50;
 
/** Taille d'un paquet NTP */
static const byte NTP_PACKET_SIZE = 48;
 
/** Temps d'attente entre deux écritures (en ms) */
static const unsigned long PERIOD_WRITE_DATA  =  120000UL;
 
/** Broche CS de la carte SD */
static const byte PIN_SD_CS = 4;
 
/** Adresse MAC de l'ethernet shield */
static byte localMacAddress[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x9F, 0xC8 };
 
/** Port d'écoute local */
static const unsigned int listenPort = 8888;
 
/** Adresse IP de l'ethernet shield */
static IPAddress localIpAddress(192, 168, 0, 55); 
 
/** Adresse IP de time.nist.gov */
static IPAddress timeServer1(192, 43, 244, 18); 
 
/** Adresse IP de time.nist.gov */
static IPAddress timeServer2(129, 6, 15, 28); 
 
/** Adresse IP serveur perso PHP */
static IPAddress serverIpAddress(192, 168, 0, 135);
 
/** Compteur d'impulsion */
static volatile unsigned long pulseCounter = 0;
 
/** Instance de EthernetUDP permettant l'échange de données via UDP */
static EthernetUDP Udp;
 
/** Zone horaire pour NTP */
static const byte timeZoneOffset = 1; // GMT zone
 
/** Objet File pointant sur le répertoire root de la carte SD */
static File root;

Je ne met pas la suite du code car non modifié et impossible (limite de 9500 caractères sur le forum!).

Tu as essayé avec mes deux ip de base ? Le statut du serveur n°2 est "all services busy" = indisponible et le n°1 n'est pas dans la liste ...

Oui, rien n'y fait, j'ai même essayé avec quelques une de ces IP : https://support.ntp.org/bin/view/Servers/StratumTwoTimeServers Cela ne doit pas venir des IP, peut etre que ma carte communique sur reseau interne mais l'internet lui est inaccessible?

Je te propose, si tu a deux minutes, de te connecter à mon PC via TeamViewer pour un accés total? Identifiant & mot de passe donné par MP!

josse34: Oui, rien n'y fait, j'ai même essayé avec quelques une de ces IP : https://support.ntp.org/bin/view/Servers/StratumTwoTimeServers Cela ne doit pas venir des IP, peut etre que ma carte communique sur reseau interne mais l'internet lui est inaccessible?

Essaye ce code d'exemple (sans le modifier) : http://arduino.cc/en/Tutorial/UdpNtpClient

Si il ne marche pas c'est que tu as un problème avec ta config réseau.

josse34: Je te propose, si tu a deux minutes, de te connecter à mon PC via TeamViewer pour un accés total? Identifiant & mot de passe donné par MP!

Ça ne servira à rien, à mon avis ton problème est du côté de ta configuration réseau matériel (comment tu câbles la shield, ...). Le code d'exemple ci dessus permettra de savoir qui pose problème (le logiciel ou le matériel) ;)

Merci! Je viens de le faire, cela indique bien :

Seconds since Jan 1 1900 = 3576754098 Unix time = 1367765298 The UTC time is 14:48:18 Seconds since Jan 1 1900 = 3576754109 Unix time = 1367765309 The UTC time is 14:48:29 Seconds since Jan 1 1900 = 3576754120 Unix time = 1367765320 The UTC time is 14:48:40 Seconds since Jan 1 1900 = 3576754131 Unix time = 1367765331 The UTC time is 14:48:51

Que ce soit avec l'adresse MAC d'origine au code ou avec mon adresse MAC de l'étiquette.

J'en conclu que ce code fonctionne bien! D'ailleurs, ton code mériterais du DHCP comme cela!

josse34: J'en conclu que ce code fonctionne bien! D'ailleurs, ton code mériterais du DHCP comme cela!

Ok, prend l'ip du serveur du code de démo et met la en double dans mon code. Mon code est celui de démo sont identique ... je vois pas pourquoi l'un marcherai et pas l'autre ...

Sinon pour le DHCP il suffit de virer localAddress dans le Ethernet.begin() pour l'activer ;)

Navré, malgré ton implication cela ne fonctionne pas, j'ai mis l'adresse 132, 163, 4, 101 dans les IP des deux serveurs NTP, toujours même refrain!

Le simple fait que ton code de base provoque une erreur chez moi en m'obligeant à rajouter la bibliothèque SD.h est suspect, cela indique à la compilation :

sketch_may05a:46: error: 'File' does not name a type sketch_may05a.ino: In function 'void setup()': sketch_may05a:70: error: 'SD' was not declared in this scope sketch_may05a:77: error: 'root' was not declared in this scope sketch_may05a:77: error: 'SD' was not declared in this scope sketch_may05a.ino: In function 'void createWaitingReport(int, int, int, int, int, int, long unsigned int)': sketch_may05a:237: error: 'File' was not declared in this scope sketch_may05a:237: error: expected ;' before 'outfile' sketch_may05a:243: error: 'outfile' was not declared in this scope sketch_may05a.ino: In function 'void sendWaitingReports()': sketch_may05a:260: error: 'root' was not declared in this scope sketch_may05a:261: error: 'File' was not declared in this scope sketch_may05a:261: error: expected;' before 'entry' sketch_may05a:264: error: 'entry' was not declared in this scope sketch_may05a:298: error: 'SD' was not declared in this scope

josse34: Navré, malgré ton implication cela ne fonctionne pas, j'ai mis l'adresse 132, 163, 4, 101 dans les IP des deux serveurs NTP, toujours même refrain!

Le simple fait que ton code de base provoque une erreur chez moi en m'obligeant à rajouter la bibliothèque SD.h est suspect, cela indique à la compilation :

Dans le code d'origine la librairie SD est bien incluse, le code a du reste été testé par plusieurs membres du forum ... c'est bizarre.

Met ton code complet en pièce jointe ("additional options" en orange en dessous de l'éditeur).

Et voici!
Mais c’est exactement le même que le tien mis à part l’ajout de la librairie SD.h et la modification des deux serveurs temps par le code qui fonctionne, à savoir 132, 163, 4, 101.
Il doit y avoir une petite différence qui fait que la majorité des gens ont des Arduino+shield ethernet alors que j’ai un arduino ethernet, je ne vois autres chose malgré ma très faible expérience!
Merci!

Code.txt (10.3 KB)

Ben là je doit avouer que je ne vois absolument pas ce qui peut planter ...

C'est bien dommage, je n'ai pas de shield ethernet pour tester avec mon arduino uno mais j'ai essayé avec mon nano et son shield ethernet, mais ces codes ne fonctionnent pas avec ce matériel. HELP, je suis bloqué! Merci!

Bonjour! Quelqu'un aurait au moins un code simple avec synchronisation NTP ou manuelle au démarrage et affichage de l'heure par serveur web pour au moins vérifier la dérive de précision de l'horloge? Merci!

Prend le code de démo NTP + les lignes de mon setup (setSyncProvider() + boucle d’attente).
La fonction de sync doit retourner un long, si = 0 → erreur, sinon → temps unix.

C’est quand même bizarre que le code de démo marche et pas mon code … je comprend vraiment pas …

skywodd: Prend le code de démo NTP + les lignes de mon setup (setSyncProvider() + boucle d'attente). La fonction de sync doit retourner un long, si = 0 -> erreur, sinon -> temps unix.

C'est quand même bizarre que le code de démo marche et pas mon code ... je comprend vraiment pas ...

bonjour skywodd remet ton code de test (fonctionnel ,pret à compiler sous 1.04 ) , je ferais un test ce soir (uno R2+eth shield)