Horodatage d'évènements sans horloge RTC. Lecture data d'un site web.

Bonjour,

Une fois n’est pas coutume, ce n’est pas un problème que je poste, peut-être une solution.
Il ne s’agit que d’un exercice, mais je pense que cela pourrait servir dans des cas particuliers.
Si quelqu’un pouvait l’améliorer encore et le partager … (je suis débutant)
Lire le code ci-dessous.(et en fichier joint)

/*
Ce sketch fonctionne. Mettez-y votre adresse mac, votre adresse ip, votre débit 'Sérial'.
 Observer le résultat sur le moniteur série. (lecture en boucle, délai 15 sec. environ)
 Testé sur Mega 2560 + shield Ethernet.
 
 Lecture date et heure sur Internet lorsqu'on n'a pas d'horloge RTC.
 Peut servir :
 - à horodater un évènement pour le mettre sur la carte SD, 
 - mettre à l'heure automatiquement une horloge temps réel,
 - exercice de lecture d'un fichier.txt situé sur un site,  etc ...
 
 Géryko :  http://www.microfer.fr/geryko
 */

#include <SPI.h>
#include <Ethernet.h>

const unsigned long pauseBetweenReadings = 13000UL;  // délai = toutes les 15 sec environ

byte mac[] = { 
  0x90, 0xA2, 0xDA, 0x0F, 0xAA, 0xAA }; // mon adresse MAC lue sur la face arrière du shield Ethernet

//char server[] = "geryko.free.fr";    // nom et adresse de mon site pour besoins personnels (utilise DNS)

// Adresse IP statique de ma carte Arduino
IPAddress ip(192,168,0,112);   // ici mon adresse IP statique ( donnée par ma freebox)

#define NbCarMax  80        // taille du buffer de réception Ethernet 
String BufReception = String(NbCarMax);

// Initialize the Ethernet client library  with the IP address and port of the server 
// that you want to connect to (port 80 is default for HTTP)
EthernetClient client;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // Attendre le port série pour connecter. Nécessaire pour Leonardo seulement 
  }

  // initialisation bus SPI
  pinMode (53, OUTPUT);  // select interface SPI Mega 1280 ou 2560. (définir Mega maître du bus SPI)
  //pinMode (10, OUTPUT);  // select interface SPI  (pin 10 pour les autres Arduino)
  //digitalWrite (10, HIGH);
  pinMode (4, OUTPUT);   // select micro SD
  digitalWrite (4, HIGH);
  SPI.begin ();
} // fin de setup   ==================================================

// fonction lire date et heure sur un site internet
void lire_date_heure(){

  char serve_r[] = "ntp.alapetite.fr";  // adresse du site qui fournit date/heure (utilise DNS)

  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip);
  }

  delay(1000);   // donner une seconde pour initialiser l'Ethernet

  Serial.println("connecting.&.");

  // si vous avez une connexion au serveur (site), l'afficher sur le moniteur série
  if (client.connect(serve_r, 80)) {
    Serial.println("connected..");  // connecté à mon site personnel pour la suite ...

    // demander date/heure sur le site en HTTP.  Date/heure est contenu dans un fichier nommé date.txt (une seule ligne SANS \n)
    client.println("GET /date.txt.php HTTP/1.1");  // voir : ntp.alapetite.fr/date.txt.php
    client.println("Host: ntp.alapetite.fr");      // adresse du site qui fournit
    client.println("Connection: close");
    client.println();
    delay(100);  // attendre la réponse

  }
  else {
    Serial.println("connection failed"); // si vous n'avez pas eu la connexion au serveur (site)
  }

  // si il y a des octets entrants disponibles, en provenance du site, les lire et les afficher sur le moniteur série  
  BufReception="\0";    //  vider buffer Rec = fin de chaîne au cas où 

  while (client.available() ) {
    char c = client.read();
    if (BufReception.length() < NbCarMax) {  // veiller à ne pas dépasser la taille du buffer
      BufReception += c;
    } 
    if (c == '\n') {               // Nouvelle ligne   
      Serial.print(BufReception);  // affichage des lignes pour contrôle
      BufReception="\0";           //  vider buffer Rec = fin de chaîne
    }
  } // fin du while

  // bufRec contient la date et heure : exemple 2014-08-10T23:02:05+02:00 (attention : SANS le \n à la fin)
  Serial.println(BufReception);  // c'est pourquoi il est traité hors du while

  client.stop();

  Serial.println();
  Serial.println("disconnecte..");

  int Position = BufReception.indexOf("2");  // recherche position du 2 de 2014 (en principe le 1er octet, position = 0)
  Adapter_format_date(BufReception,Position);    
} // fin de la fonction lire date et heure ============================


void Adapter_format_date(String BufReception, int Position) {

  String AA = BufReception.substring(Position+0,Position+4);   // année
  String MM = BufReception.substring(Position+5,Position+7);   // mois
  String  JJ = BufReception.substring(Position+8,Position+10); // jour

  String HH = BufReception.substring(Position+11,Position+13);  // heures
  String MN = BufReception.substring(Position+14,Position+16);  // minutes
  String  SS = BufReception.substring(Position+17,Position+19); // secondes

  // et à partir de là vous faites ce que vous voulez.      

  String  Date_ = JJ+"/"+ MM+"/"+AA+" ";
  String  Heure_ = HH+":"+MN+":"+SS+" ";

  Serial.print("Resultat : Nous sommes le  ");
  Serial.print(Date_);
  Serial.print("  il est  ");
  Serial.println(Heure_);
} // fin de la fonction Adapter_format_date ============================


//fonction envoyer résultat sur mon serveur web
void envoyer_get(float temperature, byte alarme){  // alarme transformé byte 
  // tralala    lignes sans intérêt 
} // fin de la fonction envoyer au serveur web ============================


void loop() {
  lire_date_heure();                //   pour tester horodatage

    delay(pauseBetweenReadings);      // Attente avant la prochaine lecture
}

Cordialement
Géryko

WebClient_horodatage.ino (5.5 KB)