Récupérer seulement une partie d'une page Internet

Bonjour,
Je suis entrain de tester un programme que j'incorporerai dans un plus gros ensuite. Je cherche à récupérer l'heure sur Internet (pour m'éviter l'achat d'un module RTC) via un shield Ethernet W5100. Cependant, je ne sais pas comment faire pour récupérer seulement l'heure et non tout le code HTML du site (heure.com).

Merci
PauseLecture

à mon avis votre site ne fait pas juste une page HTML avec l'heure mais doit utiliser javascript etc donc ne pas être simple à extraire l'info

Le mieux serait de faire une requête vers un serveur NTP par l'envoi d'une petite requête UDP.

(personnellement je ne ferai pas l'économie d'une horloge locale... au prix où sont les RTC...)

personnellement je ne ferai pas l'économie d'une horloge locale... au prix où sont les RTC...

Entièrement d'accord avec JML

Actuellement pour environ 1 € tu as une DS3231.
Surtout ne pas prendre la référence DS1307 que par flemme tous les sites de vulgarisation mettent en avant et qui est disons nulle coté précision.
Cerise sur le gâteau la DS3231 offre deux alarmes qui peuvent servir à déclencher des actions.

La DS3231 est un "tout en un" c'est dire que le quartz est dans le boîtier du circuit intégré c'est rassurant parce que c'est celui choisi et garanti par le fabricant de l'horloge.
Et c'est la mise en œuvre du quartz et sa qualité qui font toute la précision.

Cette grâce à cette intégration que le fabricant peut compenser les dérives du quartz en température, ce qui permet à Maxim/Dallas d'annoncer une dérive inférieure à +/- 2 ppm.
Dans un premier temps 2 ppm c'est 60 secondes sur une année mais attention dans toute l'étendue de la gamme de température qui est 0°C/+70°C pour le DS3231S et -40°C/+85°C pour le modèle DS3231SN.

Déjà si l'horloge ne fonctionne qu'à l'intérieur, c'est à dire à 22°C +/- 3°C la variation max sera bien inférieure à +/- 2ppm.
Ensuite la compensation se fait par pas. Selon le cas l'algorithme prendra le pas supérieur ou le pas inférieur. Sur une année il y aura un moyenage naturel qui réduira encore la valeur de 60 s maximum.

Sauf si tu ton application demande une heure ultra précise ce sera plus simple avec une horloge sauvegardée (RTC) qu'extraire l'heure d'internet bien que cela représente un beau défit.

D'accord
Merci de votre réponse

Tenez voici un bout de code que j’avais qui trainait et qui utilise le code de l’exemple NTP client pointé plus haut mais mis dans un sketch pour le shield ethernet

Dans le setup() on initialise le shield ethernet et l’instance UDP et la loop() appelle la fonction de l’exemple (que j’avais un peu modifiée) toutes les 5 secondes (le delay(5000) de la fin de la boucle) et va demander l’heure à un serveur NTP (“pool.ntp.org” mais vous pourriez mettre “fr.pool.ntp.org” qui est en france - ça ne sert pas à grand chose car vous serez routé surement là bas automatiquement). L’appel à la fonction retourne “l’unix time”, le nombre de secondes depuis le 1er janvier 1970 à 0h00 ou alors 0 s’il y a eu un problème.

Ensuite si j’ai bien obtenu l’heure, je convertis le temps unix en une structure qui permet une représentation “éclatée” de l’heure et j’imprime l’heure unix et l’heure correspondante en UTC+2 (j’ai rajouté DELTA_AVEC_UTC qui vaut 2) sur la console (réglée à 115200 bauds)

Si vous voulez l’heure donc, après l’appel à la fonction ptm = gmtime(&unixTime); ptm va pointer sur une structure qui vous donne l’information sur l’heure UTC (sans Daylight Saving Time flag) ptm->tm_hour ce sont les heures, ptm->tm_min les minutes etc

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

// choisisez une adresse Mac et IP qui vous convient
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 178);

EthernetUDP udp;

#include <time.h> /* time_t, struct tm, time, gmtime */

//---------------------------------------------------------------------
// copié depuis https://playground.arduino.cc/Code/NTPclient
// modifié simplement pour utilser time_t au lieu de unsigned long
// et démaré l'instance UDP dans le setup()

/*
   © Francesco Potortì 2013 - GPLv3 - Revision: 1.13
   The Unix time is returned, that is, seconds from 1970-01-01T00:00.
*/

time_t inline ntpUnixTime (UDP &udp)
{

  const char timeServer[] = "pool.ntp.org";  // NTP server en france "fr.pool.ntp.org"
  const long ntpFirstFourBytes = 0xEC0600E3; // NTP request header

  udp.flush();

  // Send an NTP request
  if (! (udp.beginPacket(timeServer, 123) // 123 is the NTP port
         && udp.write((byte *)&ntpFirstFourBytes, 48) == 48
         && udp.endPacket()))
    return 0;       // sending request failed

  // Wait for response; check every pollIntv ms up to maxPoll times
  const int pollIntv = 150;   // poll every this many ms
  const byte maxPoll = 15;    // poll up to this many times
  int pktLen;       // received packet length
  
  for (byte i = 0; i < maxPoll; i++) {
    if ((pktLen = udp.parsePacket()) == 48)
      break;
    delay(pollIntv);
  }
  
  if (pktLen != 48) return 0; // no correct packet received

  const byte useless = 40;
  for (byte i = 0; i < useless; ++i) udp.read();
  
  time_t time = udp.read();  // NTP time
  for (byte i = 1; i < 4; i++) time = time << 8 | udp.read();
  time += (udp.read() > 115 - pollIntv / 8);
  udp.flush();

  return time - 2208988800ul;   // convert NTP time to Unix time
}

//---------------------------------------------------------------------



void setup() {
  // Open serial communication
  Serial.begin(115200);

  // start the Ethernet connection
  Ethernet.begin(mac, ip);
  
// start udp instance
  if (!udp.begin(123)) {
    Serial.println("UDP non fonctionnel");
    while(true); // on ne va pas plus loin
  }
}


void loop() {
  struct tm * ptm;
  time_t unixTime = ntpUnixTime(udp);
  const unsigned int DELTA_AVEC_UTC = 2; // pour la france on est UTC + 2 en ce moment

  if (unixTime) {
    Serial.print(unixTime);
    Serial.print(" --> ");
    ptm = gmtime(&unixTime);
    Serial.print((ptm->tm_hour + DELTA_AVEC_UTC) % 24);
    Serial.print(":");
    if (ptm->tm_min < 10) Serial.print("0");
    Serial.print(ptm->tm_min);
    Serial.print(":");
    if (ptm->tm_sec < 10) Serial.print("0");
    Serial.println(ptm->tm_sec);
  }
  delay(5000); // pour ne pas bombarder le server NTP 
}

→ console:

</sub> <sub>1494865382 --> 18:23:02 1494865387 --> 18:23:07 1494865392 --> 18:23:12</sub> <sub>