Primero de todo añade las librerías “TimeLib.h”, “ESP8266WiFi.h” y “WiFi.Udp.h”.

Después de configurar la WiFi y el Udp, debes configurar el servidor de donde sacar el tiempo. Puede ser uno cualquiera de la pool.ntp.org, o una IP en concreto que esté enviando el tiempo en tu wifi.

//static const char ntpServerName[] = "europe.pool.ntp.org";
//static const char ntpServerName[] = "192.168.0.212";

const int timeZone = 2; //Madrid
int askTime = 20;
  • Quita las dos barras y cambia la IP de donde quieras recibir la NTP.
  • La zona horaria también se debe estipular.
  • Cambia el número del “askTime” con los segundos que quieras que tarde en volver a pedir la hora.

En tu primer setup llama el código siguiente, despues de iniciar la WiFi y la comunicación Udp.

void setup_NTP() {
  while (timeStatus() != timeSet) {
    setSyncProvider(getNtpTime);
    delay(200);
  }
  setSyncInterval(askTime);
}
  • Así la primera vez forzará a recibir el tiempo correcto, y todo el código no empezará si no recibe nada.
  • Cambia el número de “setSyncInterval” por el intervalo (en segundos) en el que quieras que vaya pidiendo el tiempo por Internet.

Debes pedir el tiempo con los siguientes códigos, adaptados del ejemplo de la librería Time de PaulStoffregen para ESP8266, que utiliza el Wemos mini.

const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets

time_t getNtpTime() {
  IPAddress ntpServerIP; // NTP server's ip address
  while (Udp.parsePacket() > 0) ; // discard any previously received packets
  Serial.println("Transmit NTP Request");
  WiFi.hostByName(ntpServerName, ntpServerIP);
  Serial.print(ntpServerName);
  Serial.print(": ");
  Serial.println(ntpServerIP);
  sendNTPpacket(ntpServerIP);
  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];
//      Serial.println(secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR);
      return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
    }
  }
  Serial.println("No NTP Response :-(");
  return 0; // return 0 if unable to get the time
}
  • Crea un string con el tiempo pedido, que es utilizado por la librería Time para mostrar la hora actual.
  • Para realmente pedir el tiempo al servidor NTP se utiliza el siguiente void.
void sendNTPpacket(IPAddress &address) {
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  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();
}

Para ver el tiempo en la consola con una cadena de números mostrando desde el año hasta segundo actual, necesitas éstos dos últimos voids:

void timeString() {
  Serial.print(year());
  printDigits(month());
  printDigits(day());
  printDigits(hour());
  printDigits(minute());
  printDigits(second());
  Serial.println();
}

void printDigits(int digits) {
  if (digits < 10) {
    Serial.print('0');
  }
  Serial.print(digits);
}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *