这个代码是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。
答案 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