chatGPT答: |
8v6.cn |
要获取网络时间,您需要使用Arduino UNO开发板连接到互联网,并使用NTP协议从NTP服务器获取时间。以下是一个基本的代码示例:
```
#include <Ethernet.h>
#include <EthernetUdp.h>
// Enter a MAC address for your controller below.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress timeServer(129,6,15,28); // time.nist.gov NTP server
const int timeZone = -5; // Eastern Standard Time (USA)
EthernetUDP Udp;
void setup() {
Ethernet.begin(mac);
Udp.begin(123);
}
void loop() {
sendNTPpacket(timeServer); // send an NTP packet to the time server
delay(1000);
if (Udp.parsePacket()) {
byte packetBuffer[48];
Udp.read(packetBuffer,sizeof(packetBuffer));
unsigned long secsSince1900;
secsSince1900 = (unsigned long)packetBuffer[40] << 24;
secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
secsSince1900 |= (unsigned long)packetBuffer[43];
unsigned long epochTime = secsSince1900 -220898880;
Serial.print("Unix time: ");
Serial.println(epochTime);
unsigned int hours= ((epochTime %86400L)/36000)%24 + timeZone;
unsigned int minutes= ((epochTime %36000L)/600)%60;
unsigned int seconds= ((epochTime %600L)/10)%60;
Serial.print("Current local time: ");
Serial.print(hours);
Serial.print(":");
if(minutes<10) {
Serial.print("0");
}
Serial.print(minutes);
Serial.print(":");
if(seconds<10) {
Serial.print("0");
}
Serial.println(seconds);
delay(1000); // wait a second before requesting the time again
}
}
void sendNTPpacket(IPAddress& address)
{
byte packetBuffer[48];
memset(packetBuffer, 0, sizeof(packetBuffer));
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
// Eight bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 'I';
packetBuffer[13] = 'C';
packetBuffer[14] = 'H';
packetBuffer[15] = 'E';
Udp.beginPacket(address,123);
Udp.write(packetBuf,sizeof(packetBuf));
Udp.endPacket();
}
```
上述代码使用Ethernet和EthernetUDP库连接到互联网,并从time.nist.gov NTP服务器获取时间。您可以根据需要更改服务器地址和时区。在loop()函数中,代码发送一个NTP数据包并等待响应。如果收到响应,则解析数据包以获取Unix时间戳,并将其转换为本地时间。
请注意,此示例假定您已经将Arduino UNO板连接到以太网网络并正确配置了网络设置。如果您还没有这样做,请参阅Arduino Ethernet Shield或Arduino WiFi Shield的文档以获取更多信息。
|