Arduino NTP,我想要打印输出数据(DD-MM-YYYY)

时间:2017-03-28 07:22:10

标签: c arduino-uno esp8266 ntp

这个代码是Arduino NTP连接代码,想要UTC计算(DD-MM-YYYY)

支持lib和Header:

#include "WiFiEsp.h"
#include "WiFiEspUdp.h"
//kor UTC time + 9

// Emulate Serial1 on pins 6/7 if not present
#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
#include "TimeLib.h"
SoftwareSerial Serial1(8, 9); // RX, TX
#endif

全局变量:

char ssid[] = "xxxxxxx";            // your network SSID (name)
char pass[] = "xxxxxxx";        // your network password
int status = WL_IDLE_STATUS;     // the Wifi radio's status

char timeServer[] = "0.asia.pool.ntp.org";  // NTP server
unsigned int localPort = 2390;        // local port to listen for UDP packets

const int NTP_PACKET_SIZE = 48;  // NTP timestamp is in the first 48 bytes of the message
const int UDP_TIMEOUT = 2000;    // timeout in miliseconds to wait for an UDP packet to arrive

byte packetBuffer[NTP_PACKET_SIZE]; // buffer to hold incoming and outgoing packets

// A UDP instance to let us send and receive packets over UDP
WiFiEspUDP Udp;

所有代码:

void setup()
{
  // initialize serial for debugging
  Serial.begin(9600);
  // initialize serial for ESP module
  Serial1.begin(9600);
  // initialize ESP module
  WiFi.init(&Serial1);

  // check for the presence of the shield
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    // don't continue
    while (true);
  }

  // attempt to connect to WiFi network
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network
    status = WiFi.begin(ssid, pass);
  }
  Serial.println("You're connected to the network");
  Udp.begin(localPort);
}

void loop()
{
  sendNTPpacket(timeServer); // send an NTP packet to a time server

  // wait for a reply for UDP_TIMEOUT miliseconds
  unsigned long startMs = millis();
  while (!Udp.available() && (millis() - startMs) < UDP_TIMEOUT) {}

  Serial.println(Udp.parsePacket());
  if (Udp.parsePacket()) {
    Serial.println("packet received");
    // We've received a packet, read the data from it into the buffer
    Udp.read(packetBuffer, NTP_PACKET_SIZE);

    // the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, esxtract the two words:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    Serial.print("Seconds since Jan 1 1900 = ");
    Serial.println(secsSince1900);

    // now convert NTP time into everyday time:
    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;
    // subtract seventy years:
    unsigned long epoch = (secsSince1900 - seventyYears)+32400;
    //    unsigned long epoch = (secsSince1900 - seventyYears);
    // print Unix time:
    Serial.println(epoch);
    // print the hour, minute and second:
    Serial.println("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
    Serial.println((epoch / 31556926)+1970);
    //    Serial.println((epoch / 86400L)%7); 
    //0=Thursday,1=Friday,2=Saturday,3=Sunday,4=Monday,5=Tuesday,6=Wednesday
    Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
    Serial.print(':');
    if (((epoch % 3600) / 60) < 10) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
    Serial.print(':');
    if ((epoch % 60) < 10) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.println(epoch % 60); // print the second


  }

  // wait ten seconds before asking for the time again
  delay(1000);
}

// send an NTP request to the time server at the given address
void sendNTPpacket(char *ntpSrv)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)

  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(ntpSrv, 123); //NTP requests are to port 123
  Serial.println();

  Udp.write(packetBuffer, NTP_PACKET_SIZE);

  Udp.endPacket();
}

串口监视器打印:

packet received
Seconds since Jan 1 1900 = 3699648843
Unix time = 1490692443
The UTC time is 
2017
9:14:03

epoch是UTC值,想要UTC值计算DD-MM-YYYY。

1 个答案:

答案 0 :(得分:0)

将您的EPOCH时间(从1970年开始的秒数)转换为单独的标记(日,月,年,小时,分钟,秒),并将其格式转换为字符串。

char str[20];
sprintf(str, "%02d:%02d.%04d", date.day, date.month, date.year);
//Use your formatted date string not

解码库示例

void TM_RTC_GetDateTimeFromUnix(TM_RTC_t* data, uint32_t unix) {
    uint16_t year;      
    data->Unix = unix;          /* Store unix time to unix in struct */
    data->Seconds = unix % 60;  /* Get seconds from unix */
    unix /= 60;                 /* Go to minutes */
    data->Minutes = unix % 60;  /* Get minutes */
    unix /= 60;                 /* Go to hours */
    data->Hours = unix % 24;    /* Get hours */
    unix /= 24;                 /* Go to days */
    data->WeekDay = (unix + 3) % 7 + 1; /* Get week day, monday is first day */

    year = 1970;                /* Process year */
    while (1) {
        if (RTC_LEAP_YEAR(year)) {
            if (unix >= 366) {
                unix -= 366;
            } else {
                break;
            }
        } else if (unix >= 365) {
            unix -= 365;
        } else {
            break;
        }
        year++;
    }
    /* Get year in xx format */
    data->Year = (uint8_t) (year - 2000);
    /* Get month */
    for (data->Month = 0; data->Month < 12; data->Month++) {
        if (RTC_LEAP_YEAR(year)) {
            if (unix >= (uint32_t)RTC_Months[1][data->Month]) {
                unix -= RTC_Months[1][data->Month];
            } else {
                break;
            }
        } else if (unix >= (uint32_t)RTC_Months[0][data->Month]) {
            unix -= RTC_Months[0][data->Month];
        } else {
            break;
        }
    }

    data->Month++;            /* Month starts with 1 */
    data->Day = unix + 1;     /* Date starts with 1 */
}

此处提供更多信息(所有结构和宏):

https://github.com/MaJerle/stm32fxxx_hal_libraries/blob/master/00-STM32_LIBRARIES/tm_stm32_rtc.c

https://github.com/MaJerle/stm32fxxx_hal_libraries/blob/master/00-STM32_LIBRARIES/tm_stm32_rtc.h